第 11 章:做一个搜索/计算/业务查询工具 Agent

3 阅读3分钟

第 11 章:做一个搜索/计算/业务查询工具 Agent

本章目标

这一章把多个工具组合起来,做一个能搜索、计算和查询业务信息的 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,解决模型无法回答私有文档内容的问题。