Agent 与自定义工具
Agent 与固定流程的链不同:模型根据任务自主决定调用哪些工具、调用几次,直到得出答案。langchaingo 提供 ReAct 风格的 Agent 与工具抽象。
内置工具与 One-Shot Agent
执行流程即 ReAct 循环:模型产出"思考 → 行动(选工具)→ 观察结果",循环直至给出最终答案。
自定义工具
任何 Go 能力都可以封装为工具。实现 tools.Tool 接口的三个方法即可:
将自定义工具加入 Agent:
工具设计要点
:::tip 工具的质量决定 Agent 的上限:
- Name 使用小写动词性短语,稳定且唯一。
- Description 是模型的"说明书",需说明用途、输入格式与输出含义——模型完全依据它决定何时调用。
- Call 返回简短、结构化的文本;错误以 error 返回而不是吞掉。
- 工具内部做好超时与重试,遵循错误处理惯例。 :::
Agent 与 HTTP 服务结合
每个请求构造独立的执行器,共享 LLM 实例;配合 context 超时控制总时长:
:::warning 安全边界:Agent 的能力等于其工具的能力。给 Agent 提供执行 SQL、读写文件、调用内部 API 等强权限工具时,必须:
- 限制最大迭代次数(
WithMaxIterations),控制成本与失控风险。 - 工具内部实施权限校验与资源配额,禁止模型输入直接拼接 SQL 或 shell 命令。
- 记录完整的工具调用审计日志。 :::
小结
- ReAct Agent 通过"思考—行动—观察"循环自主调用工具,
agents.NewOneShotAgent+agents.NewExecutor是标准组合。 - 自定义工具只需实现
Name/Description/Call三个方法,Description 面向模型编写。 - 工具权限、最大迭代与超时构成 Agent 的安全边界。