行业资讯

从零构建智能体驱动的RAG客服系统:Codex、Agents与RAG实战指南

发布时间:2026/8/9 2:32:19
从零构建智能体驱动的RAG客服系统:Codex、Agents与RAG实战指南 大家好我是专注于AI应用开发的技术博主。最近在探索如何将大语言模型LLM能力深度集成到业务系统中时发现很多开发者对Codex、Agents智能体和RAG检索增强生成这些概念感到既兴奋又困惑。网上资料要么过于零散要么停留在理论层面缺乏一个从零搭建、贯穿核心概念到项目实战的完整闭环指南。本文将为你彻底解决这个问题。我们将从最基础的Codex环境搭建开始一步步深入到Agents多智能体协作的原理与实现最后构建一个功能完整的RAG智能客服系统。无论你是刚接触AI应用的新手还是希望将现有项目升级为“智能体驱动”的进阶开发者都能从这篇保姆级教程中找到清晰的路径和可直接复用的代码。文章内容涵盖安装部署、核心API使用、多智能体架构设计、本地知识库构建以及生产环境最佳实践确保你不仅能“跑起来”更能“用得好”。1. 背景与核心概念为什么是Codex、Agents与RAG在深入实战之前我们有必要厘清这几个核心概念理解它们各自解决的问题以及组合使用的威力。Codex通常指的是由OpenAI推出的、专门用于代码生成与理解的系列模型如code-davinci-002。但在更广泛的语境下“Codex”也常被用来泛指一类能够理解并生成代码的AI模型接口或平台。本文讨论的“Codex”侧重于其作为连接大语言模型与具体应用之间的桥梁角色它提供了标准化的API、工具调用Function Calling能力和开发框架让开发者能便捷地调用LLM能力。你可以将其理解为开发AI应用的“SDK”或“中间件”。Agents智能体是当前AI应用的前沿范式。一个智能体不仅仅是一个问答模型而是一个具备感知、规划、决策和执行能力的自治系统。其核心原理在于LLM作为智能体的“大脑”负责理解目标、制定计划而外部工具如搜索引擎、数据库、API则是智能体的“手脚”。通过让LLM循环执行“思考-行动-观察”的步骤智能体可以完成复杂的、多步骤的任务例如自动分析数据、编写完整程序、协调多个服务等。多智能体系统则更进一步让多个具备不同技能的智能体相互协作、竞争或监督以解决更宏大或需要多领域知识的问题。RAG检索增强生成是解决LLM“幻觉”生成虚假信息和知识滞后问题的关键技术。其核心思想是在回答用户问题前先从外部的、可信的知识库如公司文档、产品手册、最新新闻中检索出相关的信息片段然后将这些信息作为上下文连同用户问题一起提交给LLM生成最终答案。这样答案的准确性和时效性得到了极大保障。一个典型的RAG系统包括文档加载、文本分割、向量化存储、语义检索和提示词工程等多个环节。为什么将它们结合想象一下你要构建一个智能客服系统。单纯使用LLM它可能无法准确回答你公司的特定产品问题知识幻觉。单纯使用RAG它只能做问答无法执行“为用户创建一张售后工单”这样的操作。而引入Agents则可以让这个系统变得“智能”用户说“我的XX产品坏了帮我报修并查一下保修政策”。智能体可以规划步骤1. 调用RAG模块查询保修政策2. 调用工单系统API创建报修单3. 综合两者信息生成回复给用户。Codex则为我们提供了实现这一切所需的模型接口和工具调用规范。接下来我们就从环境搭建开始亲手实现这个愿景。2. 环境准备与版本说明本教程将以Python为主要开发语言因为其丰富的AI生态库能极大简化开发。我们将使用虚拟环境来管理依赖确保项目隔离。操作系统: Windows 10/11, macOS 或 Linux (Ubuntu 20.04) 均可。文中命令行示例以Linux/macOS的bash为主Windows用户可在PowerShell或WSL2中运行对应命令。Python版本: 推荐使用 Python 3.9 或 3.10。部分库对3.11的兼容性可能需额外调整。核心依赖库:openai: 用于调用OpenAI API或其他兼容API。这是我们的“Codex”接口核心。langchain: 一个强大的框架它封装了LLM调用、Agents、RAG链等高级抽象能极大提升开发效率。chromadb: 一个轻量级、易用的向量数据库用于存储和检索RAG中的文档向量。sentence-transformers: 用于生成文本的嵌入向量Embeddings我们选择all-MiniLM-L6-v2模型它平衡了速度与效果。版本说明AI领域库更新迅速以下版本在撰写时经过测试能保证示例运行。如果你的环境存在冲突可以尝试调整版本。# 创建并激活虚拟环境以conda为例 conda create -n codex_agents python3.9 conda activate codex_agents # 安装核心依赖 pip install openai1.12.0 pip install langchain0.1.0 pip install langchain-openai0.0.5 # LangChain对OpenAI的集成库 pip install chromadb0.4.22 pip install sentence-transformers2.2.2 pip install tiktoken # 用于Token计数 pip install pypdf # 用于处理PDF文档 pip install python-dotenv # 管理环境变量IDE: 推荐使用 VS Code 或 PyCharm。API密钥: 你需要准备一个OpenAI API密钥或使用其他兼容OpenAI API的模型服务如Azure OpenAI、Ollama本地模型等。我们将使用环境变量来管理密钥避免硬编码在代码中。创建一个名为.env的文件在项目根目录并写入你的密钥# .env OPENAI_API_KEYsk-your-openai-api-key-here # 如果你使用其他兼容服务可能还需要配置BASE_URL # OPENAI_API_BASEhttps://api.xxx.com/v13. 核心语法、配置与原理拆解3.1 初始化LangChain与LLM首先我们学习如何使用LangChain来标准化地调用LLM。LangChain将LLM封装成一个统一的ChatModel或LLM对象。# 文件core/llm_setup.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI # 加载环境变量 load_dotenv() # 初始化ChatOpenAI实例 # model参数指定使用的模型如gpt-3.5-turbo, gpt-4, gpt-4-turbo等 # temperature控制生成文本的随机性0-1值越高越有创意值越低越确定。 llm ChatOpenAI( modelgpt-3.5-turbo, temperature0.1, # 对于需要稳定输出的任务设置较低的temperature api_keyos.getenv(OPENAI_API_KEY), # 如果使用非官方OpenAI端点可以设置openai_api_base参数 # openai_api_baseos.getenv(OPENAI_API_BASE) ) # 最简单的调用方式预测Predict from langchain_core.messages import HumanMessage message [HumanMessage(content用Python写一个Hello World程序)] response llm.invoke(message) print(response.content)关键点ChatOpenAI是针对聊天优化的模型接口。对于纯代码生成历史上使用OpenAI类的code-davinci-002但现在更推荐使用gpt-3.5-turbo或gpt-4并通过系统提示词System Message来指定其角色为“编程助手”。temperature是核心参数。在代码生成、事实问答等场景建议设为较低值如0.1-0.3在创意写作、头脑风暴场景可以调高如0.7-0.9。invoke是LangChain v0.1.x后推荐的标准调用方法。3.2 理解与定义Tools工具Tools是智能体的“手脚”。任何可以被API调用的功能都可以封装成一个Tool例如计算器、网络搜索、数据库查询、内部系统接口。在LangChain中定义一个Tool非常简单你需要提供1. 工具名称2. 工具描述LLM根据描述决定是否调用3. 具体的执行函数。# 文件core/tools.py from langchain.agents import tool import requests import json tool def get_weather(city: str) - str: 根据城市名称获取当前天气信息。 # 这里使用一个模拟的天气API实际项目中请替换为真实的API # 注意这是一个示例实际API需要注册和密钥 try: # 模拟API响应 mock_data { Beijing: {city: 北京, condition: 晴, temperature: 22°C}, Shanghai: {city: 上海, condition: 多云, temperature: 25°C}, } result mock_data.get(city, f未找到{city}的天气信息) return json.dumps(result, ensure_asciiFalse) except Exception as e: return f查询天气时出错{str(e)} tool def search_company_knowledge(query: str) - str: 在公司内部知识库中搜索相关信息。这是一个RAG工具的示例接口。 # 在实际项目中这里会连接向量数据库进行语义检索 # 此处返回模拟结果 mock_knowledge_base { 退货政策: 商品签收后7天内可无理由退货需保持商品完好。, 保修期限: 所有电子产品享受2年官方保修。, 客服电话: 官方客服电话是400-123-4567工作时间为9:00-18:00。 } # 简单关键词匹配实际应为语义搜索 for key, value in mock_knowledge_base.items(): if key in query: return value return 未在知识库中找到相关信息。为什么工具描述很重要LLM如GPT本身并不“知道”这些函数的存在。当你把工具列表提供给智能体时LLM会阅读每个工具的描述来理解这个工具能做什么、在什么情况下使用。因此描述必须清晰、准确包含关键输入参数的信息。3.3 Agents智能体运行原理拆解智能体的核心是一个循环规划Plan: LLM根据用户目标和可用工具决定下一步该做什么调用哪个工具传入什么参数。执行Act: 系统执行被选中的工具函数并获取结果。观察Observe: 将工具执行的结果反馈给LLM。循环: LLM根据新观察决定下一步直到它认为任务完成并生成最终答案给用户。LangChain提供了多种Agent类型如ZERO_SHOT_REACT_DESCRIPTION,OPENAI_FUNCTIONS。我们使用OPENAI_FUNCTIONS类型它利用OpenAI模型原生的函数调用能力更加高效和稳定。# 文件core/agent_basic.py from langchain.agents import AgentExecutor, create_openai_functions_agent from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from core.llm_setup import llm # 导入之前定义的llm from core.tools import get_weather, search_company_knowledge # 导入工具 # 1. 定义工具列表 tools [get_weather, search_company_knowledge] # 2. 构建提示词模板 # SYSTEM_MESSAGE 用于设定智能体的角色和行为准则 SYSTEM_MESSAGE 你是一个有用的助手。你可以使用工具来获取信息。 如果你不知道答案就老实说不知道不要编造信息。 请用中文回答用户的问题。 prompt ChatPromptTemplate.from_messages([ (system, SYSTEM_MESSAGE), (human, {input}), MessagesPlaceholder(variable_nameagent_scratchpad), # 预留位置用于存放智能体思考的中间步骤 ]) # 3. 创建智能体 agent create_openai_functions_agent(llmllm, toolstools, promptprompt) # 4. 创建执行器 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # verboseTrue 会打印出智能体的思考过程便于调试 # handle_parsing_errorsTrue 能更好地处理LLM输出格式错误 # 5. 运行智能体 if __name__ __main__: result agent_executor.invoke({input: 北京和上海的天气怎么样}) print(\n--- 最终回答 ---) print(result[output]) result2 agent_executor.invoke({input: 你们的退货政策是什么}) print(\n--- 最终回答 ---) print(result2[output])运行上述代码你会看到控制台输出智能体详细的思考链Chain of Thought例如 Entering new AgentExecutor chain... 我需要同时获取北京和上海的天气信息。我可以使用天气查询工具。 Action: get_weather Action Input: {city: Beijing} Observation: {city: 北京, condition: 晴, temperature: 22°C} Thought: 我已经获取了北京的天气现在需要获取上海的天气。 Action: get_weather Action Input: {city: Shanghai} Observation: {city: 上海, condition: 多云, temperature: 25°C} Thought: 我已经获取了两个城市的天气信息现在可以总结回答了。 Action: Final Answer ...这就是智能体在“思考-行动-观察”的循环。verboseTrue是学习和调试智能体行为的利器。4. 完整实战案例构建RAG智能客服系统现在我们将整合所有知识构建一个具备内部知识库查询RAG和外部工具调用能力的多技能智能客服系统。4.1 项目结构设计codex_agents_project/ ├── .env # 环境变量 ├── requirements.txt # 依赖列表 ├── main.py # 主程序入口 ├── core/ │ ├── __init__.py │ ├── llm_setup.py # LLM初始化 │ ├── tools.py # 工具定义 │ └── rag_engine.py # RAG核心引擎 ├── data/ # 存放知识库文档 │ └── company_handbook.pdf ├── vector_store/ # 向量数据库持久化目录自动生成 └── logs/ # 日志目录4.2 实现RAG引擎RAG的核心是将文档切片、向量化并存储然后根据问题检索相关片段。# 文件core/rag_engine.py import os from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma from langchain.prompts import ChatPromptTemplate from langchain.chains import create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from core.llm_setup import llm class RAGEngine: def __init__(self, persist_directory./vector_store): self.persist_directory persist_directory # 使用开源嵌入模型无需API调用本地运行 self.embeddings HuggingFaceEmbeddings( model_namesentence-transformers/all-MiniLM-L6-v2, model_kwargs{device: cpu} # 使用GPU可改为 cuda ) self.vector_store None self.retriever None self.qa_chain None def load_and_split_documents(self, file_path): 加载PDF文档并分割成小块 loader PyPDFLoader(file_path) documents loader.load() # 文本分割器确保片段大小适中且有重叠以避免割裂上下文 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个片段约500字符 chunk_overlap50, # 重叠50字符 separators[\n\n, \n, 。, , , , , ] ) splits text_splitter.split_documents(documents) print(f文档已加载并分割为 {len(splits)} 个片段。) return splits def create_vector_store(self, documents, force_recreateFalse): 创建或加载向量数据库 if not force_recreate and os.path.exists(self.persist_directory): print(加载已存在的向量数据库...) self.vector_store Chroma( persist_directoryself.persist_directory, embedding_functionself.embeddings ) else: print(创建新的向量数据库...) self.vector_store Chroma.from_documents( documentsdocuments, embeddingself.embeddings, persist_directoryself.persist_directory ) self.vector_store.persist() self.retriever self.vector_store.as_retriever(search_kwargs{k: 3}) # 检索最相关的3个片段 def create_qa_chain(self): 创建基于检索的问答链 # 系统提示词指导LLM如何利用检索到的上下文 system_prompt ( 你是一个专业的客服助手请严格根据提供的上下文信息来回答问题。 如果上下文中的信息不足以回答问题请直接说根据现有资料我无法回答这个问题。不要编造信息。\n\n 上下文{context} ) prompt ChatPromptTemplate.from_messages([ (system, system_prompt), (human, {input}), ]) # 组合文档链将检索到的文档片段整合到提示词中 combine_docs_chain create_stuff_documents_chain(llm, prompt) # 检索链将用户输入转化为检索查询并将结果传给组合文档链 self.qa_chain create_retrieval_chain(self.retriever, combine_docs_chain) def query(self, question: str) - str: 查询知识库 if not self.qa_chain: raise ValueError(请先调用 create_qa_chain() 初始化问答链。) result self.qa_chain.invoke({input: question}) return result[answer] def initialize(self, data_path./data/company_handbook.pdf): 初始化RAG引擎加载文档、创建向量库、构建问答链 documents self.load_and_split_documents(data_path) self.create_vector_store(documents) self.create_qa_chain() print(RAG引擎初始化完成。)4.3 将RAG封装为智能体工具现在我们需要让智能体能够调用这个RAG引擎。我们将它包装成一个Tool。# 在 core/tools.py 中增加 from core.rag_engine import RAGEngine # 全局RAG引擎实例 _rag_engine None def get_rag_engine(): 单例模式获取RAG引擎 global _rag_engine if _rag_engine is None: _rag_engine RAGEngine() _rag_engine.initialize() # 初始化会加载文档比较耗时建议在服务启动时完成 return _rag_engine tool def query_knowledge_base(question: str) - str: 查询公司内部知识库以获取准确的产品、政策等信息。输入应为清晰的自然语言问题。 try: engine get_rag_engine() answer engine.query(question) return answer except Exception as e: return f查询知识库时发生错误{str(e)}4.4 构建多技能客服智能体整合天气查询、知识库查询并新增一个创建工单的模拟工具。# 文件core/agent_system.py from langchain.agents import AgentExecutor, create_openai_functions_agent from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from core.llm_setup import llm from core.tools import get_weather, query_knowledge_base # 新增一个创建工单的工具 tool def create_service_ticket(product_name: str, issue_description: str, customer_name: str) - str: 为用户创建售后服务工单。需要产品名称、问题描述和客户姓名。 # 模拟创建工单实际应调用工单系统API import uuid ticket_id str(uuid.uuid4())[:8] return f工单创建成功工单号{ticket_id}。产品{product_name}问题{issue_description}客户{customer_name}。客服人员将在24小时内联系您。 # 将所有工具放入列表 all_tools [get_weather, query_knowledge_base, create_service_ticket] # 更复杂的系统提示词定义客服智能体的角色和行为规范 CUSTOMER_SERVICE_SYSTEM_PROMPT 你是“智能科技公司”的AI客服助手你的名字是小智。 你的职责是 1. **精准回答**对于产品信息、公司政策、操作指南等问题必须使用query_knowledge_base工具从知识库中查找最准确的答案。 2. **高效执行**对于报修、咨询等需要人工跟进的需求使用create_service_ticket工具创建工单。 3. **友好沟通**保持热情、专业、耐心的服务态度。 4. **诚实守信**如果不知道或工具未返回有效信息请如实告知用户“我暂时无法处理这个问题建议您联系人工客服电话400-xxx-xxxx”。 请逐步思考必要时使用工具。所有回复请使用中文。 prompt ChatPromptTemplate.from_messages([ (system, CUSTOMER_SERVICE_SYSTEM_PROMPT), (human, {input}), MessagesPlaceholder(variable_nameagent_scratchpad), ]) def create_customer_service_agent(): 创建并返回客服智能体执行器 agent create_openai_functions_agent(llmllm, toolsall_tools, promptprompt) executor AgentExecutor( agentagent, toolsall_tools, verboseTrue, # 生产环境可设为False max_iterations5, # 限制最大迭代次数防止死循环 early_stopping_methodgenerate, # 当智能体连续两次选择“Final Answer”时停止 handle_parsing_errorsTrue ) return executor4.5 运行与验证主程序创建一个简单的主程序来交互式测试我们的智能客服系统。# 文件main.py import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) from core.agent_system import create_customer_service_agent def main(): print(*50) print( 智能客服系统启动中...) print( 系统已加载1. 知识库问答(RAG) 2. 天气查询 3. 工单创建) print( 输入 exit 或 quit 结束对话。) print(*50) agent create_customer_service_agent() while True: try: user_input input(\n用户: ).strip() if user_input.lower() in [exit, quit]: print(客服小智: 感谢您的使用再见) break if not user_input: continue print(客服小智: 思考中...) # 执行智能体 result agent.invoke({input: user_input}) print(f\n客服小智: {result[output]}) except KeyboardInterrupt: print(\n\n对话被用户中断。) break except Exception as e: print(f\n系统出现错误: {e}) if __name__ __main__: # 首次运行需要初始化RAG引擎会花费一些时间加载和向量化文档 # 确保在 data/ 目录下放置了 company_handbook.pdf (可以是任何PDF格式的公司手册) main()运行演示将一份包含“退货政策”、“保修信息”等内容的PDF文档放入./data/目录命名为company_handbook.pdf。在终端运行python main.py。尝试以下对话用户你们的退货政策是怎样的智能体会调用query_knowledge_base工具从PDF中检索并返回答案。用户我的笔记本电脑无法开机了能帮我报修吗智能体会先询问必要信息产品名、问题描述、客户姓名或直接根据上下文调用create_service_ticket。用户顺便告诉我北京的天气。智能体会调用get_weather工具。通过这个流程一个具备内部知识问答和外部行动能力的多技能智能客服系统就搭建完成了。5. 常见问题与排查思路在开发和部署过程中你可能会遇到以下典型问题。问题现象常见原因解决思路ModuleNotFoundError: No module named langchain依赖未正确安装或虚拟环境未激活。1. 确认已激活虚拟环境 (conda activate codex_agents)。2. 使用pip list | grep langchain检查是否安装。3. 重新运行pip install -r requirements.txt。openai.AuthenticationError: Incorrect API key providedAPI密钥错误或未设置。1. 检查.env文件中的OPENAI_API_KEY是否正确。2. 在代码中打印os.getenv(‘OPENAI_API_KEY’)前几位确认已加载。3. 确保没有多余的空格或引号。智能体不调用工具直接胡编乱造答案1. 工具描述不够清晰。2. 系统提示词未强调使用工具。3. LLM的temperature可能过高。1. 优化工具描述确保包含关键词和输入格式。2. 在系统提示词中明确指令如“你必须使用工具来获取信息”。3. 将temperature调低至0.1-0.3。RAG检索结果不相关1. 文本分割块大小不合适。2. 嵌入模型不匹配。3. 检索数量k值不合适。1. 调整chunk_size(如300, 500, 1000) 和chunk_overlap。2. 尝试不同的嵌入模型如text-embedding-ada-002(需API) 或all-mpnet-base-v2(本地)。3. 调整retriever的k值尝试检索更多或更少的片段。RuntimeError: CUDA out of memory本地嵌入模型或LLM显存不足。1. 使用更小的模型如all-MiniLM-L6-v2。2. 在HuggingFaceEmbeddings中设置model_kwargs{device: cpu}使用CPU。3. 减少批量处理的数据量。智能体陷入循环不断调用同一个工具1. 工具返回的结果未能让LLM满足。2.max_iterations设置过高。1. 检查工具函数确保其返回有意义、结构化的信息。2. 在系统提示词中增加“如果工具无法解决问题请告知用户并停止尝试”。3. 降低max_iterations(如3或4)。Chroma向量库加载失败或报错1. 持久化目录路径问题。2. 版本不兼容导致的数据格式错误。1. 使用绝对路径或检查目录读写权限。2. 如果怀疑数据损坏可以删除vector_store/目录设置force_recreateTrue重新生成。6. 最佳实践与工程建议将原型转化为稳定、可维护的生产系统需要注意以下方面1. 提示词工程Prompt Engineering角色定义要具体不要只说“你是一个助手”要明确“你是XX公司的客服职责是...风格是...”。工具使用指令要强制在系统提示词中明确“对于A类问题你必须使用X工具对于B类需求你必须使用Y工具”。提供少量示例Few-Shot在提示词中提供1-2个用户query和智能体正确调用工具并回答的示例能显著提升效果。输出格式约束要求智能体以特定格式如JSON、Markdown列表回复便于后续程序解析。2. 工具设计与管理单一职责每个工具只做一件事。避免创建“万能”工具。健壮性工具函数内部必须有完善的异常处理try-except并返回对LLM友好的错误信息如“网络请求失败请稍后再试”而不是Python异常栈。输入验证在工具函数开头验证输入参数的类型和范围。工具版本化当工具接口变更时其描述也需要同步更新并考虑对线上智能体的影响。3. RAG系统优化文档预处理上传PDF、Word等文档前进行OCR针对扫描件、格式清理、无关内容页眉页脚去除。分块策略根据文档类型选择分块方式。技术文档可按章节分对话记录可按轮次分。重叠overlap是保证上下文连贯的关键。元数据过滤为每个文本块添加元数据如来源文件、章节、页码检索时可根据元数据过滤提升精度。重排序Re-ranking在向量检索出Top K个结果后使用一个更精细的交叉编码器模型对结果进行重排序将最相关的结果排到最前面。混合检索结合语义搜索向量和关键词搜索如BM25兼顾相关性和字面匹配。4. 智能体流程控制设置迭代上限务必使用max_iterations参数防止智能体在无法解决问题时陷入无限循环。超时控制为每个工具调用设置超时时间避免因某个外部API挂起导致整个智能体卡住。记忆Memory为多轮对话引入记忆能力。LangChain提供了ConversationBufferMemory等组件可以将历史对话记录作为上下文传入让智能体拥有“短期记忆”。验证与监控记录智能体的完整思考链Agent Scratchpad用于分析其决策过程。监控工具调用成功率、耗时和用户满意度。5. 安全与合规权限最小化智能体所能调用的工具其权限必须受到严格限制。例如一个查询天气的智能体不应有删除数据库的权限。输入输出过滤对用户输入和智能体输出进行内容安全过滤防止注入攻击或生成不当内容。数据隐私确保上传到RAG知识库的文档不包含敏感个人信息。如果使用云端LLM API需了解其数据隐私政策。人工审核回路对于创建工单、发送邮件等关键操作可以设计为“智能体生成草稿 - 人工确认 - 执行”的模式。6. 性能与成本缓存对频繁且结果不变的查询如产品手册内容进行缓存减少对向量数据库和LLM的调用。异步处理如果工具调用是IO密集型如网络请求使用异步async/await来提高并发性能。LLM调用成本选择适合的模型。简单的分类和路由任务可以使用小模型如gpt-3.5-turbo复杂的推理和生成再用大模型如gpt-4。关注Token使用量。从环境搭建到核心概念再到一个功能完备的RAG智能客服系统实战我们走完了完整的开发流程。关键在于理解Codex作为LLM接口、Agents作为决策与执行框架和RAG作为知识增强手段三者如何各司其职又协同工作。真正的挑战往往不在编码而在提示词打磨、工具设计、知识库构建和系统稳定性保障上。建议你以此项目为起点尝试接入真实的业务API处理更复杂的文档类型并引入记忆和流式输出等功能逐步构建起真正赋能业务的AI应用。