让模型开始使用工具
如果说前面的对话模型是在回答“模型能不能说话”,那么 Agent 这页解决的是下一步问题:
当模型需要去读网页、调工具、分步完成任务时,该怎么组织它?
Feat AI 的 Agent 是建立在 ReAct 思路上的:
模型先做判断,再调用工具,再根据工具结果继续推进。
Agent 适合什么场景
Section titled “Agent 适合什么场景”- 问题本身不是一句提示词就能回答
- 模型需要读取外部信息
- 模型需要调用一个或多个工具才能完成任务
如果你当前只是普通问答、摘要、翻译或单次生成,先停在 配置对话模型并处理流式输出 即可。
先看一个最小 Agent
Section titled “先看一个最小 Agent”import tech.smartboot.feat.ai.FeatAI;import tech.smartboot.feat.ai.agent.FeatAgent;import tech.smartboot.feat.ai.chat.ChatModelVendor;
public class AgentDemo { public static void main(String[] args) throws Exception { FeatAgent agent = FeatAI.agent(opts -> { opts.chatOptions().model(ChatModelVendor.GiteeAI.Qwen2_5_72B_Instruct); opts.tool(new tech.smartboot.feat.ai.agent.tools.WebPageReaderTool()); });
String result = agent.execute( "从 https://smartboot.tech/smart-mqtt/ 中给我看看这款产品的定价是多少" ).get();
System.out.println(result); System.out.println(agent.getState()); }}这段代码的重点只有两件事:
- 先给 Agent 一个对话模型
- 再给它至少一个它能调用的工具
没有工具时,Agent 只是“会多想一点”的模型;
有了工具之后,它才真正开始具备完成复杂任务的能力。
Agent 和普通 ChatModel 的区别
Section titled “Agent 和普通 ChatModel 的区别”ChatModel
Section titled “ChatModel”适合:
- 单次问答
- 提示词生成
- 普通对话
FeatAgent
Section titled “FeatAgent”适合:
- 需要外部信息的任务
- 多步骤任务
- 要把“推理”和“执行”串起来的场景
所以不要把 Agent 理解成“更强的对话模型”,它更像是“对话模型 + 工具调度层”。
什么时候该开始注册工具
Section titled “什么时候该开始注册工具”这是 Agent 是否真正有用的分界点。
常见工具包括:
- 网页读取
- 搜索
- 文件操作
在 Feat AI 里,你可以把工具注册到 AgentOptions 上:
opts.tool(new SearchTool());opts.tool(new WebPageReaderTool());opts.tool(new FileOperationTool());仓库里的示例更偏向使用内置工具去完成实际任务,所以你完全可以先从现成工具开始,而不是立刻写自定义工具。
一个实用建议
Section titled “一个实用建议”做 Agent 时,不要一开始就追求“大而全工具箱”。
更稳的方式通常是:
- 先让一个 Agent 只接一两个工具
- 确认它真的能稳定完成任务
- 再继续加工具和更复杂的提示策略
否则你最后很可能不知道到底是模型问题、工具问题,还是调度策略问题。
Agent 总是在空想,不调用工具
Section titled “Agent 总是在空想,不调用工具”优先检查:
- 你是否真的注册了工具
- 任务本身是否明确暗示需要外部信息
- 模型能力是否足以理解当前工具描述
Agent 能调用工具,但结果质量一般
Section titled “Agent 能调用工具,但结果质量一般”这通常不是一个单点问题。
可能涉及:
- 模型本身
- 工具描述是否清楚
- 工具返回内容是否可消费
- 提示策略是否过弱或过乱
我是不是应该先学 Agent 再学 Chat
Section titled “我是不是应该先学 Agent 再学 Chat”不建议。
如果你还没把普通模型调用用熟,Agent 的排错成本会高很多。
- 如果你还没把对话模型用熟,先回到 配置对话模型并处理流式输出
- 如果你准备做检索增强,再去看 Embedding 与向量