基于LangChain开发个人知识库

开发一个基于 LangChain 的 AI 知识库系统是一个非常强大的解决方案,能够帮助你组织、搜索和交互式地利用你的文档数据。

以下是详细的步骤、代码和说明。

步骤详解

1. 环境准备

首先,确保安装以下必要的依赖项:

1
pip install langchain openai chromadb llama-index python-dotenv flask
  • LangChain:用于构建智能语言处理链。
  • ChromaDB:用于存储和查询文档向量化索引。
  • LlamaIndex:用于文档分割和索引构建。
  • Flask:用于搭建 Web API。
  • python-dotenv:用于管理环境变量。

2. 准备工作

  • 获取 OpenAI API 密钥,并将其存储在 .env 文件中:

    1
    OPENAI_API_KEY=your_openai_api_key
  • 创建一个项目目录结构:

    1
    2
    3
    4
    5
    6
    7
    knowledge-base/
    ├── app.py # Flask 应用主程序
    ├── documents/ # 存放文档的目录
    │ ├── example1.txt
    │ └── example2.pdf
    ├── requirements.txt # 依赖清单
    ├── .env # 环境变量文件

3. 代码实现

3.1 加载文档

支持多种文档格式,如 TXT 和 PDF。可以通过 LangChain 的 DocumentLoader 组件加载文档并进行预处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 创建文档索引

将文档分割成小块,然后生成向量索引以便快速检索。

1
2
3
4
5
6
7
8
9
10
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 查询文档索引

利用 LangChainRetrievalQA 模块,结合向量数据库和 OpenAI 模型,生成对用户查询的响应。

1
2
3
4
5
6
7
8
9
10
11
12
13
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,让用户可以上传文档并执行查询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 应用:

1
python app.py

测试接口

  1. 上传文档:

    1
    curl -X POST -F "file=@documents/example1.txt" http://127.0.0.1:8000/upload
  2. 查询知识库:

    1
    2
    3
    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。

  1. 容器化:使用 Docker 创建容器。
  2. 反向代理:使用 Nginx 提供 HTTPS 支持。
  3. 监控与日志:通过 ELK 堆栈监控系统运行状态。

这是一个完整的基于 LangChain 的知识库管理系统,既支持文档的动态更新,又能通过自然语言高效查询内容,非常适合你的需求!

基于LangChain开发个人知识库

https://zglg.work/ai-news/p202412021/

作者

AI免费学习网(郭震)

发布于

2024-12-02

更新于

2024-12-03

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论