# LangChain实战:构建智能问答系统
## 项目简介
LangChain是一个强大的AI应用开发框架,它简化了大语言模型(LLM)应用的开发过程。本文将带你从零开始,使用LangChain构建一个基于企业文档的智能问答系统。
## 技术架构
我们将构建的系统采用RAG(Retrieval Augmented Generation)架构,主要包含以下组件:
1. **文档加载器**: 加载PDF、Word、Markdown等格式的文档
2. **文本分割器**: 将长文档分割成适合处理的小块
3. **向量数据库**: 存储文档的向量表示,支持相似度搜索
4. **LLM**: 基于检索结果生成回答
## 环境准备
首先安装必要的依赖:
```bash
pip install langchain langchain-openai chromadb pypdf
```
## 第一步:文档加载与处理
```python
from langchain.document_loaders import PyPDFLoader, DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载PDF文档
loader = DirectoryLoader("./docs", glob="**/*.pdf", loader_cls=PyPDFLoader)
documents = loader.load()
# 文本分割
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
)
texts = text_splitter.split_documents(documents)
print(f"共分割成 {len(texts)} 个文本块")
```
分割策略很重要,chunk_size决定了每个文本块的大小,chunk_overlap则确保重要信息不会在边界处丢失。
## 第二步:创建向量数据库
```python
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 创建嵌入模型
embeddings = OpenAIEmbeddings()
# 创建向量数据库
vectorstore = Chroma.from_documents(
documents=texts,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 持久化存储
vectorstore.persist()
```
Chroma是一个轻量级的向量数据库,适合开发和小规模部署。对于生产环境,可以考虑使用Pinecone或Weaviate。
## 第三步:构建问答链
```python
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# 自定义提示模板
prompt_template = """基于以下上下文回答问题。如果无法从上下文中找到答案,请说"我无法根据提供的信息回答这个问题"。
上下文:
{context}
问题:{question}
请用中文回答:"""
PROMPT = PromptTemplate(
template=prompt_template,
input_variables=["context", "question"]
)
# 创建LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# 创建问答链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
chain_type_kwargs={"prompt": PROMPT},
return_source_documents=True
)
```
## 第四步:测试问答系统
```python
def ask_question(question):
result = qa_chain({"query": question})
print(f"问题: {question}")
print(f"回答: {result["result"]}")
print("参考来源:")
for doc in result["source_documents"]:
print(f" - {doc.metadata["source"]}")
return result
# 测试
ask_question("公司的请假政策是什么?")
```
## 优化技巧
### 1. 检索优化
- 使用混合检索(关键词+语义)
- 调整返回文档数量k的值
- 添加元数据过滤
### 2. 提示优化
- 根据业务场景定制提示模板
- 添加few-shot示例
- 使用思维链(CoT)提示
### 3. 性能优化
- 使用缓存减少重复查询
- 批量处理文档嵌入
- 考虑使用更快的嵌入模型
## 部署建议
1. **API服务**: 使用FastAPI包装成REST API
2. **前端界面**: 使用Streamlit或Gradio快速构建
3. **监控**: 添加日志记录和性能监控
4. **安全**: 实现用户认证和权限控制
## 总结
通过LangChain,我们可以快速构建功能完整的知识问答系统。RAG架构结合了检索和生成的优势,既能保证回答的准确性,又能提供流畅的自然语言回复。
暂无评论。成为第一个评论的人吧!