基于 LangChain 搭建本地知识库系统
什么是 RAG
RAG(Retrieval-Augmented Generation,检索增强生成)是一种通过检索外部知识来增强大语言模型(LLM)生成能力的技术。它允许模型在回答时参考最新的、私有的或特定领域的数据,从而解决传统 LLM 训练数据滞后和无法访问私有信息的问题。
LLM 现存的痛点
现有的通用大模型主要基于公开网络数据进行训练,存在以下局限性:
- 知识时效性:模型无法知晓训练截止日期之后的最新信息。
- 私有数据缺失:企业内部的私有数据(如文档、数据库)通常不对外公开,模型无法直接获取。
- 幻觉问题:当面对未知问题时,模型可能会编造答案(Hallucination),缺乏事实依据。
RAG 通过将模型建立在外部可验证的知识库之上,有效减少了幻觉风险,并降低了频繁微调模型的成本。
LangChain 简介
LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它提供了构建复杂 AI 应用的工具链,主要能力包括:
- 上下文感知:将语言模型与提示词、示例及响应内容联系起来。
- 推理能力:利用语言模型进行逻辑推理,决定如何根据上下文回答问题或采取行动。
环境安装
首先,需要安装 LangChain 及其相关依赖包:
pip install langchain
pip install langchain-community
pip install langchain-core
pip install langchain-experimental
pip install "langserve[all]"
pip install langchain-cli
pip install langsmith
实现知识库流程
1. 配置模型服务
本文使用 Azure OpenAI 作为 LLM 服务,百度千帆作为 Embedding 模型。请根据实际情况修改密钥。
Azure OpenAI 配置
import os
os.environ["AZURE_OPENAI_ENDPOINT"] = "your_endpoint"
os.environ["AZURE_OPENAI_API_KEY"] = "your_api_key"
Embedding 模型配置
import os
os.environ["QIANFAN_AK"] = "your_ak"
os.environ["QIANFAN_SK"] = "your_sk"
2. 核心代码实现
以下是完整的知识库构建流程,包含文档加载、切片、向量化、检索及问答链的构建。
# 导入必要的依赖包
from langchain_community.vectorstores import Chroma
from langchain_core.output_parsers StrOutputParser
langchain_core.prompts ChatPromptTemplate
langchain_core.pydantic_v1 BaseModel
langchain_core.runnables RunnableParallel, RunnablePassthrough
langchain.text_splitter RecursiveCharacterTextSplitter
langchain_community.document_loaders WebBaseLoader
langchain_community.embeddings QianfanEmbeddingsEndpoint
langchain_openai AzureChatOpenAI
os
():
os.environ[] =
os.environ[] =
QianfanEmbeddingsEndpoint()
() -> AzureChatOpenAI:
os.environ[] =
os.environ[] =
AzureChatOpenAI(
azure_deployment=,
openai_api_version=
)
raw_documents = WebBaseLoader().load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=, chunk_overlap=)
all_splits = text_splitter.split_documents(raw_documents)
vectorstore = Chroma.from_documents(
documents=all_splits,
collection_name=,
embedding=embed_qianfan(),
)
retriever = vectorstore.as_retriever()
template =
prompt = ChatPromptTemplate.from_template(template)
model = openai_llm()
chain = (
RunnableParallel({: retriever, : RunnablePassthrough()})
| prompt
| model
| StrOutputParser()
)
():
__root__:
chain = chain.with_types(input_type=Question)
(chain.invoke())
(chain.invoke())
(chain.invoke())
(chain.invoke())


