任务拆解
先把行业研究任务拆成三个阶段,再决定工具和提示词:- 检索:确定研究范围,搜索最新数据、企业信息和新闻;
- 分析:比较来源、识别冲突,区分事实、估算和推断;
- 输出:生成包含摘要、关键发现、风险和来源的结构化报告。
工具设计
本示例组合两类工具:- 官方
web-search:检索实时行业资料。平台还提供fetch、excel等工具,完整列表和 Formula 调用方式见官方工具; - 自定义
build_research_plan:根据主题、地区和年份生成确定性的研究范围,展示如何声明并在本地执行函数工具。
additionalProperties 设为 false,并在 required 中列出必填字段,可以减少模型生成无效参数的概率。
当工具增加到几十个甚至更多时,不要把所有 schema 都放进每次请求。请参考 Kimi K3 工具调用最佳实践和动态加载工具,先检索候选工具,再按需加载。
Prompt 设计
System prompt 只描述角色、工作流程和质量边界,把具体工具参数留给工具 schema:K3 API 配置
请使用 Python 3.9 或更高版本,并安装 OpenAI Python SDK 和用于调用官方 Formula 工具的 HTTP 客户端:https://api.moonshot.cn/v1,模型为 kimi-k3。API Key 仅从 MOONSHOT_API_KEY 环境变量读取。
Kimi K3 始终进行推理,推理强度通过请求顶层 reasoning_effort 配置,支持 "low" / "high" / "max"(默认 "max")。工具循环必须把 SDK 返回的完整 assistant message 追加到 messages,不能只复制 content 和 tool_calls,否则会丢失可能返回的 reasoning_content,破坏后续工具调用上下文。参数和不同模型的差异请以思考模式、推理强度和模型参数参考为准。
完整 Agent Loop
将下面代码保存为agent.py。示例动态读取 web-search 的工具声明,在本地执行自定义工具,并用最多 8 轮的循环处理工具调用。
messages.append(message)追加完整 assistant message,以保留 K3 返回的reasoning_content;- 每条 tool message 使用对应的
tool_call_id,让模型知道结果属于哪个调用。
finish_reason="length" 时会立即报错,避免把截断内容当作最终报告。单个工具调用失败时,错误会作为对应的 tool result 返回给模型,并继续处理本轮其他调用。
MAX_TOOL_ROUNDS 防止工具不断调用造成无限循环,也避免递归实现带来的调用栈增长。
运行与排错
运行示例:main() 中的问题替换为目标行业、地区和年份。最终输出应包含摘要、关键发现、风险与来源,而不是大段工具原始结果。
常见问题:
finish_reason为length:示例会抛出RuntimeError;结合模型参数参考提高max_completion_tokens,或缩短工具结果;- 达到最大工具轮数:检查工具描述是否重叠、工具结果是否明确,并收紧任务范围;
- 工具持续返回参数错误:检查函数 schema、
required、enum与additionalProperties,不要用 prompt 代替参数约束; - 第二轮工具调用失败:确认追加的是完整 SDK assistant message,且每条工具结果保留了正确的
tool_call_id; - 官方工具请求失败:确认 endpoint、API Key、Formula URI 和工具可用性,详细调用方式见官方工具。
自定义工具与优化
示例中的build_research_plan 已完整展示“声明 schema → 本地分派 → 返回 JSON → 关联 tool_call_id”的流程。接入数据库、内部搜索或文件生成服务时,只需用真实实现替换该函数,并保持 schema 与返回结构一致。
进一步优化时:
- 只提供当前任务需要的工具,避免相似工具争抢;
- 对工具输入做业务校验,对错误返回结构化信息,让模型能够修正参数;
- 大型工具目录使用动态加载工具;
- 使用
tool_choice、推理强度等能力前,先核对 Kimi K3 工具调用最佳实践和模型参数参考。