ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于RAG与AI Agent构建个人知识库:让大模型拥有专属记忆

基于RAG与AI Agent构建个人知识库:让大模型拥有专属记忆 在日常使用 AI 助手时你是否遇到过这样的困扰当你想让 AI 帮你分析一份公司内部文档、总结一篇专业论文或者基于你的个人笔记生成内容时AI 的回答往往流于表面因为它“不认识”你的专属资料。这背后的核心问题是通用大模型缺乏对特定领域或个人私有信息的“记忆”与“理解”。本文将为你彻底解决这个问题。我们将手把手教你如何利用WorkBuddy和IMA这两个强大的工具为你心爱的 AI 助手无论是 ChatGPT、Claude 还是其他基于 API 的 AI 应用构建一个专属的“私人图书馆”——也就是我们常说的个人知识库。通过这套方案你的 AI 将能“阅读”并“记住”你上传的任何文档、笔记、代码片段并在后续对话中精准调用这些知识实现真正个性化的智能辅助。无论你是开发者、学生还是知识工作者都能通过本教程打造一个专属于你的、永不遗忘的 AI 第二大脑。1. 核心概念什么是 WorkBuddy、IMA 与 RAG 知识库在开始动手之前我们有必要厘清几个核心概念理解它们各自扮演的角色以及如何协同工作。1.1 WorkBuddy你的 AI 工作流自动化平台WorkBuddy是一个新兴的 AI 智能体AI Agent与工作流自动化平台。你可以把它想象成一个功能强大的“AI 调度中心”。它的核心能力在于连接多种 AI 模型支持接入 OpenAI GPT、Claude、国产大模型等多种 AI 服务。构建复杂工作流通过可视化的方式将不同的 AI 能力、工具如网络搜索、代码执行、文件处理和逻辑判断串联起来形成一个自动化的处理流水线。技能Skill扩展用户可以通过创建或安装“技能”来赋予 WorkBuddy 新的能力例如处理特定格式的文档、连接某个数据库或调用某个 API。在我们的方案中WorkBuddy 将作为整个系统的“大脑”和“调度器”负责接收用户问题协调 IMA 知识库进行检索并将检索结果与原始问题一并发送给大模型最终生成回答。1.2 IMA 与 MCP模型上下文协议的“连接器”IMA是近期备受关注的一个概念它通常指代“模型上下文协议”的一种实现或相关工具。MCPModel Context Protocol是由 Anthropic 等公司推动的一个开放协议旨在为标准化的方式为 AI 模型提供动态的、可扩展的上下文信息。简单来说你可以把IMA 看作一个“适配器”或“连接器”功能它允许外部数据源如你的本地文件系统、数据库、Notion、GitHub 等以一种 AI 模型能理解的方式将其内容“暴露”给 AI 助手。作用当 AI 需要回答问题时它可以通过 IMA 这个协议接口实时地去你指定的数据源里查找相关信息而无需在每次对话时都将所有资料作为上下文输入这受限于模型 Token 长度。在我们的架构里IMA 将负责管理你的“私人图书馆”的目录和索引当 WorkBuddy 需要查询知识时就通过 IMA 定义的协议来快速定位相关文档片段。1.3 RAG 知识库让 AI 拥有“长期记忆”的技术RAG是检索增强生成的缩写。它是构建本文所述“私人图书馆”的核心技术范式。检索当用户提出一个问题时系统首先从你的知识库由文档、笔记等构成中搜索与问题最相关的文本片段。增强将这些检索到的相关片段与用户的原始问题组合在一起形成一个新的、信息更丰富的“增强版”提示词。生成将这个增强后的提示词发送给大语言模型让模型基于你提供的专属资料来生成回答。三者关系总结知识库你的文档集合是存储内容的地方。IMA是管理知识库索引和提供访问接口的“图书管理员”。WorkBuddy是接收用户请求、向“图书管理员”问询、并组织最终答案的“总指挥”。RAG是贯穿整个流程的核心技术思想。2. 环境准备与工具选择在开始构建之前我们需要准备好相应的工具和环境。由于 WorkBuddy 和 IMA 生态正在快速发展存在多种使用方式如桌面应用、浏览器扩展、命令行工具等我们将以最通用和可控的本地部署思路为主线进行讲解。2.1 核心工具选择与说明WorkBuddy目标我们需要一个能够执行复杂逻辑、调用工具和 AI 模型的“智能体平台”。选择我们可以使用开源的 AI Agent 框架来模拟 WorkBuddy 的核心调度功能。例如LangChain或Semantic Kernel是构建此类流程的绝佳选择。本文将使用LangChain作为示例因为它生态丰富、文档齐全非常适合演示 RAG 流程。替代方案如果你希望使用图形化界面的 WorkBuddy可以关注其官方发布渠道但本文重点在于原理和可复现的代码实现。IMA / MCP 服务器目标我们需要一个实现了 MCP 协议的服务器来管理我们的本地文件知识库。选择我们可以使用mcp-server-filesystem这是一个官方示例的 MCP 服务器专门用于向 AI 暴露文件系统访问能力。我们将运行这个服务器让它监控我们指定的知识库文件夹。安装这通常是一个需要 Node.js 环境的独立进程。大语言模型目标作为生成答案的“大脑”。选择可以是 OpenAI 的 GPT 系列、Anthropic 的 Claude 系列或任何提供 API 的模型。本地部署的模型如Ollama运行的 Llama、Qwen 等也是很好的选择能保证数据隐私。本文将使用OpenAI GPT-3.5-turbo作为示例。向量数据库目标为了实现高效的知识检索我们需要将文档内容转换为向量嵌入并存储起来以便进行相似度搜索。选择轻量级选择如ChromaDB、FAISS或功能更全面的Weaviate、Qdrant。本文选择ChromaDB因为它简单易用且与 LangChain 集成良好。2.2 开发环境与依赖安装假设我们使用 Python 作为主要开发语言。步骤 1创建项目目录并初始化环境mkdir my_ai_knowledge_base cd my_ai_knowledge_base python -m venv venv # Windows: venv\Scripts\activate # Mac/Linux: source venv/bin/activate步骤 2安装核心 Python 库pip install langchain langchain-openai langchain-community pip install chromadb pypdf python-dotenv # 用于文本分割和嵌入 pip install tiktoken sentence-transformerslangchain: 核心框架。langchain-openai: 用于调用 OpenAI 模型。langchain-community: 包含社区贡献的组件如一些文档加载器。chromadb: 向量数据库。pypdf: 用于读取 PDF 文档。python-dotenv: 管理环境变量如 API 密钥。sentence-transformers: 用于生成文本嵌入如果使用 OpenAI 的嵌入模型则可选。步骤 3准备 IMA/MCP 服务器环境我们需要一个独立的 MCP 服务器进程。这里以mcp-server-filesystem为例# 确保已安装 Node.js (18) # 在一个新的终端窗口或后台进程中运行 npx modelcontextprotocol/server-filesystem /path/to/your/knowledge_base_folder这条命令会启动一个服务器将指定的文件夹通过 MCP 协议暴露出来。记下服务器运行的地址通常是http://localhost:3000。3. 核心原理与架构拆解在编码之前让我们用更技术的视角审视整个系统的工作流程这有助于理解每一段代码的作用。3.1 系统架构图文字描述用户提问 | v [WorkBuddy 代理] (LangChain Agent) | (1. 解析意图决定调用工具) v [知识库检索工具] (通过 MCP Client 调用 IMA 服务器) | (2. 发送查询获取相关文档片段) v [IMA/MCP 服务器] (运行 mcp-server-filesystem) | (3. 在指定文件夹内搜索/检索) v [本地知识库文件夹] (你的 PDF, TXT, MD 文件) | | (4. 返回相关文本片段) v [WorkBuddy 代理] (将检索结果与问题组合) | (5. 构造增强后的 Prompt) v [大语言模型] (如 GPT-3.5) | (6. 生成最终答案) v 返回答案给用户3.2 关键技术点解析文档加载与分割原始文档如 PDF需要被加载并分割成大小适中的“块”Chunks。块太大检索不精准块太小可能丢失上下文。通常使用RecursiveCharacterTextSplitter。文本向量化将每个文本块通过“嵌入模型”转换为一个高维向量。语义相似的文本其向量在空间中的距离也较近。这是实现语义搜索的基础。向量存储与检索将向量及其对应的原始文本存储到向量数据库。检索时将用户问题也向量化并在数据库中查找最相似的 K 个文本块。提示工程设计一个优质的提示词模板告诉模型“请基于以下上下文回答问题。如果上下文不包含答案请说明你不知道。” 这能有效防止模型胡编乱造。Agent 与工具调用使用 LangChain Agent将“知识库检索”定义为一个工具。Agent 根据用户问题自动判断是否需要调用此工具。4. 完整实战构建你的第一个 AI 知识库现在让我们从零开始用代码实现整个流程。我们将创建一个简单的命令行应用来演示。4.1 项目结构初始化my_ai_knowledge_base/ ├── .env # 存储 API KEY 等敏感信息 ├── knowledge_base/ # 你的知识库文件夹存放 PDF、TXT 等文件 │ ├── project_doc.pdf │ └── meeting_notes.txt ├── chroma_db/ # Chroma 向量数据库持久化目录自动生成 ├── mcp_server.py # 启动 MCP 服务器的脚本可选简化流程 ├── build_knowledge_base.py # 构建向量数据库的脚本 ├── query_agent.py # 主程序查询代理 └── requirements.txt # 项目依赖4.2 配置环境变量在.env文件中填入你的 OpenAI API KeyOPENAI_API_KEYsk-your-openai-api-key-here # 如果使用其他模型例如 Azure OpenAI 或本地模型需配置对应的变量4.3 构建向量知识库 (build_knowledge_base.py)这个脚本负责读取你的文档处理并存入向量数据库。只需在初次或文档更新时运行。# build_knowledge_base.py import os from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma from dotenv import load_dotenv # 加载环境变量 load_dotenv() # 1. 配置文档加载 knowledge_base_path ./knowledge_base loader DirectoryLoader( knowledge_base_path, glob**/*.pdf, # 加载所有 PDF 文件 loader_clsPyPDFLoader, show_progressTrue ) # 可以添加更多加载器例如针对 txt 文件 txt_loader DirectoryLoader( knowledge_base_path, glob**/*.txt, loader_clsTextLoader, show_progressTrue ) documents [] if os.path.exists(knowledge_base_path): documents loader.load() txt_loader.load() print(f成功加载 {len(documents)} 个文档。) else: print(f知识库目录 {knowledge_base_path} 不存在请创建并放入文档。) exit(1) # 2. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个块约1000字符 chunk_overlap200, # 块之间重叠200字符保持上下文连贯 separators[\n\n, \n, 。, , , , , , ] ) chunks text_splitter.split_documents(documents) print(f将文档分割成 {len(chunks)} 个文本块。) # 3. 生成嵌入并存储到向量数据库 embeddings OpenAIEmbeddings(modeltext-embedding-3-small) # 使用 OpenAI 嵌入模型 # 注意此步骤会消耗 OpenAI API 额度。对于大量文档可考虑使用免费/本地嵌入模型。 persist_directory ./chroma_db vectordb Chroma.from_documents( documentschunks, embeddingembeddings, persist_directorypersist_directory ) vectordb.persist() # 持久化到磁盘 print(f向量数据库已构建并保存至 {persist_directory})运行此脚本python build_knowledge_base.py确保你的knowledge_base文件夹下已有一些文档如 PDF 或 TXT。程序会打印加载和分割的进度。4.4 创建查询代理 (query_agent.py)这是核心交互脚本它集成了检索、Agent 决策和回答生成。# query_agent.py import os from langchain_openai import ChatOpenAI from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings from langchain.agents import Tool, AgentExecutor, create_react_agent from langchain_core.prompts import PromptTemplate from langchain import hub # 用于拉取预定义的 Agent 提示词 from dotenv import load_dotenv load_dotenv() # 1. 加载已构建的向量数据库 persist_directory ./chroma_db embeddings OpenAIEmbeddings(modeltext-embedding-3-small) vectordb Chroma(persist_directorypersist_directory, embedding_functionembeddings) # 2. 将向量数据库包装成一个“检索工具” def knowledge_base_search(query: str) - str: 在知识库中搜索与问题相关的文档片段。 docs vectordb.similarity_search(query, k3) # 检索最相似的3个片段 content \n\n.join([doc.page_content for doc in docs]) return f从知识库中检索到以下相关信息\n\n{content} knowledge_tool Tool( nameKnowledgeBaseSearch, funcknowledge_base_search, description当用户的问题涉及公司项目、个人笔记、特定领域知识时使用此工具在私人知识库中查找相关信息。输入应为清晰的问题或关键词。 ) # 3. 初始化大语言模型 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 4. 定义 Agent 使用的工具列表 tools [knowledge_tool] # 可以从 LangChain Hub 拉取一个适合 ReAct 框架的提示词 prompt hub.pull(hwchase17/react-chat) # 或者自定义提示词 # prompt PromptTemplate.from_template(...) # 5. 创建 ReAct Agent agent create_react_agent(llm, tools, prompt) # 6. 创建执行器 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 7. 交互循环 print( 你的 AI 知识库助手已启动 ) print(输入你的问题输入 quit 或 exit 退出) while True: user_input input(\n你: ) if user_input.lower() in [quit, exit, q]: print(再见) break if user_input.strip() : continue try: # 执行 Agent result agent_executor.invoke({input: user_input, chat_history: []}) print(f\n助手: {result[output]}) except Exception as e: print(f处理时出现错误: {e})4.5 运行与验证确保向量库已构建如果你还没运行build_knowledge_base.py请先运行它。启动查询代理python query_agent.py进行测试向knowledge_base文件夹放入一份关于“Python 装饰器”的笔记decorator_notes.txt。运行构建脚本更新向量库。启动query_agent.py询问“请解释一下 Python 装饰器的工作原理。”观察 Agent 的思考过程verboseTrue会打印出来。它会先决定调用KnowledgeBaseSearch工具检索到你的笔记内容然后结合这些内容生成回答。预期效果AI 的回答应该会引用你笔记中的具体定义和例子而不是仅仅给出通用的网络解释。5. 进阶集成连接 IMA/MCP 服务器实现动态查询上面的例子将知识库“固化”在了向量数据库中。接下来我们模拟如何集成一个 IMA/MCP 服务器实现更动态的文件查询。这里我们简化实现创建一个模拟 MCP 客户端的工具。5.1 创建模拟 MCP 客户端工具假设我们的 MCP 文件服务器已在http://localhost:3000运行。我们将创建一个直接调用该服务器搜索接口的工具。# mcp_tool.py (可集成到 query_agent.py 中) import requests import json class MCPFileSearchTool: name MCPFileSearch description 通过 MCP 服务器在指定的知识库文件夹中进行实时文件内容搜索。适用于查找最新的、未导入向量库的文档。 def __init__(self, mcp_server_urlhttp://localhost:3000): self.server_url mcp_server_url def _call_mcp_server(self, query: str) - str: 模拟调用 MCP 服务器的搜索功能。 # 注意实际的 MCP 协议调用更复杂涉及 JSON-RPC 和特定资源、工具调用。 # 此处为简化示例假设服务器有一个 /search 端点。 try: # 这是一个示例请求实际 API 需参考 mcp-server-filesystem 文档 payload {jsonrpc: 2.0, method: search, params: {query: query}, id: 1} response requests.post(f{self.server_url}/rpc, jsonpayload, timeout10) response.raise_for_status() result response.json() # 解析结果... return result.get(result, 未找到相关信息。) except requests.exceptions.ConnectionError: return 错误无法连接到 MCP 服务器。请确保 mcp-server-filesystem 正在运行。 except Exception as e: return f调用 MCP 服务器时出错{str(e)} def run(self, query: str) - str: return self._call_mcp_server(query) # 在 query_agent.py 中可以将此工具添加到 tools 列表中 # mcp_tool MCPFileSearchTool() # tools [knowledge_tool, Tool(namemcp_tool.name, funcmcp_tool.run, descriptionmcp_tool.description)]这个工具允许 Agent 在需要查询最新、未编入向量索引的文件时通过 MCP 协议进行实时查找。在实际应用中你需要根据mcp-server-filesystem提供的具体 API 来实现_call_mcp_server方法。6. 常见问题与排查思路在搭建和使用过程中你可能会遇到以下问题问题现象可能原因排查与解决思路运行build_knowledge_base.py时报错No module named langchain_community依赖未正确安装。1. 确认虚拟环境已激活。2. 运行pip install -r requirements.txt或重新安装指定包。构建向量数据库时 OpenAI API 报错如认证失败、额度不足OPENAI_API_KEY未设置或无效API 额度用完。1. 检查.env文件格式和路径是否正确。2. 在代码中打印os.getenv(‘OPENAI_API_KEY’)前几位确认已加载。3. 登录 OpenAI 平台检查额度。考虑换用本地嵌入模型如sentence-transformers。Agent 回答“我不知道”即使知识库中有相关内容。1. 检索到的文本块不相关。2. 提示词未正确引导模型使用上下文。3. 相似度阈值问题。1.检查检索结果在knowledge_base_search函数中打印docs内容看是否匹配问题。2.调整文本分割尝试不同的chunk_size和chunk_overlap。3.优化提示词确保 Agent 的提示词明确要求“基于检索到的上下文回答”。4.调整检索数量增加similarity_search的k值例如从3到5。程序运行缓慢尤其是构建向量库时。1. 文档太大或太多。2. 使用 OpenAI 嵌入模型网络请求耗时。1.预处理文档拆分大文件过滤无关内容。2.使用本地嵌入模型将OpenAIEmbeddings替换为HuggingFaceEmbeddings例如model_name“all-MiniLM-L6-v2”。想接入更多类型的文档如 Word, PPT, 网页。LangChain 默认加载器不支持。安装额外的文档加载器如pip install unstructured并使用UnstructuredFileLoader。如何更新知识库直接向文件夹添加文件后旧向量库不会自动更新。1.简单重建删除chroma_db文件夹重新运行构建脚本。2.增量更新使用vectordb.add_documents(new_chunks)但需注意去重逻辑对于复杂更新重建更稳妥。7. 最佳实践与工程建议将个人知识库投入日常使用或小型生产环境需要考虑更多工程化因素。7.1 知识库内容管理结构化存储在knowledge_base文件夹下建立子目录如/技术文档、/会议纪要、/个人笔记便于管理。文档预处理上传前尽量使用纯文本格式.txt,.md。对于 PDF/Word可考虑先用工具提取纯净文本并格式化。元数据标注在分割文档时为每个文本块保留来源文件、页码等元数据。LangChain 的Document对象有metadata字段可用于此目的方便追溯答案来源。7.2 系统性能与优化嵌入模型选择追求效果和方便使用 OpenAItext-embedding-3-small。追求零成本与隐私使用sentence-transformers本地模型如all-MiniLM-L6-v2。追求多语言考虑paraphrase-multilingual-MiniLM-L12-v2。检索策略优化混合搜索结合向量相似性搜索和关键词搜索如 BM25提高召回率。Chroma 和 Weaviate 支持此功能。重排序先检索出较多候选片段如20个再用一个更精细的模型对它们进行重排序选取最相关的几个提升精度。缓存机制对于常见问题可以将问答对缓存起来避免重复检索和调用大模型节省成本和时间。7.3 提示词工程与回答质量明确指令在 Agent 或链的提示词中必须包含“如果上下文未提供足够信息请直接说明你不知道不要编造信息”。引用来源要求模型在回答中注明依据来自哪个文档的哪个部分例如“根据《XX项目计划书》第3页所述...”。这需要你在上下文中提供元数据。分步思考对于复杂问题可以设计提示词让模型先拆解问题再针对子问题分别检索最后综合回答。7.4 安全与隐私考量敏感信息处理切勿将包含密码、密钥、个人身份信息等敏感数据的文档放入知识库。如需处理应在预处理阶段进行脱敏。API 调用安全如果使用云端模型确保 API Key 通过环境变量管理不要硬编码在代码中。对于商业敏感信息优先考虑使用本地部署的大模型如通过 Ollama 运行 Llama 3。访问控制本示例是单机脚本。如果你将其部署为 Web 服务必须实施用户认证和授权确保只有授权用户能访问特定的知识库和问答功能。通过以上步骤你已经成功搭建了一个具备“私人图书馆”能力的 AI 助手原型。从核心的 RAG 原理到使用 LangChain 实现向量检索再到通过 Agent 框架集成检索工具这套组合拳为你提供了高度的灵活性和扩展性。你可以在此基础上替换不同的组件向量数据库、大模型、前端界面将其集成到你的笔记软件、团队知识库或任何需要智能问答的场景中。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进