以下是对四个紧密关联的大模型交互与推理技术------Prompt 工程、Function Calling、ReAct、Self-Refine------的系统化讲解。它们常被组合使用以提升大语言模型(LLMs)在复杂任务中的表现,尤其在构建智能 Agent 时。
一、定义解析
| 技术 | 全称/英文 | 中文含义 | 核心目标 |
|---|---|---|---|
| Prompt 工程 | Prompt Engineering | 提示词工程 | 通过精心设计输入提示(prompt),引导模型输出更准确、可靠、符合任务需求的结果。 |
| Function Calling | Function Calling | 函数调用 | 让 LLM 能够识别何时需要调用外部工具(如 API、数据库、计算器),并生成结构化参数供执行。 |
| ReAct | Reasoning + Acting | 推理-行动协同范式 | 通过交替生成"推理"(Thought)和"动作"(Action),实现模型与环境的闭环交互,增强决策能力。 |
| Self-Refine | Self-Refinement | 自我优化机制 | 模型在生成初步答案后,主动反思其质量,并基于反馈进行迭代修正,提升输出准确性或完整性。 |
✅ 这四项技术共同服务于一个更高目标:让 LLM 从"被动回答者"转变为"主动思考者+执行者"。
二、核心逻辑
1. Prompt 工程
- 输入设计:通过指令(Instruction)、示例(Few-shot)、角色设定(Role)、约束条件(Constraints)等元素构造 prompt。
- 输出引导:控制模型输出格式(如 JSON、步骤列表)、风格(正式/口语)、内容范围(避免幻觉)。
- 关键技巧:链式思维(CoT)、分步引导、错误预防性提示(如"若不确定,请回答'我不知道'")。
2. Function Calling
- 触发机制:模型判断当前任务是否需外部信息(如查天气、计算、搜索)。
- 结构化输出 :模型不直接回答,而是输出函数名 + 参数(如
{"name": "get_weather", "args": {"city": "北京"}})。 - 执行-反馈闭环:外部系统执行函数后,将结果作为新上下文输入模型,继续生成最终回答。
3. ReAct
- 循环流程 :
Thought → Action → Observation → Thought → ... → Final Answer - 双通道协同 :
- Reasoning(推理):解释为何采取某动作、当前状态、目标进展;
- Acting(行动):调用工具、点击按钮、查询数据库等。
- 依赖外部环境:必须有可交互的"世界"(如网页、API、模拟器)提供 Observation。
4. Self-Refine
- 三阶段流程 :
- 生成初稿(Draft):模型给出初步答案;
- 自我批评(Critique):分析答案的缺陷(如事实错误、逻辑漏洞、遗漏要点);
- 优化重写(Refine):基于批评生成改进版。
- 可迭代多次:支持多轮 refine 直到满足质量阈值(或达到最大轮次)。
三、关键细节
| 技术 | 关键点 | 注意事项 |
|---|---|---|
| Prompt 工程 | - Few-shot 示例质量 > 数量 - 明确禁止幻觉的指令有效 - 使用 XML/JSON 标记结构化输出 | 避免模糊指令(如"好好回答");不同模型对 prompt 敏感度差异大 |
| Function Calling | - 需预定义函数 schema(名称、参数、描述) - 模型需训练/微调支持结构化输出 - 支持多函数并行调用(部分平台) | 若函数描述不清,模型可能误调用;参数类型错误常见(如字符串 vs 数字) |
| ReAct | - 推理需具体、可操作(避免空泛) - Observation 必须真实、及时 - 适用于多跳推理任务(如复杂问答、网页导航) | 上下文长度限制易导致早期推理丢失;无外部环境则无法运行 |
| Self-Refine | - 批评环节需具体(不能只说"不好") - 初稿质量影响 refine 上限 - 可结合人类反馈或规则校验器 | 多轮 refine 可能陷入局部最优;增加延迟和 token 消耗 |
四、实例说明
场景:用户问「明天上海适合户外跑步吗?」
组合使用流程:
- Prompt 工程:系统预设角色为"健康助手",并要求"若需天气信息,请调用 get_weather 函数"。
- Function Calling :
- 模型输出:
{"name": "get_weather", "args": {"city": "上海", "date": "tomorrow"}} - 系统执行后返回:
{"temperature": 18°C, "condition": "多云", "aqi": 45}
- 模型输出:
- ReAct 循环 :
- Thought: "AQI < 50 属于优,温度适宜,适合跑步。"
- Action: 无(无需进一步工具)
- Final Answer: "明天上海天气多云,18°C,空气质量优,非常适合户外跑步!"
- Self-Refine(可选) :
- 初稿:"明天可以跑步。"
- 批评:"未说明原因,缺乏具体数据支撑。"
- 优化后:"根据天气预报,明天上海18°C、多云、AQI 45,非常适合跑步。"
💡 实际系统中,这四项技术常被集成:Prompt 设定规则 → Function Calling 获取数据 → ReAct 规划步骤 → Self-Refine 优化表述。
五、常见误区
| 误区 | 纠正说明 |
|---|---|
| 误区1:认为"写好 prompt 就万能" | Prompt 工程有上限,复杂任务必须结合工具调用与推理机制(如 ReAct)才能突破 LLM 的知识边界。 |
| 误区2:Function Calling = 普通 API 调用 | 关键区别在于:模型自主决定何时调用、调哪个函数、传什么参数,而非固定流程。 |
| 误区3:ReAct 就是 CoT + 工具调用 | ReAct 强调动态交互闭环,而 CoT 是静态推理链。ReAct 能处理"工具返回失败需重试"等动态场景,CoT 不能。 |
| 误区4:Self-Refine 总能提升质量 | 若初稿存在根本性错误(如误解问题),自我批评可能无法识别;需结合外部验证(如检索、规则)才可靠。 |
| 误区5:四项技术必须全用 | 应按任务复杂度选择:简单问答只需 Prompt 工程;多跳查询用 ReAct + Function Calling;高精度输出可加 Self-Refine。 |
✅ 总结:
这四项技术构成了现代 LLM Agent 的"认知骨架":
- Prompt 工程是"语言接口",
- Function Calling是"手脚",
- ReAct是"行动大脑",
- Self-Refine是"自我纠错机制"。
合理组合,方能打造真正可靠的智能体。