开发一个基于 LangChain
的 AI 知识库系统是一个非常强大的解决方案,能够帮助你组织、搜索和交互式地利用你的文档数据。
以下是详细的步骤、代码和说明。
步骤详解 1. 环境准备 首先,确保安装以下必要的依赖项:
1 pip install langchain openai chromadb llama-index python-dotenv flask
LangChain:用于构建智能语言处理链。
ChromaDB:用于存储和查询文档向量化索引。
LlamaIndex:用于文档分割和索引构建。
Flask:用于搭建 Web API。
python-dotenv:用于管理环境变量。
2. 准备工作
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, PyPDFLoaderfrom langchain.text_splitter import CharacterTextSplitterfrom langchain.vectorstores import Chromafrom langchain.embeddings import OpenAIEmbeddingsdef 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 查询文档索引 利用 LangChain
的 RetrievalQA
模块,结合向量数据库和 OpenAI 模型,生成对用户查询的响应。
1 2 3 4 5 6 7 8 9 10 11 12 13 from langchain.chains import RetrievalQAfrom langchain.llms import OpenAIdef 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, jsonifyapp = 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 curl -X POST -F "file=@documents/example1.txt" http://127.0.0.1:8000/upload
查询知识库:
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。
容器化:使用 Docker 创建容器。
反向代理:使用 Nginx 提供 HTTPS 支持。
监控与日志:通过 ELK 堆栈监控系统运行状态。
这是一个完整的基于 LangChain 的知识库管理系统,既支持文档的动态更新,又能通过自然语言高效查询内容,非常适合你的需求!