基于LangChain开发个人知识库
开发一个基于 LangChain
的 AI 知识库系统是一个非常强大的解决方案,能够帮助你组织、搜索和交互式地利用你的文档数据。
以下是详细的步骤、代码和说明。
步骤详解
1. 环境准备
首先,确保安装以下必要的依赖项:
pip install langchain openai chromadb llama-index python-dotenv flask
- LangChain:用于构建智能语言处理链。
- ChromaDB:用于存储和查询文档向量化索引。
- LlamaIndex:用于文档分割和索引构建。
- Flask:用于搭建 Web API。
- python-dotenv:用于管理环境变量。
2. 准备工作
-
获取 OpenAI API 密钥,并将其存储在
.env
文件中:OPENAI_API_KEY=your_openai_api_key
-
创建一个项目目录结构:
knowledge-base/ ├── app.py # Flask 应用主程序 ├── documents/ # 存放文档的目录 │ ├── example1.txt │ └── example2.pdf ├── requirements.txt # 依赖清单 ├── .env # 环境变量文件
3. 代码实现
3.1 加载文档
支持多种文档格式,如 TXT 和 PDF。可以通过 LangChain 的 DocumentLoader
组件加载文档并进行预处理。
from langchain.document_loaders import TextLoader, PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
def load_documents(folder_path):
"""加载指定文件夹中的文档"""
import os
loaders = []
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if filename.endswith(".txt"):
loaders.append(TextLoader(file_path))
elif filename.endswith(".pdf"):
loaders.append(PyPDFLoader(file_path))
documents = []
for loader in loaders:
documents.extend(loader.load())
return documents
3.2 创建文档索引
将文档分割成小块,然后生成向量索引以便快速检索。
def create_vectorstore(documents):
"""将文档转换为向量存储"""
# 文本分割器
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
docs = text_splitter.split_documents(documents)
# 向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(docs, embeddings)
return vectorstore
3.3 查询文档索引
利用 LangChain
的 RetrievalQA
模块,结合向量数据库和 OpenAI 模型,生成对用户查询的响应。
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
def build_retrieval_chain(vectorstore):
"""构建基于检索的问答链"""
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 3})
llm = OpenAI(temperature=0.5)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
chain_type="stuff"
)
return qa_chain
3.4 搭建 Flask API
实现一个 REST API,让用户可以上传文档并执行查询。
from flask import Flask, request, jsonify
app = Flask(__name__)
# 初始化
documents = load_documents("documents/")
vectorstore = create_vectorstore(documents)
qa_chain = build_retrieval_chain(vectorstore)
@app.route("/query", methods=["POST"])
def query_knowledge_base():
"""处理用户查询"""
query = request.json.get("query")
if not query:
return jsonify({"error": "请提供查询内容"}), 400
response = qa_chain.run(query)
return jsonify({"response": response})
@app.route("/upload", methods=["POST"])
def upload_document():
"""上传新文档"""
file = request.files.get("file")
if not file:
return jsonify({"error": "请上传文档"}), 400
# 保存文件
filepath = f"documents/{file.filename}"
file.save(filepath)
# 重新加载和更新索引
new_docs = load_documents("documents/")
global vectorstore, qa_chain
vectorstore = create_vectorstore(new_docs)
qa_chain = build_retrieval_chain(vectorstore)
return jsonify({"message": f"文档 {file.filename} 上传成功,并已更新知识库!"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
4. 运行和测试
启动服务
在项目目录下运行 Flask 应用:
python app.py
测试接口
-
上传文档:
curl -X POST -F "file=@documents/example1.txt" http://127.0.0.1:8000/upload
-
查询知识库:
curl -X POST http://127.0.0.1:8000/query \ -H "Content-Type: application/json" \ -d '{"query": "这篇文档的主要内容是什么?"}'
5. 功能扩展
- 多语言支持:集成 LangChain 的 Prompt 模板,支持根据用户需求调整回答语言。
- 语义搜索优化:切换向量数据库为 Pinecone 或 FAISS。
- Web 前端:使用 Streamlit 或 Vue.js 创建用户友好的界面。
- 权限管理:为上传和查询功能添加用户身份认证。
6. 部署到云
将此系统部署到云服务器,例如 AWS 或 GCP。
- 容器化:使用 Docker 创建容器。
- 反向代理:使用 Nginx 提供 HTTPS 支持。
- 监控与日志:通过 ELK 堆栈监控系统运行状态。
这是一个完整的基于 LangChain 的知识库管理系统,既支持文档的动态更新,又能通过自然语言高效查询内容,非常适合你的需求!