第 11 章:做一个搜索/计算/业务查询工具 Agent
本章目标
这一章把多个工具组合起来,做一个能搜索、计算和查询业务信息的 Agent。
本章效果
配套项目把折扣计算、订单查询、制度搜索组合成一个业务 Agent。

Agent 的基本循环
Agent 的工作方式可以理解为:
读取用户问题
-> 判断是否需要工具
-> 调用一个或多个工具
-> 读取工具结果
-> 继续判断或生成最终答案
普通模型调用只有一次生成,Agent 可能有多轮模型和工具交互。
准备工具
我们先定义三个工具:
calculate_discount:计算价格get_order_status:查询订单search_policy:搜索制度
export const searchPolicy = tool(
async ({ keyword }) => {
const policies = [
"报销必须提供真实有效发票。",
"差旅住宿标准按城市级别区分。",
"超过 5000 元的采购需要部门负责人审批。"
];
return policies
.filter((item) => item.includes(keyword))
.join("\n") || "未找到相关制度。";
},
{
name: "search_policy",
description: "按关键词搜索企业内部制度",
schema: z.object({
keyword: z.string().describe("要搜索的制度关键词")
})
}
);
创建 Agent
import { createAgent } from "langchain";
import { createChatModel } from "@/lib/ai/model";
import { calculateDiscount, getOrderStatus, searchPolicy } from "@/lib/ai/tools";
export async function createSupportAgent() {
const model = await createChatModel();
return createAgent({
model,
tools: [calculateDiscount, getOrderStatus, searchPolicy],
systemPrompt: `
你是企业业务支持助手。
当问题涉及计算、订单或制度查询时,必须优先调用工具。
回答时要说明依据,不要编造工具没有返回的信息。
`
});
}
API Route
import { createSupportAgent } from "@/lib/ai/agent";
export async function POST(request: Request) {
const body = await request.json();
const agent = await createSupportAgent();
const result = await agent.invoke({
messages: body.messages
});
return Response.json({
messages: result.messages
});
}
实际项目里,你可能需要从 result.messages 中取最后一条 AI 消息展示。
测试问题
准备这几类问题:
499 元打 8 折是多少钱?
订单 SO202605190001 到哪了?
报销需要发票吗?
我想请年假,你知道流程吗?
观察模型是否会正确调用工具。如果没有调用,优先检查工具描述和系统 Prompt。
前端展示工具过程
第一版可以只显示最终答案。更好的版本可以展示:
AI 选择工具:search_policy
工具参数:{ "keyword": "报销" }
工具结果:报销必须提供真实有效发票。
最终回答:根据制度,报销需要真实有效发票。
这会让用户更信任 Agent。
实战任务
完成:
- 三个业务工具
- 一个
createSupportAgent - 一个
/api/agent接口 - 至少 5 个测试问题
常见坑
工具太多会增加模型选择难度。早期项目控制在 3-5 个工具比较合适。
工具结果过长会污染上下文。返回给模型的信息要精简。
工具调用失败时,要给模型和用户可理解的错误信息。
本章小结
我们完成了第一个工具 Agent。下一章进入 RAG,解决模型无法回答私有文档内容的问题。