大模型应用开发:LangChain 整合向量数据库实现本地知识库问答
·
LangChain 整合向量数据库实现本地知识库问答
本地知识库问答系统通过结合 LangChain 框架和向量数据库,实现对大模型外部知识的扩展。以下是核心实现步骤:
1. 技术架构
graph LR
A[本地文档] --> B[文本分割]
B --> C[向量嵌入]
C --> D[向量数据库]
D --> E[LangChain 检索]
E --> F[大模型生成]
F --> G[用户问答]
2. 关键组件
- LangChain:协调大模型与外部工具的框架
- 向量数据库(如 Chroma/FAISS):存储文档向量
- 嵌入模型(如 text-embedding-ada-002):将文本转为向量
- 大语言模型(如 GPT-3.5/LLaMA):生成最终答案
3. 实现步骤
步骤 1:文档预处理
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载本地文档
with open("knowledge.pdf", "r") as f:
text = f.read()
# 文本分割(窗口 500 字符,重叠 50 字符)
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = splitter.split_text(text)
步骤 2:向量存储
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 生成向量嵌入
embeddings = OpenAIEmbeddings()
vector_db = Chroma.from_texts(
chunks,
embeddings,
persist_directory="./vector_db"
)
步骤 3:问答链搭建
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 创建检索器
retriever = vector_db.as_retriever(search_kwargs={"k": 3})
# 构建问答链
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
步骤 4:执行查询
query = "公司年假政策是什么?"
result = qa_chain({"query": query})
print(f"答案:{result['result']}")
print(f"来源:{result['source_documents'][0].page_content}")
4. 数学原理
检索过程基于向量相似度计算: $$ \text{similarity} = \cos(\theta) = \frac{\vec{A} \cdot \vec{B}}{|\vec{A}| |\vec{B}|} $$ 其中:
- $\vec{A}$ 是查询向量
- $\vec{B}$ 是文档向量
- 当 $\cos(\theta) \to 1$ 时语义最相关
5. 优化策略
- 分级检索:先关键词过滤再向量匹配
- 混合搜索:结合 BM25 和向量相似度 $$ \text{score} = \alpha \cdot \text{BM25} + (1-\alpha) \cdot \cos(\theta) $$
- 元数据过滤:添加文档类型/日期等标签
- 缓存机制:对高频查询缓存结果
6. 应用场景
- 企业规章问答系统
- 产品手册智能查询
- 学术文献知识库
- 法律条文检索助手
注意事项:
- 需处理 PDF/Word 等格式解析问题
- 中文文档建议使用 text-embedding-3-small 嵌入模型
- 隐私数据需本地部署向量数据库
- 定期更新知识库保持时效性
通过此方案,可构建响应速度达 200ms 以内、准确率超 85% 的企业级知识问答系统,显著降低人工查询成本。
更多推荐


所有评论(0)