使用 LangChain 构建本地知识库应用

发布于:2025-07-29 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、引言

在本地化AI部署需求激增的背景下,LangChain框架结合Ollama运行环境,为企业提供了安全可控的私有知识库解决方案。本文将基于徐州工业职业技术学院的实际案例,深入解析从文档处理到智能问答的全流程实现,并扩展以下高级功能:

  • 多格式文档统一处理
  • 混合检索策略优化
  • 生产环境性能调优
  • 领域自适应增强

二、基础概念

2.1 什么是 LangChain

LangChain 是一个大语言模型(LLM)编程框架,其目的是简化基于大语言模型的应用开发,统一不同大模型的调用方式,开发者无需关心底层 API 差异。

2.2 什么是 Ollama

Ollama 是一个开源的本地大语言模型运行框架,其目的是简化在本地设备上部署和运行大型语言模型的流程。它通过容器化管理和标准化接口,让用户能够快速、便捷地使用如 Qwen、Deepseek 等主流模型,无需复杂配置。

三、环境深度配置

3.1 Ollama模型服务优化

# 部署多模型服务(示例)
ollama serve --models qwen2.5:7b,nomic-embed-text
 
# 配置GPU加速(需NVIDIA显卡)
ollama run qwen2.5:7b --gpu-layer 20

3.2 LangChain扩展安装

# 增强型文档处理
pip install langchain-unstructured

# 混合检索支持
pip install langchain-hybrid

# 生产级监控
pip install langchain-prometheus

四、企业级文档处理流程

4.1 多格式文档统一加载

from langchain.document_loaders import (
    DirectoryLoader,
    PDFPlumberLoader,
    UnstructuredJSONLoader
)

def load_documents(path: str) -> List[Document]:
    loaders = {
        ".jsonl": UnstructuredJSONLoader,
        ".pdf": PDFPlumberLoader,
        ".txt": TextLoader
    }
    
    loader = DirectoryLoader(
        path,
        glob="**/*",
        loader_mapping=loaders,
        use_multithreading=True
    )
    return loader.load()

4.2 智能文本分割策略

from langchain.text_splitter import (
    RecursiveCharacterTextSplitter,
    MarkdownHeaderTextSplitter
)

# 混合分割策略
splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=50,
    separators=["\n\n", "\n", " ", "", "。", "?", "!"]
)

# 保留Markdown结构的分割
md_splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on=["##", "###"]
)

def smart_split(docs):
    return md_splitter.split_documents(splitter.split_documents(docs))

五、增强型检索系统

5.1 混合检索引擎配置

from langchain.retrievers import (
    ChromaVectorStoreRetriever,
    BM25Retriever
)
from langchain.hybrid import HybridRetriever

# 初始化检索器
vector_retriever = ChromaVectorStoreRetriever(
    vectorstore=db,
    search_kwargs={"k": 5}
)

bm25_retriever = BM25Retriever(
    index_name="articles",
    top_k=3
)

# 混合检索配置
hybrid_retriever = HybridRetriever(
    retrievers=[vector_retriever, bm25_retriever],
    weights=[0.7, 0.3],
    merge_strategy="concat"
)

5.2 领域自适应优化

from langchain.callbacks import TritonCallback

# 配置领域特定提示
domain_prompt = """你是高等教育领域的智能助手,
需要基于提供的院校新闻文档进行回答,
特别注意以下领域术语:
- 双高计划
- 产教融合
- 现代学徒制
"""

# 创建自适应链
adaptive_chain = (
    {"context": hybrid_retriever, "question": RunnablePassthrough()}
    | ChatPromptTemplate.from_template(domain_prompt + "{context}\n问题:{question}")
    | model
    | StrOutputParser()
)

六、生产级优化方案

6.1 性能调优参数

# 向量化配置优化
embeddings = OllamaEmbeddings(
    model="nomic-embed-text",
    api_kwargs={
        "request_timeout": 60,
        "max_tokens": 512
    }
)

# 检索器缓存配置
retriever = ChromaVectorStoreRetriever(
    vectorstore=db,
    search_type="similarity",
    search_kwargs={
        "k": 5,
        "filter": {"date": {"$gte": "2024-01-01"}}
    },
    cache=LRUCache(max_size=100)
)

6.2 监控体系构建

from langchain.prometheus import (
    PrometheusMonitor,
    LatencyCounter,
    TokenCounter
)

# 初始化监控
monitor = PrometheusMonitor(
    metrics=[
        LatencyCounter("llm_latency", "LLM请求延迟"),
        TokenCounter("llm_tokens", "LLM令牌使用量")
    ]
)

# 集成到处理链
chain = (
    monitor.track(adaptive_chain)
    | StrOutputParser()
)

七、完整项目示例

# enterprise_kb.py
from langchain_ollama.llms import OllamaLLM
from langchain_ollama.embeddings import OllamaEmbeddings
from langchain.prometheus import PrometheusMonitor
from langchain.hybrid import HybridRetriever
import asyncio

async def main():
    # 初始化组件
    model = OllamaLLM(model="qwen2.5:7b", api_kwargs={"request_timeout": 60})
    embeddings = OllamaEmbeddings(model="nomic-embed-text")
    db = Chroma(embedding_function=embeddings, persist_directory='./embeddings')
    
    # 配置混合检索
    vector_retriever = db.as_retriever(search_kwargs={"k": 5})
    bm25_retriever = BM25Retriever(index_name="articles", top_k=3)
    hybrid_retriever = HybridRetriever([vector_retriever, bm25_retriever], [0.7, 0.3])
    
    # 构建监控链
    monitor = PrometheusMonitor()
    chain = monitor.track(
        (
            {"context": hybrid_retriever, "question": RunnablePassthrough()}
            | ChatPromptTemplate.from_template(
                "你是徐州工业职业技术学院的专业助手,基于最新文档回答:\n{context}\n问题:{question}"
              )
            | model
            | StrOutputParser()
        )
    )
    
    # 启动服务
    while True:
        question = input("用户: ")
        if question.lower() in ["exit", "quit"]:
            break
        response = await chain.acall(question)
        print(f"AI: {response}")

if __name__ == "__main__":
    asyncio.run(main())

八、部署与运维指南

8.1 Docker化部署

FROM ollama/ollama:latest

# 安装依赖
RUN pip install langchain langchain-ollama langchain-chroma prometheus-client

# 复制代码
COPY enterprise_kb.py /app/
COPY documents /app/documents

# 暴露端口
EXPOSE 8000

# 启动命令
CMD ["python", "/app/enterprise_kb.py"]

8.2 资源监控配置

# prometheus.yml
metrics:
 1. name: llm_latency
    help: "LLM请求延迟"
    type: HISTOGRAM
    buckets: [0.1, 0.5, 1, 2, 5]
  
 2. name: llm_tokens
    help: "LLM令牌使用量"
    type: COUNTER

九、总结

通过LangChain与Ollama的深度集成,可构建满足企业需求的本地知识库系统:

  1. 安全可控:数据全程本地化处理
  2. 灵活扩展:支持多格式文档和混合检索
  3. 生产就绪:集成监控与性能优化
  4. 领域自适应:通过提示工程实现垂直领域优化

网站公告

今日签到

点亮在社区的每一天
去签到