Jupyter AI

基于LangChain开发个人知识库

📅 发表日期: 2024年12月2日

分类: 📰AI 最新技术

👁️阅读: --

开发一个基于 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 查询文档索引

利用 LangChainRetrievalQA 模块,结合向量数据库和 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

测试接口

  1. 上传文档:

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

    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 的知识库管理系统,既支持文档的动态更新,又能通过自然语言高效查询内容,非常适合你的需求!

📰AI 最新技术 (滚动鼠标查看)