关于Agent开发的阶段性思考———从基础原理理解到高阶应用实践的谜思解构

关于Agent开发的阶段性思考———从基础原理理解到高阶应用实践的谜思解构

近期在工作闲暇之余一直在反思Agent开发以及相关的方向,Agent智能体开发难吗?在行业不断制造各种概念的今天,说难也难,难在模型本身概率输出的不可控属性,说简单大道至简,一语道破的话,核心就是Prompt的架构艺术。行业造了那么多概念,其实都是围绕着上下文工程展开,开发者还是要守正出奇,多透过现象看本质。

⚠️注意事项:因为是随笔,过于啰嗦,且模型和微调技术发展迭代较快,部分技术实效性可能存在偏差,只作主流方向和技术讨论。

现阶段的Agent智能体应用,目前本质上更多是在预设可控的工具的条件下,实现的一种通过大模型决策和执行任务的交互型应用。

关于多智能体的设计考量

奥卡姆剃刀定律(如无必要,勿增实体)角度以及从经济和实用性的角度来说,尽量选择单智能体,避免多智能体的方案,一个是token的消耗问题,还有一个是低耦合降低应用的复杂度。

一个好的Agent设计首先要考虑的就是具备非侵入性设计,非侵入性设计(Non-intrusive Design)是构建高可用、可持续演进的企业级 Agent 系统的核心原则:薄模型层,厚应用层。
这样做的优点很多:
1.低耦合与迭代空间: 将模型推理与业务逻辑解耦,确保底层模型升级或替换时,无需重构上层应用代码。
2.低成本与高扩展性: 通过配置化而非硬编码或微调来适应新场景,显著降低开发与维护成本,支持快速业务扩展。
3.经济性与基座无关: 避免供应商锁定,支持根据任务难度动态路由至不同性价比的模型,灵活应对价格波动。
4.多智能体协作灵活性: 基于标准协议通信,便于构建松耦合的多智能体网络,支持独立灰度发布、A/B测试及故障隔离。
5.顺应厂商设计哲学: 契合如 Anthropic 等厂商推崇的“上下文工程”与标准工具调用理念,最大化利用模型原生通用能力。
6.可观测性与调试透明: 决策路径、工具参数及思维链显式记录于应用层,像传统软件一样可逐行追踪和定位错误。
7.数据安全与隐私合规: 在应用层实现数据脱敏与过滤,确保敏感信息不直接暴露给模型,满足 GDPR 等合规要求。
8.确定性控制与护栏机制: 在模型输出与执行动作间插入中间件校验(如格式检查、敏感词过滤),确保系统鲁棒性。
9.知识更新实时性: 结合 RAG 技术,知识库变更秒级生效,无需重新训练模型即可回答最新业务问题。
10.长尾场景泛化能力: 保持模型通用推理能力,通过动态组装工具应对未见过的复杂或长尾场景,避免过拟合。

随着大语言模型(LLM)能力的飞速发展,AI 智能体(Agent)已经成为连接模型与现实世界的关键桥梁。一个典型的 Agent 不仅要能“思考”,还要能“行动”——调用外部工具获取信息、执行操作,最终完成复杂任务。然而,如何让模型在推理过程中动态地决定调用哪个工具、如何确保调用的顺序与安全性、如何高效地与后端服务交互,这些正是 Agent 开发的核心挑战。

以下将日常开发中的疑问以及难点进行系统化拆解,从最基础的 ReAct 模式开始,逐步深入到 Function Calling、MCP(模型上下文协议)、Skills 等进阶概念,梳理出一套完整的 AI Agent 开发流程,帮助开发者理解从“提示词工程”到“自主智能体”的演进路径。


第一部分:核心概念与技术基础

1.1 ReAct 模式:思考与行动的循环

ReAct(Reason + Act)是让模型具备工具调用能力的最经典范式。它的核心思想是通过提示词引导模型交替进行“推理”和“行动”,形成一个闭环:

  • 思考(Thought):模型根据当前状态分析下一步需要什么信息。
  • 行动(Action):模型输出一个结构化的指令,例如调用某个工具。
  • 观察(Observation):系统执行工具后,将结果反馈给模型,供其继续推理。

一个典型的 ReAct 提示词模板如下:

1
2
3
4
5
6
7
你是一个智能助手,可以调用以下工具:
- get_weather(location: string): 获取指定城市的天气。
- search_hotel(city: string): 搜索某城市的酒店。

请按照以下格式输出:
思考:...(你的推理过程)
行动:工具名[参数]

这种方式的优点是灵活、无需模型原生支持,但缺点是需要开发者自行解析模型输出的文本,且模型可能输出不规范导致解析失败。

1.2 Function Calling:结构化工具调用的演进

为了解决 ReAct 模式的不稳定性,主流模型厂商(如 OpenAI、Anthropic)推出了 Function Calling(又称 Tool Calling)功能。它的核心思想是:在 API 请求中通过 JSON 结构明确描述可用工具,模型在需要时直接返回一个结构化的 JSON 对象,而非混在文本中。

工具描述示例(JSON)

1
2
3
4
5
6
7
8
9
10
11
{
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"location": { "type": "string", "description": "城市名称" }
},
"required": ["location"]
}
}

模型返回的调用指令也是结构化的,例如:

1
2
3
4
5
6
7
8
{
"tool_calls": [{
"function": {
"name": "get_weather",
"arguments": "{\"location\":\"北京\"}"
}
}]
}
这种方式的优势在于:
  • 解析可靠,无需正则匹配;
  • 模型输出更精准,减少幻觉;
  • 参数格式明确,便于校验。

1.3 模型如何理解工具描述?

无论是 ReAct 还是 Function Calling,模型接收到的都是一段文本(JSON/YAML/TOML 等格式)。模型并非像传统程序那样“解析” JSON,而是将整个文本切分成 token,利用其在大规模预训练中习得的语义理解能力去“读懂”其中的结构含义。

例如,模型知道 "name" 后面跟着的是工具名,"description" 是对工具功能的解释。这种语义理解能力使得模型能够根据用户问题与工具描述的匹配程度做出调用决策。


第二部分:决策机制——模型如何选择工具?

2.1 关键词匹配的局限

早期的简单实现可能依赖关键词匹配:用户输入中出现“天气”就触发天气查询。这种方式在处理同义词、复杂意图或多步推理时无能为力,例如“明天适合穿什么衣服?”隐含了天气查询需求,但并未直接出现“天气”。

2.2 模型分析的原理

现代 Agent 利用模型本身的语义理解能力进行工具选择,过程如下:

  1. 意图识别:模型理解用户的真实需求。例如“北京今天会下雨吗?” → 意图是查询天气。
  2. 实体抽取:从文本中提取关键参数,如地点“北京”。
  3. 工具匹配:模型将用户意图与工具描述进行语义比对,选择最合适的工具,并填充参数。

这一过程完全是模型内在的推理,无需人工规则。

2.3 Function Calling 的工作流程

以查询天气为例,完整流程如下:

  1. 开发者定义工具:通过 API 将工具描述(JSON)传给模型。
  2. 用户输入:用户提出问题。
  3. 模型决策:模型判断需要调用 get_weather,并生成参数 {"location": "北京"}
  4. 系统解析:提取工具名和参数。
  5. 执行工具:调用后端服务获取真实天气数据。
  6. 结果反馈:将结果作为“观察”返回给模型,模型生成最终答案。

第三部分:构建可靠的 Agent 系统

3.1 安全性设计

将工具暴露给模型可能带来安全风险,必须建立多层防御:

  • 最小权限原则:只给模型提供当前任务必需的工具,而非所有工具。
  • 工具分级:将工具分为低风险(查询类)和高风险(修改/删除/支付类),高风险操作需用户二次确认。
  • 沙箱执行:对于模型生成的代码或敏感操作,应在隔离环境(如 Docker、WebAssembly、Firecracker 微VM)中运行。
  • 动态凭证:模型不接触真实密钥,由系统根据上下文动态注入临时凭证。
  • 输入输出校验:对模型生成的参数进行格式、范围校验;对工具返回的数据进行脱敏过滤。

3.2 准确性与鲁棒性

  • 精心设计工具描述:使用清晰的名称、详细的描述、参数示例,帮助模型准确理解。
  • 错误反馈循环:当工具调用失败(如参数非法)时,将错误信息返回给模型,让其重新尝试或修正。
  • 多步推理与自我反思:引导模型显式输出思考过程,必要时让模型评估调用结果是否满足需求。

3.3 成本与性能优化

ReAct 和 Function Calling 都会消耗大量 token(特别是历史记录累积)。优化策略包括:

  • 滑动窗口:只保留最近几轮对话,丢弃过旧的上下文。
  • 摘要历史:用模型将长历史压缩成摘要。
  • 分层规划:先用一个强大模型生成执行计划,再由轻量模型按计划调用工具,减少反复调用。
  • 微调专用模型:针对固定工具集微调小模型,降低成本。

第四部分:进阶架构——MCP 与 Skills

4.1 MCP:标准化工具接入

MCP(Model Context Protocol)是由 Anthropic 提出的开放协议,旨在解决工具接入的碎片化问题。它定义了工具的标准格式和通信方式,让模型能够以统一的方式调用任何符合 MCP 标准的服务。

MCP 的角色

  • 工具描述标准化:所有工具都通过相同的 JSON 结构描述。
  • 协议统一:工具调用请求通过 JSON-RPC 传输,与具体实现语言无关。
  • 动态发现:MCP 客户端可以查询可用的工具列表。

在 MCP 架构中,模型返回的 tool_calls 由 MCP Client 转发给对应的 MCP Server 执行,结果再返回给模型。

4.2 Skills:模块化任务流程

即使有了工具,模型在处理复杂任务时仍可能不知道正确的调用顺序。Skills 正是为此而生——它是一个模块化的“能力包”,包含:

  • 元数据:技能的名称和简短描述。
  • SKILL.md:核心指令文档,告诉模型在特定任务中应该按什么步骤调用哪些工具。
  • 相关资源:示例、参考文档等。

Skills 的运作流程

  1. 系统加载所有技能的元数据(轻量级清单)。
  2. 根据用户问题,匹配最相关的技能。
  3. 动态加载该技能的 SKILL.md 到上下文。
  4. 模型根据技能指引,按顺序生成工具调用。

Skills 解决了“执行顺序”和“模块化”问题,让模型能够遵循专家级流程完成复杂任务。

4.3 MCP 与 Skills 的协同

结合 MCP 和 Skills,一个完整的 Agent 工作流如下:

  1. 用户输入:例如“分析特斯拉股票并生成简报”。
  2. 技能匹配:系统匹配到 financial_analysis 技能,加载其 SKILL.md。
  3. 构建提示词:将用户问题、技能指令、工具列表(来自 MCP)合并后发给模型。
  4. 模型决策:模型根据技能指引,依次输出工具调用(如 get_stock_datacalculate_ratiosgenerate_charts)。
  5. MCP 转发:MCP Client 将每次调用转发给对应的 MCP Server。
  6. 结果返回:工具执行结果通过 MCP 返回给模型,模型逐步推理并最终生成简报。

第五部分:头脑发散

5.1 多模态输入的处理

现代 Agent 需要处理图像、文档等多模态数据。当用户上传图片时,系统通常通过两种方式传递给模型:

  • 二进制流:将图片数据作为请求的一部分发送。
  • URL:提供图片的在线地址。

模型后端通过视觉编码器(如 ViT)将图像转换为视觉 token,再与文本 token 拼接,利用跨模态注意力机制理解图文关系。这一过程对开发者透明,但需要注意不同模型对图像尺寸、格式的限制。

5.2 模型自主生成工具的可能性

作为开发者会自然有个疑问:“能否让模型自己生成工具函数并执行?”,这正是 Agent 的未来方向之一
目前已有探索(如代码解释器、ToolMaker),但面临安全性和可控性挑战。解决方案包括:

  • 沙箱隔离:生成的代码在受限环境中执行。
  • 策略约束:通过类似 Skills 的方式框定权限范围(如只允许生成数据处理类工具)。
  • 动态注册:模型生成工具描述后,需经审核才能注册为 MCP 服务。

这相当于让模型从“使用工具”进化为“创造工具”,但必须在严格的安全边界内,重点是限定责任主体,要解决安全和可控的问题。

5.3 Agent 开发的本质:构建 Prompt 的艺术

回顾整个过程会发现:无论采用 ReAct、Function Calling、MCP 还是 Skills,所有工作的最终产出都是一个被精心构造的 Prompt。这个 Prompt 包含了任务描述、工具说明书、执行流程指南,全部以文本形式输入给模型。模型的理解能力决定了 Agent 的成败,而开发者的价值在于通过 Prompt 工程最大化发挥模型的能力。


第六部分 从思考到执行:大模型智能体中推理过程的可视化与 RDBMS 数据库操作的安全实践

数据智能体谜思

随着大语言模型(LLM)能力的不断增强,智能体(Agent)应用正从简单的问答向自主执行复杂任务演进。在这一过程中,模型需要将内在的推理能力与外部工具(如数据库、API)结合,形成“思考-行动-观察”的闭环。然而,如何清晰地呈现模型的推理过程?如何确保自然语言到数据库查询(Text-to-SQL)的准确转换?当操作从查询扩展到数据修改时,又如何守住安全底线?本文将从这三个核心问题出发,循序渐进地探讨大模型智能体在数据库操作场景下的设计原则与最佳实践。


一、双引擎:模型自身推理与 ReAct 模式的关系

1.1 概念界定

  • 模型自身推理:指大模型在生成最终答案前,内部产生的思维链(Chain-of-Thought, CoT)。它是模型的“黑盒思考”,通常包含逻辑推导、中间结论、自我质疑等。
  • ReAct 模式:一种智能体设计框架,全称“推理+行动”(Reason+Act)。它引导模型交替进行推理和工具调用,并将外部观察结果作为下一轮推理的输入,形成循环。

1.2 两者关系:引擎与方向盘

可以把模型自身推理比作汽车的引擎——它提供动力(理解、生成、逻辑能力),而 ReAct 模式则是方向盘和路线图——它规定了解问题的宏观结构(思考→行动→观察→再思考)。没有引擎,方向盘毫无意义;没有方向盘,引擎只能直线前进,无法应对复杂路况。

在实践中,ReAct 模式通过提示词(prompt)将模型的自由推理引导至预设的轨道上,让模型不仅“想”,还能“做”。

1.3 对话中的呈现策略

为了让用户既了解进度又不被技术细节淹没,我们采用分层呈现原则:

  • 内部思维链(模型自身推理):默认隐藏,放入可折叠的“显示思考过程”面板。这既满足了专业用户的深度需求,也避免了主对话的冗杂。
  • 外部行动(ReAct 模式中的工具调用):实时展示在动态状态面板,例如:“正在搜索天气数据…”、“已调用 SQL 生成器,正在构建查询…”。行动完成后,再在主对话区输出最终整合的回答。

这种设计使用户能感知智能体的工作进度,同时保持对话的简洁性。


二、Text-to-SQL:从自然语言到数据库查询的智能转换

2.1 核心挑战

将自然语言转换为 SQL 查询(Text-to-SQL)是数据库智能体的核心能力,但也面临四大挑战:

  • 自然语言的歧义性:“上个月卖得最好的产品”——“上个月”是自然月还是过去30天?“最好”是按销售额还是销售量?
  • Schema 的复杂性:大型数据库可能有数百张表,字段命名可能不直观(如 prod_cd 代表产品代码)。模型需准确映射到正确的表和字段。
  • SQL 语法的精确性:多表 JOIN 条件、聚合函数、WHERE 子句的逻辑关系必须准确无误,否则会导致语法错误或逻辑错误。
  • 数据安全与权限:生成的 SQL 必须符合用户权限,避免越权查询或注入攻击。

2.2 ReAct 模式如何提升准确性

ReAct 模式通过“推理-行动-观察”循环,将 Text-to-SQL 分解为多个可控步骤:

2.2.1 多步推理分解复杂查询

模型内部先进行显式推理:

用户想查“上个月每个品类的销售额” → 需要先确定“上个月”的时间范围 → 找到“销售额”字段(可能在订单明细表)→ 按品类分组聚合。

2.2.2 工具调用:按需获取 Schema 信息

模型不必记忆整个数据库结构,而是通过工具动态查询:

  • 行动:调用 get_table_schema("products") 查看 products 表字段。
  • 观察:发现字段 category_idcategory_name,从而确定如何关联类别表。
2.2.3 生成 SQL 后的验证与反思

模型生成 SQL 后,进入验证阶段:

  • 行动:调用 validate_sql_syntax(sql) 检查语法。
  • 观察:若报错,则反思错误原因,修正后重新生成。
  • 甚至可以执行 EXPLAIN 或采样查询,提前发现问题。
2.2.4 结合用户反馈修正

当执行结果不符合预期时,模型主动引导用户补充信息,进入下一轮推理。

2.3 对话中的呈现技巧

  • 展示生成的 SQL:以可折叠的代码块呈现,并标注“这是我理解的查询,即将执行的 SQL:”。允许高级用户编辑 SQL 后重新执行。
  • 分步推理展示(可选):提供“显示思考过程”折叠面板,展示模型的多步推理,增加透明度。
  • 结果解释:执行后附上一句解释,帮助用户理解数据与问题的对应关系。若结果为空,说明可能原因并提出建议。

三、安全升级:当操作从“读”扩展到“写”

对于查询(SELECT),即使 SQL 出错,最坏结果也只是查不到数据;但对于写操作(INSERT/UPDATE/DELETE),一旦出错可能导致数据污染、误删甚至业务瘫痪。因此,写操作必须采用更为严格的安全方案。

3.1 核心原则:读写分离,人机协同

绝不让模型直接执行写操作 SQL。模型应扮演“智能解析器”角色,负责理解意图和提取参数,而最终执行权由受控的后端代码和人工审批流程掌控。

3.2 分层安全方案

3.2.1 架构隔离:只读账号

为模型分配的数据库账号默认只有 SELECT 权限,从物理上杜绝写操作。写操作必须通过专门的后端 API 进行。

3.2.2 自然语言转“参数化命令”

不让模型拼接 SQL,而是让模型输出结构化的意图 JSON:

1
2
3
4
5
{
"action": "update_order_status",
"order_id": "12345",
"new_status": "已发货"
}

后端接收到 JSON 后,通过预编译的、参数化的 SQL 执行修改。这样 SQL 结构固定,模型只能影响参数值,大大降低了风险。

3.2.3 预览与二次确认

对于高风险操作,执行前生成修改前后的数据对比,要求用户点击“确认修改”后才真正提交。这属于关键的人机协同环节。

3.2.4 事务与“试运行”

利用数据库事务特性:

  • 开启事务(BEGIN
  • 执行写操作
  • 让用户或程序校验结果(例如预览受影响数据)
  • 若不符则回滚(ROLLBACK),确认无误后提交(COMMIT
3.2.5 多人审批流

对于极敏感操作(如删除用户、批量调价),接入正式审批流程,需主管或管理员审批通过后,后端才执行。

3.2.6 审计日志

记录所有由模型触发的数据库操作,包括操作人、自然语言原文、生成的 SQL/JSON、执行时间、影响行数等,便于追溯和审计。

3.3 写操作安全流程示例

  1. 意图识别:模型判断用户请求为“修改订单状态”。
  2. 参数抽取:模型输出 JSON 意图,而非 SQL。
  3. 权限校验:后端检查当前用户是否有修改该订单的权限。
  4. 预览与确认:生成修改前后对比,要求用户二次确认。
  5. 安全执行:后端通过参数化 API 执行更新。
  6. 结果通知:执行成功,通知用户,并记录审计日志。

通过这一流程,模型实现了智能解析,而安全底线由可控的后端和人工把关共同守护。


四、总结与展望

大模型智能体的魅力在于将强大的内在推理能力与外部工具结合,从而完成复杂任务。在数据库操作场景中,我们通过 ReAct 模式将模型推理结构化,通过分层呈现让用户理解智能体的工作过程,通过读写分离与审批机制确保数据安全。

未来,随着模型能力的提升和工具的成熟,我们可以期待:

  • 更精细的权限控制:基于自然语言的动态权限判断。
  • 多轮交互修正:模型与用户在数据操作过程中进行深度协作。
  • 可视化数据操作:不仅返回文本结果,还能通过图表、仪表盘等形式呈现数据,提升用户体验。

从思考到执行,每一步都需要精心设计。只有当推理透明、行动可控、安全到位时,大模型智能体才能真正成为值得信赖的数据助手。


个人心得感悟

其实Agent从技术开发的角度来说没什么太多神秘的东西,行业迄今造了那么多规范和概念,核心之有一点,系统化告诉大模型需求,发挥大模型的 “思维引擎” 能力尝试去理解人类的需求,仅此而已。

AI Agent 的开发是一个从“让模型能调用工具”到“让模型会规划任务”的演进过程。从 ReAct 的简单循环,到 Function Calling 的结构化交互,再到 MCP 和 Skills 带来的标准化与模块化,每一步都在让智能体更加自主、可靠、高效。

未来,随着模型能力的提升和安全机制的发展,Agent 将能够动态创造工具、自主适应新环境,成为真正的通用问题解决者。而开发者需要持续关注 Prompt 设计的艺术与工程实践的平衡,在释放模型潜力的同时守住安全与可控的底线。

关于Agent开发的阶段性思考———从基础原理理解到高阶应用实践的谜思解构

https://www.wdft.com/6af1f49.html

Author

Jaco Liu

Posted on

2026-03-06

Updated on

2026-03-08

Licensed under