基于 LangChain 搭建本地知识库系统
本文介绍了如何利用 LangChain 框架结合检索增强生成(RAG)技术构建本地知识库。内容涵盖 RAG 原理、LangChain 依赖安装、Embedding 模型配置、向量数据库(Chroma)存储与检索流程,以及完整的代码实现示例。通过该方案,可解决大语言模型知识滞后及私有数据安全问题,实现基于最新或私有数据的准确问答。

本文介绍了如何利用 LangChain 框架结合检索增强生成(RAG)技术构建本地知识库。内容涵盖 RAG 原理、LangChain 依赖安装、Embedding 模型配置、向量数据库(Chroma)存储与检索流程,以及完整的代码实现示例。通过该方案,可解决大语言模型知识滞后及私有数据安全问题,实现基于最新或私有数据的准确问答。

RAG(Retrieval-Augmented Generation,检索增强生成)是一种通过检索外部知识库来增强大语言模型(LLM)回答能力的架构。它允许模型在生成回答时参考最新的或私有的数据,从而解决训练数据截止和幻觉问题。
现有的开源大模型通常基于公开网络数据训练,存在以下局限:
RAG 通过将模型与外部知识源连接,确保回答基于准确的事实,降低幻觉概率,并减少频繁微调模型的成本。
安装必要的依赖包:
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
用于将文本转换为向量。以百度千帆为例:
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
import os
def get_embedding():
os.environ["QIANFAN_AK"] = "YOUR_API_KEY"
os.environ["QIANFAN_SK"] = "YOUR_SECRET_KEY"
return QianfanEmbeddingsEndpoint()
支持 Azure OpenAI 或 OpenAI 官方服务。
from langchain_openai import AzureChatOpenAI
def get_llm():
os.environ["AZURE_OPENAI_ENDPOINT"] = "YOUR_ENDPOINT"
os.environ["AZURE_OPENAI_API_KEY"] = "YOUR_KEY"
llm = AzureChatOpenAI(
azure_deployment="gpt-4",
openai_api_version="2023-05-15"
)
return llm
import os
import getpass
from typing import Any
# 导入 LangChain 相关组件
from langchain_community.vectorstores import Chroma
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
from langchain_openai import AzureChatOpenAI
# 1. 初始化 Embedding 模型
def init_embedding():
os.environ["QIANFAN_AK"] = "YOUR_QIANFAN_AK"
os.environ["QIANFAN_SK"] = "YOUR_QIANFAN_SK"
return QianfanEmbeddingsEndpoint()
# 2. 初始化 LLM
def init_llm():
os.environ["AZURE_OPENAI_ENDPOINT"] = "YOUR_ENDPOINT"
os.environ["AZURE_OPENAI_API_KEY"] = "YOUR_KEY"
return AzureChatOpenAI(
azure_deployment="gpt-4",
openai_api_version="2023-05-15"
)
# 3. 加载与处理文档
loader = WebBaseLoader("https://docs.dify.ai/v/zh-hans/getting-started/readme")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splits = splitter.split_documents(docs)
# 4. 创建向量库
vectorstore = Chroma.from_documents(
documents=splits,
collection_name="rag_chroma",
embedding=init_embedding()
)
retriever = vectorstore.as_retriever()
# 5. 构建 Prompt 模板
template = """Answer the question in Chinese based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# 6. 构建 Chain
llm = init_llm()
chain = (
RunnableParallel({"context": retriever, "question": RunnablePassthrough()})
| prompt
| llm
| StrOutputParser()
)
# 7. 定义输入类型
class Question(BaseModel):
__root__: str
chain = chain.with_types(input_type=Question)
# 8. 执行查询
if __name__ == "__main__":
print(chain.invoke("dify 是什么?"))
print(chain.invoke("dify 能干什么?请用列表形式回答"))
print(chain.invoke("dify 可以导入哪些数据?"))
如果使用 langchain serve 命令启动服务:
langchain serve
启动成功后,访问本地 Playground 地址进行交互测试,例如:http://127.0.0.1:8000/dify/playground/。
chunk_size 和 chunk_overlap 需根据 Embedding 模型的 Token 限制调整。过大可能导致信息丢失,过小影响语义连贯性。本文详细演示了如何使用 LangChain 结合 RAG 技术构建本地知识库。通过引入外部检索机制,有效解决了大模型知识滞后和幻觉问题,同时保护了私有数据安全。开发者可根据实际需求替换 Embedding 模型和向量数据库,灵活部署不同场景下的智能问答系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online