尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从零搭建企业级AI Agent:LangChain+RAG+LangGraph+MCP实战指南

从零搭建企业级AI Agent:LangChain+RAG+LangGraph+MCP实战指南 这类教程最值得先看的不是它覆盖了多少个技术名词而是能不能帮你把“AI Agent”、“RAG”、“MCP”这些听起来很厉害的概念落地成一个你能跑起来、能改代码、能解决实际问题的项目。如果你刚接触这个领域面对一堆框架和术语感到无从下手或者已经看过一些零散教程但串不起来那么这篇文章就是为你准备的。我会把重点放在“如何从零开始把一个企业级AI Agent项目的骨架搭起来”而不是罗列每个工具的所有功能。整个过程会围绕一个核心目标让你能亲手构建一个具备长期记忆、能调用外部工具、并能处理私有知识库的智能体。我们会用到LangChain作为编排框架用LangGraph来设计复杂的工作流用RAG来接入你的私有数据并用MCP协议来扩展工具能力。下面我会按照实际开发的顺序从环境搭建到核心模块实现再到项目实战一步步拆解。1. 环境准备与项目初始化别在第一步就卡住开始写代码之前先把环境理顺。很多教程跳过了这部分导致新手在依赖安装和版本冲突上浪费大量时间。1.1 明确技术栈与版本选择当前以2024年下半年为参考AI Agent领域的技术栈迭代很快盲目追求最新版本可能遇到兼容性问题。我建议选择一个经过社区验证的相对稳定的组合作为起点Python: 3.10 或 3.11。3.12对某些库的兼容性可能仍需观察新手建议先用3.11。核心框架:LangChain: 当前生态最主流的AI应用编排框架。我们用它来连接大模型、管理提示词、串联工具和记忆。LangGraph: LangChain官方出品用于构建有状态、多步骤的智能体工作流。它比基础的AgentExecutor更能处理复杂的循环和分支逻辑。向量数据库与检索RAG核心: 对于本地学习和开发ChromaDB是入门首选因为它轻量、无需外部服务、且与LangChain集成极好。生产环境可以考虑Qdrant、Weaviate或Pinecone。大模型接入: 我们将使用OpenAI API(GPT-4o或GPT-3.5-Turbo) 作为示例因为它最稳定、文档最全。你也可以替换为通义千问、DeepSeek等国内模型的API原理相通。工具扩展协议MCP:Model Context Protocol (MCP)是一个新兴标准旨在让AI智能体能以统一、安全的方式访问外部工具和数据源如数据库、API、文件系统。我们会简单实践如何理解和使用MCP Server。首先创建一个干净的虚拟环境并安装核心依赖# 创建并激活虚拟环境以conda为例 conda create -n ai-agent-tutorial python3.11 conda activate ai-agent-tutorial # 安装核心框架 pip install langchain langchain-community langchain-openai langgraph # 安装向量数据库和文本处理 pip install chromadb pypdf sentence-transformers # 安装可能的工具依赖 pip install requests python-dotenv使用python-dotenv来管理你的API密钥创建一个.env文件OPENAI_API_KEY你的OpenAI_API密钥1.2 项目结构设计在写第一行业务代码前先规划好目录结构。一个清晰的结构能让后续的RAG、Agent、Graph模块各就其位避免代码混成一团。ai_agent_project/ ├── .env # 环境变量 ├── requirements.txt # 依赖列表 ├── app.py # 主应用入口可选用于简单测试 ├── core/ # 核心逻辑 │ ├── __init__.py │ ├── agents/ # 智能体定义 │ │ ├── __init__.py │ │ └── research_agent.py │ ├── graphs/ # LangGraph工作流定义 │ │ ├── __init__.py │ │ └── research_graph.py │ └── tools/ # 自定义工具 │ ├── __init__.py │ ├── web_search.py │ └── calculator.py ├── knowledge_base/ # RAG知识库相关 │ ├── docs/ # 存放原始文档PDF, TXT等 │ ├── vector_store.py # 向量库初始化与检索逻辑 │ └── ingest.py # 文档加载、切分、向量化脚本 ├── config.py # 配置文件 └── utils/ # 工具函数 └── __init__.py这个结构不是固定的但它遵循了“功能模块化”的原则。关键点ingest.py和vector_store.py是RAG的基石务必独立出来agents和graphs目录区分了简单的智能体和复杂的工作流。2. 构建知识库RAG让智能体“读懂”你的私有资料RAG检索增强生成是让通用大模型具备“领域知识”的关键。这一步的目标是把你的文档如PDF、Word变成智能体可以快速查询的内部知识。2.1 文档加载与处理不要一上来就处理几百页的PDF。先用一个简单的文本文件测试整个流水线。在knowledge_base/ingest.py中import os from langchain_community.document_loaders import TextLoader, PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_chroma import Chroma def ingest_documents(docs_dir: str, persist_directory: str “./chroma_db”): “”” 加载、切分文档并存入向量数据库。 Args: docs_dir: 存放原始文档的目录路径。 persist_directory: ChromaDB持久化存储路径。 “”” documents [] # 1. 加载文档 for filename in os.listdir(docs_dir): file_path os.path.join(docs_dir, filename) if filename.endswith(“.txt”): loader TextLoader(file_path, encoding“utf-8”) elif filename.endswith(“.pdf”): loader PyPDFLoader(file_path) else: continue # 跳过不支持的文件 loaded_docs loader.load() documents.extend(loaded_docs) print(f“已加载: {filename}”) if not documents: print(“未找到可处理的文档。”) return # 2. 分割文本 # 这里参数很重要chunk_size 决定每个片段的大小chunk_overlap 避免上下文断裂 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个片段约1000字符 chunk_overlap200, # 片段间重叠200字符 length_functionlen, separators[“\n\n”, “\n”, “。”, “.”, “,”, “ “, “”] # 中文环境下可调整分隔符 ) splits text_splitter.split_documents(documents) print(f“文档已分割为 {len(splits)} 个片段。”) # 3. 生成嵌入并存入向量库 # 使用OpenAI的嵌入模型也可以换成开源模型如 all-MiniLM-L6-v2 embeddings OpenAIEmbeddings(model“text-embedding-3-small”) # 持久化存储下次启动无需重新处理 vectorstore Chroma.from_documents( documentssplits, embeddingembeddings, persist_directorypersist_directory ) vectorstore.persist() print(f“向量数据已保存至: {persist_directory}”) if __name__ “__main__”: # 示例处理 knowledge_base/docs/ 下的文档 ingest_documents(docs_dir“./knowledge_base/docs”)关键参数解释chunk_size1000: 片段大小。太小会丢失上下文太大会降低检索精度。根据你的文档内容调整技术文档可以稍大对话记录可以稍小。chunk_overlap200: 重叠部分。确保关键信息如一个概念的定义不会刚好被切在两段之间。persist_directory: 指定后ChromaDB会将索引存到磁盘下次启动直接加载无需重新计算嵌入这能节省大量时间和API费用。运行这个脚本前先在knowledge_base/docs/里放一个test.txt文件。运行后检查是否生成了chroma_db目录。2.2 创建检索器向量库建好后我们需要一个能从中查询信息的工具。在knowledge_base/vector_store.py中from langchain_openai import OpenAIEmbeddings from langchain_chroma import Chroma from langchain.retrievers import ContextualCompressionRetriever from langchain.retrievers.document_compressors import LLMChainExtractor from langchain_openai import ChatOpenAI class KnowledgeBase: def __init__(self, persist_directory: str “./chroma_db”): self.embeddings OpenAIEmbeddings(model“text-embedding-3-small”) self.vectorstore Chroma( persist_directorypersist_directory, embedding_functionself.embeddings ) # 基础检索器 self.base_retriever self.vectorstore.as_retriever( search_type“similarity”, # 相似度搜索 search_kwargs{“k”: 4} # 返回最相关的4个片段 ) # 可选使用LLM对检索结果进行压缩/重排序提高精度但会增加延迟和成本 self._compression_retriever None property def retriever(self): “””返回检索器。如果需要压缩可以在这里启用。””” # 对于初步开发先用基础检索器 return self.base_retriever # 若要启用压缩检索器高级用法 # if not self._compression_retriever: # llm ChatOpenAI(temperature0, model“gpt-3.5-turbo”) # compressor LLMChainExtractor.from_llm(llm) # self._compression_retriever ContextualCompressionRetriever( # base_compressorcompressor, base_retrieverself.base_retriever # ) # return self._compression_retriever def query(self, question: str, k: int 4) - list: “””直接查询向量库返回相关文档片段。””” docs self.vectorstore.similarity_search(question, kk) return docs # 全局实例方便在其他模块导入 knowledge_base KnowledgeBase()现在你可以在Python交互环境里测试knowledge_base.query(“什么是AI Agent?”)看是否能返回相关的文档片段。这是验证RAG是否生效的第一步。3. 定义工具与基础智能体Agent赋予智能体“手脚”智能体需要工具来与世界交互。我们先定义几个简单工具然后用LangChain创建一个能使用这些工具的基础智能体。3.1 创建自定义工具在core/tools/目录下创建工具。每个工具本质上是一个函数加上LangChain的tool装饰器来描述它。core/tools/calculator.py:from langchain.tools import tool tool def calculator(expression: str) - str: “””执行一个数学表达式计算并返回结果。支持加减乘除和括号。 例如calculator(“(3 5) * 2”) - 16。 “”” try: # 警告实际生产环境应使用更安全的评估方式如 ast.literal_eval 或专用库 # 此处为演示简化处理 result eval(expression) return f“计算结果: {result}” except Exception as e: return f“计算错误: {e}”core/tools/web_search.py:import requests from langchain.tools import tool tool def search_web(query: str) - str: “””使用Serper API或其他搜索API搜索网络信息。你需要注册并获取API密钥。 这是一个示例实际使用时请替换为你的API密钥和端点。””” # 示例使用 Serper Dev (https://serper.dev) 的搜索API url “https://google.serper.dev/search” headers { “X-API-KEY”: “YOUR_SERPER_API_KEY”, # 请在此处替换你的密钥 “Content-Type”: “application/json” } payload {“q”: query} try: response requests.post(url, headersheaders, jsonpayload) response.raise_for_status() data response.json() # 简单提取前几条结果的摘要 snippets [] if “organic” in data: for item in data[“organic”][:3]: # 取前三条 snippets.append(item.get(“snippet”, “”)) return “ | “.join(snippets) if snippets else “未找到相关信息。” except Exception as e: return f“搜索请求失败: {e}”重要提示search_web工具需要外部API密钥。对于学习和测试你可以先注释掉它或者使用一个模拟搜索结果的工具。不要将真实API密钥提交到代码仓库。3.2 构建第一个智能体有了工具和知识库我们可以组装一个简单的智能体。在core/agents/research_agent.py中from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent from langchain import hub from core.tools.calculator import calculator from core.tools.web_search import search_web from knowledge_base.vector_store import knowledge_base def create_research_agent(): “”” 创建一个能使用计算器、网络搜索和知识库查询的智能体。 使用ReAct范式Reasoning Acting。 “”” # 1. 选择大模型 llm ChatOpenAI(model“gpt-4o”, temperature0) # temperature0使输出更确定 # 2. 准备工具列表 tools [calculator, search_web] # 将知识库检索器也包装成一个工具 from langchain.tools.retriever import create_retriever_tool retriever_tool create_retriever_tool( knowledge_base.retriever, “search_company_knowledge_base”, “在公司的内部知识库中搜索信息例如产品文档、流程指南、常见问题解答等。” ) tools.append(retriever_tool) # 3. 获取预定义的ReAct提示词模板 prompt hub.pull(“hwchase17/react”) # 提示词模板会指导LLM如何思考Reason和选择工具Act # 4. 创建智能体 agent create_react_agent(llm, tools, prompt) # 5. 创建执行器 agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, # 设为True可以看到智能体的思考过程调试非常有用 handle_parsing_errorsTrue, # 优雅处理LLM输出解析错误 max_iterations5, # 限制最大迭代次数防止死循环 early_stopping_method“generate” # 当智能体认为任务完成时停止 ) return agent_executor # 示例快速测试 if __name__ “__main__”: agent create_research_agent() result agent.invoke({“input”: “我们公司知识库里关于年假的规定是什么”}) print(result[“output”])运行这个测试如果verboseTrue你会在控制台看到类似以下的思考链 Entering new AgentExecutor chain... 我需要查询公司内部知识库来回答年假规定。 Action: search_company_knowledge_base Action Input: 年假规定 Observation: [检索到的相关文档片段...] Thought: 根据知识库公司规定员工入职满一年后享有10天年假... Action: Final Answer ...这说明你的智能体已经成功地将问题路由到了正确的工具知识库检索器。这是智能体工作的核心标志它能根据你的问题自动决定调用哪个工具。4. 设计复杂工作流LangGraph让智能体学会“多步思考”基础智能体适合简单的一问一答或单一工具调用。但对于“调研某个主题并撰写报告”这类需要多步骤、有状态、可能循环的任务就需要LangGraph。它把工作流定义为一个“图”节点是执行步骤边是流转条件。4.1 理解LangGraph的核心概念State状态: 一个字典在整个工作流执行过程中传递和修改数据。比如{“topic”: “AI Agent”, “research_materials”: [], “report”: “”}。Node节点: 一个函数接收当前State执行操作如调用LLM、运行工具并返回更新后的State。Edge边: 决定工作流从一个节点结束后下一步该去哪个节点。可以是固定流转也可以根据State里的某个值如LLM的判断来决定。4.2 构建一个调研工作流假设我们要构建一个智能体它能1) 根据主题进行网络搜索2) 查询内部知识库3) 综合信息撰写一份简要报告。在core/graphs/research_graph.py中from typing import TypedDict, Annotated, List import operator from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage from core.tools.web_search import search_web from knowledge_base.vector_store import knowledge_base # 1. 定义工作流的状态结构 class ResearchState(TypedDict): topic: str # 调研主题 web_results: List[str] # 网络搜索结果 kb_results: List[str] # 知识库检索结果 report: str # 生成的报告 iterations: Annotated[int, operator.add] # 记录迭代次数可选 # 2. 定义各个节点函数 def search_web_node(state: ResearchState) - ResearchState: “””节点执行网络搜索。””” print(f“正在搜索网络关于 ‘{state[‘topic’]}’ 的信息...”) web_content search_web.invoke(state[“topic”]) # 注意search_web工具返回的是字符串我们把它放入列表 return {“web_results”: [web_content]} def search_knowledge_base_node(state: ResearchState) - ResearchState: “””节点查询内部知识库。””” print(f“正在查询知识库关于 ‘{state[‘topic’]}’ 的信息...”) docs knowledge_base.query(state[“topic”], k3) kb_content [doc.page_content for doc in docs] return {“kb_results”: kb_content} def generate_report_node(state: ResearchState) - ResearchState: “””节点综合信息生成报告。””” print(“正在综合信息生成报告...”) llm ChatOpenAI(model“gpt-4o”, temperature0.2) # 准备提示词 system_prompt “””你是一个专业的调研员。请根据提供的网络搜索材料和内部知识库材料撰写一份关于给定主题的简明报告。 报告应结构清晰包含关键发现和要点。如果材料不足请注明信息有限。””” user_prompt f””” 调研主题{state[‘topic’]} 网络搜索结果摘要 {‘\n’.join(state.get(‘web_results’, []))} 内部知识库相关内容 {‘\n’.join(state.get(‘kb_results’, []))} 请基于以上信息撰写一份简要报告。 “”” messages [ SystemMessage(contentsystem_prompt), HumanMessage(contentuser_prompt) ] response llm.invoke(messages) return {“report”: response.content} # 3. 构建图 def create_research_graph() - StateGraph: workflow StateGraph(ResearchState) # 添加节点 workflow.add_node(“search_web”, search_web_node) workflow.add_node(“search_kb”, search_knowledge_base_node) workflow.add_node(“generate_report”, generate_report_node) # 设置入口点 workflow.set_entry_point(“search_web”) # 添加边定义执行顺序 # 从 search_web 节点出来后并行执行 search_kb然后一起进入 generate_report workflow.add_edge(“search_web”, “search_kb”) workflow.add_edge(“search_kb”, “generate_report”) workflow.add_edge(“generate_report”, END) # 结束 # 编译图 return workflow.compile() # 4. 使用图 if __name__ “__main__”: graph create_research_graph() # 定义初始状态 initial_state: ResearchState { “topic”: “大语言模型在客户服务中的应用”, “web_results”: [], “kb_results”: [], “report”: “”, “iterations”: 0 } # 运行工作流 final_state graph.invoke(initial_state) print(“\n” “”*50) print(“最终报告”) print(final_state[“report”]) print(“”*50)这个工作流是线性的搜索网络 - 查询知识库 - 生成报告。LangGraph的强大之处在于你可以轻松地添加条件分支和循环。例如你可以增加一个“评估节点”判断收集的信息是否足够如果不够就循环回去继续搜索。5. 集成MCP模型上下文协议安全扩展工具边界MCP是一个新兴协议它的核心思想是让AI应用客户端能够以标准化、安全的方式发现和调用外部服务器MCP Server提供的工具和资源。这解决了智能体工具生态的碎片化和安全问题。5.1 MCP的核心概念MCP Server: 一个提供工具如数据库查询、日历管理、文件读写的服务器。它向客户端宣告自己有哪些能力。MCP Client: 我们的AI应用如基于LangChain的智能体。它连接到Server获取可用工具列表并在需要时调用它们。Stdio/SSE传输: MCP Server和Client之间通常通过标准输入输出或Server-Sent Events通信易于集成。5.2 在LangChain中使用MCP工具假设我们已经有一个MCP Server在运行例如一个提供了查询数据库工具的服务。在LangChain中集成它非常简单。首先确保已安装MCP的LangChain集成包请根据官方文档确认最新包名例如langchain-mcp-adaptor或通过mcp客户端库。# 示例集成一个假设的“公司数据库”MCP Server # 注意以下代码为概念演示实际调用方式取决于MCP Server的实现和客户端库 # 方式1如果MCP Server通过Stdio运行 import subprocess from langchain.agents import Tool # 启动MCP Server进程例如一个Python脚本或可执行文件 mcp_server_process subprocess.Popen( [“python”, “path/to/your_mcp_server.py”], stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue ) # 我们需要一个MCP客户端库来与Server通信 # 假设有 mcp_client 库 # from mcp_client import Client # client Client(stdio_processmcp_server_process) # tools client.get_tools() # 获取Server提供的所有工具 # 方式2更常见的是通过LangChain的集成方式 # 以下代码假设未来有直接的 MCPToolkit 或类似集成 # from langchain.agents.mcp import MCPToolkit # toolkit MCPToolkit(server_url“stdio://path/to/server”) # 或SSE地址 # tools toolkit.get_tools() # 将MCP工具加入到你的智能体工具列表中 # all_tools existing_tools tools当前现状截至2024年MCP协议仍在快速发展中LangChain对其的原生集成可能处于早期或实验阶段。更务实的做法是将MCP Server提供的功能通过一个自定义的LangChain Tool来封装。例如你的MCP Server提供了一个query_database的工具你可以写一个Wrapperfrom langchain.tools import tool import requests # 假设MCP Server提供HTTP接口 tool def query_company_database(sql_query: str) - str: “””向公司数据库MCP Server发送查询请求。示例工具。””” # 这里模拟调用MCP Server的HTTP端点 # 实际中可能是通过Stdio或SSE与本地Server进程通信 try: # 假设MCP Server运行在本地端口8080 response requests.post( “http://localhost:8080/tools/query”, json{“tool”: “query_database”, “args”: {“query”: sql_query}} ) data response.json() return data.get(“result”, “查询无结果”) except Exception as e: return f“数据库查询失败: {e}”然后将这个query_company_database工具像之前的calculator一样添加到你的智能体工具列表中。这样你就以一种兼容现有LangChain生态的方式“接入”了MCP的能力。当MCP的LangChain集成稳定后迁移过去会很容易。6. 企业级项目实战要点从Demo到可用的距离把上述模块组合起来你就能跑通一个AI Agent的Demo。但要从Demo变成企业级可用的系统还需要考虑以下几个关键点这也是很多教程不会深入讲的部分。6.1 记忆Memory管理智能体需要有记忆才能进行多轮对话。LangChain提供了多种记忆方案对话缓冲记忆ConversationBufferMemory: 保存所有历史对话。简单但上下文长了会消耗大量Token。对话摘要记忆ConversationSummaryMemory: 让LLM定期总结对话历史只保留摘要。节省Token但可能丢失细节。向量存储记忆VectorStoreRetrieverMemory: 将历史对话存入向量库每次根据当前问题检索相关历史。适合长上下文但实现稍复杂。建议对于知识库问答场景结合使用缓冲窗口记忆和RAG。最近几轮对话用缓冲记忆保持连贯性而深度的领域知识查询则交给RAG。from langchain.memory import ConversationBufferWindowMemory from langchain.chains import ConversationalRetrievalChain llm ChatOpenAI(model“gpt-4o”, temperature0) memory ConversationBufferWindowMemory(k3, return_messagesTrue) # 记住最近3轮对话 qa_chain ConversationalRetrievalChain.from_llm( llmllm, retrieverknowledge_base.retriever, memorymemory, verboseTrue ) # 现在 qa_chain 可以处理多轮对话并基于知识库回答6.2 智能体Agent的稳定性与管控智能体调用工具时可能出错或陷入循环。设置最大迭代次数: 如max_iterations10防止无限循环。处理解析错误:handle_parsing_errorsTrue能捕获LLM输出不符合工具调用格式的错误并让智能体重试或优雅失败。超时控制: 对于网络工具如搜索设置请求超时。验证工具输入: 在自定义工具函数内部对输入参数进行校验和清理防止注入攻击或意外错误。6.3 RAG的优化策略基础的RAG可能遇到“检索不准”或“生成幻觉”的问题。检索优化:多路检索Hybrid Search: 结合关键词搜索如BM25和向量搜索提高召回率。重排序Re-ranking: 使用更精细的模型如Cohere Rerank对检索出的文档片段进行重新排序把最相关的排在最前。元数据过滤: 在存储时为文档片段添加元数据如文档类型、章节、日期检索时进行过滤。提示工程优化:在给LLM的提示词中明确指令“严格基于以下上下文回答问题如果上下文没有提供足够信息请直接说‘根据现有资料无法回答’”这能有效减少幻觉。提供“引用”或“出处”。让LLM在回答时指出信息来自哪个文档片段。6.4 部署与监控API化: 使用FastAPI或Flask将你的智能体封装成HTTP API。异步处理: 对于耗时的任务如文档处理、复杂工作流使用asyncio或任务队列如Celery避免阻塞。日志记录: 详细记录智能体的每一步决策、工具调用和结果。这对于调试和优化至关重要。成本与性能监控: 记录每次调用消耗的Token数、各步骤耗时便于分析成本和性能瓶颈。7. 常见问题排查清单当你按照教程操作遇到问题时按以下顺序排查环境与依赖:Python版本是否正确python --version依赖是否安装完整pip list | grep langchainAPI密钥是否正确设置echo $OPENAI_API_KEY或检查.env文件。虚拟环境是否激活RAG不工作:文档真的被加载和分割了吗检查ingest.py的输出日志和生成的chroma_db目录大小。检索时返回空列表尝试用knowledge_base.vectorstore.similarity_search_with_score(“简单词”, k1)查看相似度分数如果分数很低可能是嵌入模型不匹配或文档内容不相关。中文检索效果差检查文本分割器RecursiveCharacterTextSplitter的separators是否包含中文标点或尝试专门的中文分词处理。智能体不调用工具:verboseTrue看到了吗观察智能体的“Thought”过程看它是否在正确分析问题。工具描述是否清晰在tool装饰器中的函数文档字符串docstring是LLM选择工具的主要依据务必写清楚工具的用途和输入格式。LLM温度temperature是否太高太高可能导致输出不稳定设为0或0.1试试。LangGraph工作流卡住或报错:检查每个节点函数的输入和输出是否符合State的类型定义。图的结构是否正确确保所有节点都有边连接到下一个节点或END。在节点函数内部添加print语句跟踪执行流程。性能问题:响应慢可能是网络请求如搜索、OpenAI API或嵌入计算慢。考虑缓存、异步或使用更快的本地嵌入模型。内存/显存占用高检查批量处理的数据量对于大文档考虑流式处理或分块加载。这套教程的最终目标不是让你记住每一个API调用而是理解从RAG、到工具、到智能体、再到工作流这一整套技术栈是如何协同工作的。我建议你先在本地把每个模块的最小可行版本跑通确保数据流从文档到向量库从问题到检索从决策到工具调用是通的。然后再去考虑优化检索质量、增加工具、设计更复杂的工作流以及最终如何部署成一个服务。在这个过程中多查看官方文档多利用verboseTrue来观察智能体的思考过程这是学习和调试最有效的方法。
返回列表