AI Agent开发实战:从ReAct手写循环到Dify知识库

发布时间:2026/9/9 18:22:42
AI Agent开发实战:从ReAct手写循环到Dify知识库 进入2026年AI Agent智能体开发已经不再是一个停留在论文里的概念而是实实在在出现在企业知识库问答、客服工单处理、业务流程自动化、代码审查等场景中。大量招聘JD里开始出现Agent开发、智能体搭建、Function Calling、RAG、多智能体协作等关键词也有越来越多开发者想从零系统学习这条技术路线。不过搜索AI Agent教程时容易被各种平台、框架和概念术语搞晕。LangChain、Dify、Coze、扣子、WorkBuddy、Hermes这类词经常混在一起出现反而让人不知道从哪里开始。下面从概念开始逐步带出一个可运行的智能体项目。完成之后你应该能独立完成一个带有工具调用和知识库问答能力的Demo并且知道怎么把它往生产环境推进。整个学习路径不要求先啃完整本框架文档而是用“最小闭环”的方式把Agent最核心的运行逻辑先跑通。1. 先把AI Agent和普通对话框拆开看1.1 通俗理解智能体是“能干活”的AI普通对话框AI只负责聊天回答完就结束。智能体则不同它拿到一个目标后会把任务拆解成步骤自己去查询数据、调用接口、读取文档直到把结果交付出来。比如你问“帮我查一下最近一周服务器CPU峰值”普通大模型只能给出“你需要查看监控平台”之类的建议而一个智能体可以直接调用监控API拉取数据、计算峰值然后返回一张表格或一句结论。差别就在“从建议变成执行”。这里有一个容易被误解的点智能体不是某个具体模型而是一种以模型为“大脑”的程序结构。同一个模型写在不同结构的程序里可能表现为聊天机器人也可能表现为智能体。所以在学习时核心要学的是编排逻辑而不只是模型API怎么调。1.2 技术定义LLM、规划、记忆、工具、执行AI Agent通常由四部分构成规划把用户目标拆成子任务决定先做什么后做什么。记忆保存上下文、历史对话、状态信息分短期记忆和长期记忆。工具给模型暴露API、函数、数据库查询、网页搜索等外部能力。执行调用工具、接收结果、继续判断直到任务完成。其中“工具”是智能体区别于普通聊天机器人的关键。模型自己不会查数据库也不会调用第三方接口但通过函数描述它可以把“自然语言意图”转成“结构化工具调用”然后把工具返回的结果再组织成回答。这个能力在OpenAI API里叫Function Calling在很多框架里也叫Tool Calling或Tool Use。一个最小的Agent运行过程可以简化为用户输入目标。模型判断需要调用哪个工具。程序执行工具并拿到结果。模型根据结果生成下一步动作或最终回答。循环继续直到模型认为任务完成。1.3 三个容易混淆的概念Agent、RAG、工作流学习时经常见到Agent、RAG、工作流这三个词它们的边界需要区分。RAG检索增强生成解决的是“模型知识不够”的问题。它的做法是先从知识库检索相关内容再拼进Prompt让模型生成答案。它本身不强调规划也不一定调用工具。工作流是“提前编排好的固定流程”比如先查订单再判断退货资格最后生成处理意见。每一步是确定的模型只在部分节点参与。Agent则更强调“动态决策”模型每一步根据当前情况决定下一步调用什么工具、什么时候结束。它可以把RAG作为一项工具也可以把一条工作流封装成一个工具。用一个表格快速区分概念解决什么问题核心特点是否动态规划RAG补充私有知识检索生成弱工作流固定流程自动化节点确定弱Agent多步自主任务规划工具记忆强现在很多产品其实是“工作流Agent”混合比全自动Agent更容易控制也比纯工作流更灵活。学习时不要只追求“是不是真Agent”更重要的是看它能不能稳定解决业务问题。2. 2026年学习AI Agent开发的技术栈和路线2.1 零基础开始前要补齐什么知识如果完全没有编程基础不建议一上来就读源码或追新框架。先把下面这几项练熟Python基础变量、函数、列表/字典、异常处理、requests库调用HTTP接口。基本API使用会调用大模型API理解messages、role、content、max_tokens等参数。JSON操作大模型工具调用返回的是JSON结构要会解析和校验。命令行和Git能创建虚拟环境、安装依赖、运行脚本、提交代码。简单数据库概念知道表、字段、索引理解向量数据库和关系型数据库的区别。如果已经会Python可以直接跳到第二节。不要一上来就学LangChain源码先跑通一个最小例子再逐步增加复杂度。2.2 主流开发框架与平台怎么选2026年的Agent开发工具可以分为两类代码框架和低代码平台。常见选择如下方向代表适合场景学习成本代码框架LangChain、LlamaIndex、AutoGen、MetaGPT深度定制、生产集成、复杂逻辑中高代码基础库OpenAI SDK、Anthropic SDK、国内模型SDK简单工具调用、极少数Agent低低代码平台Dify、Coze/扣子、FastGPT、MaxKB产品原型、知识库Agent、快速上线低企业级平台腾讯WorkBuddy、Hermes、Evox等具体业务场景、商业产品看官方文档平台类产品变化很快本文不针对某个商业平台展开。搜索材料里出现的Hermes、WorkBuddy、Evox、DSH等是否支持某个功能、怎么部署都要以官方文档为准。学习通用方法论之后这些平台的上手成本会低很多。实际项目里代码框架和低代码平台不是非此即彼。很多团队先用Dify验证业务再把核心流程用LangChain/SDK重写或者反过来把LangChain写的流程暴露成API给Dify调用。2.3 本机开发环境准备开发环境不需要太复杂。推荐使用Python 3.10或3.11并创建独立虚拟环境python3 -m venv agent-env source agent-env/bin/activate pip install --upgrade pip pip install openai langchain langchain-openai需要用到向量数据库时可以先在本地安装Chroma或使用Docker启动Qdrantdocker run -p 6333:6333 -p 6334:6334 qdrant/qdrant如果不想本地安装也可以直接使用云端向量数据库。大模型API和向量数据库的具体地址、密钥每个项目不一样学习阶段建议把配置放到环境变量里不要写进代码。export OPENAI_API_KEY你的密钥 export MODEL_NAMEgpt-4o-mini如果是国内模型则把BASE_URL也配置好。不同模型的函数调用参数略有差异落地前要确认版本。2.4 建议的学习阶段与练习项目只读不练很难学会Agent。建议按下面顺序完成四个练习让模型做一道数学题体验普通对话和高级推理的区别。给模型加一个计算器工具体验Function Calling。做一个“查天气Agent”体验多步循环和错误重试。做一个“知识库问答Agent”把PDF文档导入向量数据库再让Agent检索后回答。每个项目控制在两到三天内完成。完成后再考虑多智能体、复杂记忆和流程编排。3. 从零手写一个最小可运行的ReAct智能体3.1 最小闭环目标与目录结构这一节的目标不是引入LangChain而是用OpenAI SDK直接写一个能“思考-调用工具-继续思考”的循环。因为理解了底层循环后面用框架时才不会觉得它是一个黑盒。假设要实现两个工具一个计算器一个查询城市天气的模拟函数。用户输入“北京今天多少度再加10度是多少”智能体需要先调用天气查询工具再调用计算器最后返回结果。目录结构minimal_agent/ ├── agent.py ├── tools.py └── .envtools.py里放工具定义和实际函数agent.py里放Agent循环。3.2 用OpenAI格式定义工具以OpenAI风格为例工具描述是一个JSON数组。每个工具有type、function.name、function.description、function.parameters。# tools.py def get_weather(city: str) - str: # 这里模拟真实天气查询 if city 北京: return 北京当前25度晴 return f{city}当前20度多云 def add(a: int, b: int) - int: return a b tools [ { type: function, function: { name: get_weather, description: 查询指定城市的当前温度, parameters: { type: object, properties: { city: {type: string, description: 城市名} }, required: [city] } } }, { type: function, function: { name: add, description: 两数相加, parameters: { type: object, properties: { a: {type: integer}, b: {type: integer} }, required: [a, b] } } } ]这里的关键是description。模型靠它判断什么时候调用哪个工具描述越清晰调用越准确。不要写“通用处理函数”这种模糊描述。3.3 实现ReAct循环Agent循环的核心逻辑是把用户消息和工具结果都追加到messages反复让模型决策直到它不再请求工具。# agent.py import json import os from openai import OpenAI from tools import tools, get_weather, add client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) def call_tool(name: str, arguments: dict): if name get_weather: return get_weather(**arguments) if name add: return add(**arguments) raise ValueError(f未知工具: {name}) def run_agent(user_input: str, max_steps: int 5): messages [{role: user, content: user_input}] for _ in range(max_steps): response client.chat.completions.create( modelos.getenv(MODEL_NAME, gpt-4o-mini), messagesmessages, toolstools, ) message response.choices[0].message messages.append(message) if not message.tool_calls: print(最终回答:, message.content) return message.content for tool_call in message.tool_calls: name tool_call.function.name arguments json.loads(tool_call.function.arguments) result call_tool(name, arguments) print(f调用工具 {name}参数 {arguments}结果 {result}) messages.append({ role: tool, tool_call_id: tool_call.id, content: str(result) }) raise RuntimeError(超过最大步骤数) if __name__ __main__: run_agent(北京现在几度在这个温度上加10度结果是多少)这里有几个关键点messages里包含assistant返回的tool_calls也必须包含后续的tool结果否则模型无法理解工具调用过程。每轮循环都要重新调用API直到模型输出不含tool_calls的普通消息。max_steps是防止死循环的保险丝。没有它模型可能一直“调用工具-再调用工具”浪费大量token。3.4 运行结果与验证运行下面命令export OPENAI_API_KEY你的密钥 python agent.py正常输出类似调用工具 get_weather参数 {city: 北京}结果 北京当前25度晴 调用工具 add参数 {a: 25, b: 10}结果 35 最终回答: 北京现在是25度加10度后是35度。如果只看到最终回答而没有任何工具调用说明Prompt或工具描述有问题。可以打印messages逐条检查模型到底选择了什么。3.5 新手最容易写错的三处细节第一忘记把tool结果追加进messages。结果是模型像“失忆”一样重复问或者报错。第二工具函数与描述的参数类型不一致。JSON里声明integerPython函数却写str执行时会出错。第三没有设置max_steps遇到模型反复调用工具时API成本失控。4. 用Dify搭建可落地的知识库Agent4.1 为什么需要低代码平台手写Agent适合学习但做企业级知识库Agent时还要处理文档解析、分段、向量化、检索排序、引用溯源、用户会话管理等功能。自己从零实现并不难但工作量大。这时候用Dify这类低代码平台可以快速把“文档上传-切片-向量化-检索-生成回答”整条链路搭出来。Dify不仅是聊天应用它支持Agent、工作流、知识库和工具调用并且能通过API发布。搜索热词里反复出现Dify智能体平台说明它已经成为2026年前后学习Agent的主流选择之一。4.2 Docker Compose安装DifyDify官方提供Docker Compose启动方式。先把代码拉下来git clone https://github.com/langgenius/dify.git cd dify/docker cp .env.example .env docker compose up -d启动完成后打开http://localhost/install按页面提示设置管理员账号。如果8000端口被占用要去.env里调整端口映射。学习环境这样够用。生产环境至少要加HTTPS、数据库外部化、模型密钥管理和日志采集不要把默认密码留在公网。4.3 配置模型供应商进入Dify控制台后先配置模型供应商。在“设置-模型供应商”里选择对应的服务商填入API Key。如果你的模型服务是OpenAI兼容格式可以选“OpenAI-API-compatible”类型然后填Base URL。这一步最容易出错的地方是模型名和API格式不匹配。有些模型服务需要填完整的Model ID有些只填模型版本。如果填错测试对话时会直接报模型调用失败。4.4 上传知识库并选择向量数据库创建知识库后上传PDF、Markdown或TXT文档。Dify会先切分文本再调用Embedding模型将向量写入向量数据库。默认本地可以用weaviate或qdrant等。如果只是本地体验Docker Compose里已经包含了向量数据库配置生产环境需要单独维护。这里要理解一个关键点知识库问答不是把整篇文章存进数据库后“让模型去读”而是把文档切成片段再为每个片段生成向量。用户提问时系统把问题也向量化检索最相似的TopK片段最后把片段拼进Prompt生成回答。这也是为什么很多企业在问“企业知识库存放在向量数据库吗”答案通常是要的但只有向量还不够还需要保存原文和元数据用于引用溯源。4.5 创建Agent并绑定工具在Dify里创建“Agent”应用把模型选择好然后在“工具”里开启需要的能力。比如开启“天气查询”“计算器”“网页搜索”或自定义API工具。之后给Agent写一个系统提示词明确它的职责、回答风格和不能做的事情。系统提示词示例你是企业IT支持助手。 你可以查询内部知识库中的常见问题文档。 如果问题涉及设备型号或版本一定要在回答中引用信息来源。 如果知识库里没有明确答案直接告诉用户需要转人工不要编造。然后做一轮测试提问“员工电脑怎么重置密码”。观察回答是否引用知识库、是否回答格式正确。Dify的调试面板可以查看检索到了哪些文档片段这是排查回答质量的重要入口。4.6 通过API对外发布Dify应用可以发布为API。在应用“访问API”页面拿到API密钥和调用地址下面是调用对话接口的示例curl http://localhost/v1/chat-messages \ -H Authorization: Bearer app-xxx \ -H Content-Type: application/json \ -d { inputs: {}, query: 员工电脑怎么重置密码, response_mode: blocking, user: test-user }返回里会包含answer和检索引用。把这段接口接到企业IM、客服系统或前端聊天框就完成了从Demo到可调用服务的第一步。注意生产环境不要直接把应用密钥写在前端应该由后端代理调用。5. 把Agent从Demo推进到工程化记忆、知识库和多智能体5.1 记忆设计短期、长期和会话持久化Agent要连续对话记忆是绕不开的。短期记忆通常就是messages数组每次请求都携带。问题在于上下文长度有限对话一长成本也会上涨。所以工程上要把历史会话做摘要、滑动窗口或按重要程度裁剪。长期记忆则需要持久化。可以把用户偏好、任务状态、业务标签存到关系型数据库或向量数据库。比如一个销售智能体需要记住客户最近关注的产品线还要在下次联系时继续跟进。实现方式是每次对话结束后抽取结构化信息入库下次对话时先检索再拼接进Prompt。5.2 知识库为什么要依赖向量数据库向量数据库的本质是把文本变成高维向量然后通过“向量距离”找到语义相似的文本。它适合开放式的语义检索比如“系统登录失败该怎么办”和“用户老是登不上去应该排查什么”这类说法不同但意思相近的查询。但不要把业务主数据全部放进向量数据库。订单、用户信息、库存数量这类精确数据应该用SQL查而不是靠语义近似猜。正确做法是让Agent决定精确查询走API或SQL模糊知识走向量检索。一个Agent内可以同时拥有这两类工具。5.3 多智能体协作的常见模式多智能体不是越多越好。常见的几种模式模式工作方式适合场景单Agent多个工具一个大脑调用各种工具大部分业务Agent编排者-执行者一个协调Agent分派给多个子Agent复杂任务需要专业分工流水线按固定顺序让每个Agent处理一个环节内容生成、审核流程辩论/评审多个Agent从不同角度输出并互相检查方案评审、代码审查实现多智能体时每个子Agent仍然要有明确的职责和输出格式否则容易出现“多个模型互相甩锅”的情况。实际项目中能用一个Agent解决的不要为了技术炫技拆成多Agent。5.4 生产环境架构的关键问题把Agent放到生产环境要从几个角度看模型访问统一封装模型网关切换模型不影响业务代码。工具权限每个Agent能调用哪些工具要配置清楚不能所有工具全开放。数据隔离企业知识库要按租户或部门隔离检索时加权限过滤。成本控制给Agent设定单次任务预算和最大步骤数。异常兜底工具调用失败时要有重试策略和人工转交入口。这些建议不需要一次性全部实现但设计架构时就要有一个演进计划。6. 智能体测试、评估、部署和监控6.1 测试集怎么设计Agent测试和普通单元测试不同难点在于输出不固定。不能用“字符串完全相等”来判断对错。一般做法是准备一组“输入-期望行为”的用例关注结果是否正确、是否调用了正确工具、是否引用了正确知识。测试集至少包括四类标准问答正常的业务问题期望回答准确。边界输入缺参数、模糊表达、重复提问。需要工具的场景验证工具选择、参数解析、结果解读。恶意或危险输入验证Agent不会执行未授权操作不会泄露Prompt。另外可以设计一个小的回归集每次修改Prompt或模型版本后跑一遍。没有回归集时经常出现“这次回答变好了但另一个场景变差了”。6.2 评估指标如何选常见指标指标含义使用场景工具调用成功率模型正确选择并执行工具的比例Function Calling效果评估检索命中率相关文档是否出现在TopK知识库质量评估回答忠实度回答是否基于检索内容不编造RAG评估任务完成率端到端是否完成目标整体评估延迟和成本平均耗时、单次token消耗生产监控从“能用”到“好用”评估体系比单条测试更重要。可以先用大模型作为裁判给回答打分再抽样人工审核。6.3 部署为API服务并容器化如果手写Python Agent可以用FastAPI包一层from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class Query(BaseModel): text: str app.post(/agent) def ask(query: Query): result run_agent(query.text) return {answer: result}然后用Docker构建镜像FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8000]启动容器后把服务注册到网关或K8s里再做健康检查和自动扩缩容。低代码平台应用则直接通过平台的API发布不需要单独写服务但同样要处理鉴权和限流。6.4 日志监控与中间过程追踪Agent的问题在回答里往往看不出根源。一定要记录中间过程包括用户原始输入每一步的模型输出或工具调用参数工具返回结果最终回答耗时和token消耗有了这些信息才能回答“为什么它调了错误的工具”“为什么检索到无关片段”“为什么回答不稳定”。可以用结构化日志输出JSON行再接入Elasticsearch、Loki或云日志服务。在开发环境先打印到控制台即可。6.5 学习环境与生产环境差异清单维度学习环境生产环境模型Key写在环境变量密钥管理服务或网关知识库本地小文件定期更新、版本控制日志print结构化采集、统一搜索安全不考虑权限隔离、防注入、内容审核部署本地脚本容器化、CI/CD、监控告警数据测试数据真实数据脱敏与备份7. 从现象到根因智能体常见问题排查7.1 模型不调用工具或调用错工具现象用户提问明明需要查天气模型直接编了一个温度。原因可能包括工具描述不清、用户Prompt不明确、模型版本不支持工具调用、工具参数类型错误。检查顺序是先看日志里模型是否返回tool_calls再看工具描述是否足够具体最后换更强模型测试。解决方式在工具描述中举例说明“当用户问天气时使用get_weather”同时把用户Prompt解析成结构化指令。7.2 输出不符合预期和上下文超限现象Agent回答绕圈、重复、丢掉前提或请求报context length exceeded。原因messages不断累积历史太长系统提示词和检索内容都挤在一个上下文里。解决方式是做历史裁剪、摘要和关键信息提取把知识库片段控制在合理长度。如果确实需要长文本处理先压缩再放入Prompt。7.3 知识库检索命中差现象知识库明明有内容Agent却回答“不知道”。检查方向是切分粒度、Embedding模型和检索TopK值。切分太碎语义可能不完整切分太大检索噪声增加。Embedding模型和问题类型不匹配也会导致效果差。先在Dify调试面板看检索片段哪一步出了问题再调整分段大小和检索参数。7.4 线上延迟高与成本失控现象请求耗时十几秒账单增长快。原因可能是模型选择过大、工具调用模拟过程过于复杂、Agent循环次数过多。解决方式是设置max_steps优先用更快的模型完成简单任务对复杂任务再升级到更大模型。给工具调用加缓存相同问题在短时间内可以直接返回结果。用一张表汇总常见问题问题现象常见原因检查方式处理建议不调用工具描述不清/模型不支持查看tool_calls日志优化描述、换模型调用错工具参数歧义打印工具选择过程增加限制条件、示例上下文超限消息累积统计消息条数和token裁剪历史、摘要化检索不准切分/向量不匹配查看检索片段调整切分、模型、TopK高延迟模型大、循环多记录每步耗时限步骤、换小模型、加缓存8. 面向就业的技能树、作品集和面试重点8.1 智能体开发工程师技能清单结合招聘要求智能体开发工程师需要具备LLM基础Token、上下文窗口、Temperature、System Prompt、Fine-tuning概念。工具调用Function Calling/Tool Calling原理与调试。RAG文档解析、切分、向量化、检索、重排、引用溯源。工程能力Python、API设计、数据库、Docker、部署。评估优化测试集设计、评估指标、Prompt调优。场景理解客服、销售、运维、代码生成等业务场景的落地方法。这里不是要求每项都精通至少把第一、二、三项和工程基础练扎实。8.2 面试常见问题和回答思路面试中常见问题包括“Agent和普通对话模型有什么区别” 回答要突出规划、工具、记忆和行动闭环。“为什么不直接调LLM API还要用LangChain或Dify” 说明框架解决的是编排、复用和可观测性问题。“RAG流程中检索不准确怎么优化” 从切分、Embedding、重排、Prompt改写等角度回答。“如何设计一个客服Agent” 先拆需求再选工具再设计知识库、人工兜底和评估方案。“多智能体一定比单智能体好吗” 说出适用场景和成本问题展示工程判断力。面试时不要背概念给出一个你亲手做过的项目说明遇到什么问题、怎么排查、效果如何。8.3 拿得出手的作品集怎么准备不要只放课程笔记要放“可运行可验证有数据”的项目。建议准备两个第一个是手写的最小Agent代码在GitHubREADME里说明运行方式并录一段演示。第二个是知识库Agent部署成可访问的Demo放一个公开链接附测试用例和评估结果。如果你做过多智能体或复杂工作流把这些放在第三个。作品集里面重点写“决策过程”比如为什么选这个框架、为什么用这个向量库、测试时发现了什么问题。这是和普通项目列表拉开差距的关键。8.4 后续学习方向掌握一个Agent闭环后下一步可以扩展三个方向一是记忆和持久化二是多智能体协作与流程编排三是Agent安全与权限控制。关注趋势时不要追着每个新框架跑先把一套闭环跑通、跑稳。对新手来说最有价值的练习不是看完一套视频而是把一个Agent从能跑改到跑得稳。先完成一个最小示例再补知识库再上线这个过程会踩完大部分隐藏的坑。等你能把一次工具调用错误从日志里定位出来你对AI Agent的理解就已经超过大多数只停留在概念阶段的人。