1. 项目概述:当你的AI助手学会“摇人”

最近在折腾AI应用落地的朋友,估计都遇到过这么个头疼事儿:你给大模型(LLM)提了个复杂需求,比如“帮我分析一下上个月的销售数据,做个PPT,再给销售团队发个邮件同步一下”。模型回复得挺热情,说“好的,马上为您处理!”,然后呢?然后大概率就卡住了,或者给你生成一段笼统的、无法直接执行的“建议”。问题出在哪?不是模型不够聪明,而是它“手”不够多,“工具”不会用。

这就是“Isshin AI Agent”这个项目标题背后,我们这群一线开发者真正在琢磨的核心问题。 Isshin ,在日语里有“一心”的意思,但在这里,我更愿意把它理解为“一体同心”——一个能统一调度、协同作战的智能体核心。这个项目的本质,不是要造一个全能超人模型,而是要构建一套让大模型能像经验丰富的项目经理一样,精准调用外部工具和API的“路由架构”。

简单说,它要解决的是LLM与现实世界交互的“最后一公里”问题。模型是大脑,丰富的工具库(数据分析、图像生成、邮件发送、数据库查询等)是四肢,而 工具路由架构 ,就是连接大脑和四肢的神经系统和调度中心。它决定什么时候、用什么工具、按什么顺序去执行任务,并把各个工具的结果整合起来,最终给用户一个完整的交付物。

如果你正在开发基于大模型的自动化流程、智能客服、数据分析助手,或者任何需要模型执行具体操作的场景,那么理解并设计一套好用的工具路由架构,就是你从“玩具Demo”走向“生产级应用”的关键一步。接下来,我就结合自己的踩坑经验,拆解一下这里面的门道。

2. 核心架构设计:从“if-else”到“智能调度中心”

刚开始做工具调用时,很多人(包括我)的思路都很直接:写一堆“if-else”或者规则引擎。用户问题里包含“画图”就调DALL-E,包含“查数据”就调SQL查询。这种做法在简单场景下勉强能用,但稍微复杂点就崩盘。

2.1 为什么“硬编码”的路由行不通?

首先,用户的表达是多样且模糊的。“帮我做个图表”和“把数据可视化一下”可能指的是同一件事,但你的规则引擎可能需要写两条。其次,任务往往是多步骤的。“分析数据并汇报”需要先调用数据分析工具,再调用文本生成或PPT生成工具,规则引擎很难处理这种动态的工作流。最后,工具本身也在迭代,每增加一个新工具,你就要去修改庞大的规则列表,维护成本极高。

因此,一个现代化的LLM工具路由架构,其核心设计思想必须是 动态的、基于理解的、可扩展的 。它的工作流程通常如下:

  1. 意图与实体识别 :首先,路由架构需要理解用户的自然语言指令,解析出核心意图(要干什么)和关键实体(对谁干、用什么参数)。这部分可以依赖LLM本身的能力,也可以结合更轻量级的专用模型(NLU模型)。
  2. 工具匹配与排序 :根据识别出的意图和实体,从注册的工具库中找出所有可能相关的工具。这里的关键不是找一个“最对”的,而是找出一个“候选集”,因为一个意图可能由多个工具协作完成。
  3. 参数提取与验证 :确定使用哪个(或哪几个)工具后,需要从用户指令或对话历史中,提取出该工具运行所需的参数。例如,画图工具需要“主题”和“风格”,查询工具需要“时间范围”和“指标”。提取出的参数必须进行类型和有效性验证。
  4. 执行与结果处理 :调用工具,获取执行结果。结果可能是结构化的数据、一段文本、一张图片,也可能是一个错误。路由架构需要处理这些结果,将其转化为LLM能理解或能继续处理的格式。
  5. 流程控制与编排 :对于多步骤任务,路由架构需要管理执行流程。决定是顺序执行、并行执行,还是根据中间结果进行条件分支。这就像是项目管理的甘特图,由路由中枢来动态绘制。

2.2 主流架构模式选型

在实际项目中,根据复杂度和实时性要求,我们通常会考虑以下几种架构模式:

模式一:基于LLM的单次路由(轻量级) 这是最简单的模式。将用户指令、可用工具列表(包含工具名称、描述、参数格式)一起抛给LLM,让LLM直接返回应该调用哪个工具以及参数是什么。这种方式实现快,完全利用LLM的推理能力,适合工具数量少(<10个)、场景简单的应用。

注意 :这种模式严重依赖提示词(Prompt)工程。你需要精心设计工具描述的格式,并给出清晰的路由示例(Few-shot Learning),否则LLM可能胡言乱语,返回无法解析的格式。

模式二:分层路由架构(推荐) 这是目前生产环境更稳健的选择。它将路由决策过程分层:

  • 第一层:粗筛 。用一个快速的文本分类模型或嵌入向量相似度计算,从大量工具中快速筛选出Top-K个相关工具(比如5个)。这步可以不用大模型,用小模型或向量检索完成,速度快。
  • 第二层:精判 。将用户指令和粗筛出的几个工具详情,送给LLM做精细判断。LLM在这小范围内选择最合适的工具并解析参数。这既保证了精度,又控制了成本与延迟。
  • 第三层:后处理 。对LLM输出的参数进行格式校验、默认值填充,甚至调用前进行安全检查(例如,检查SQL查询语句是否包含 DROP TABLE 等危险操作)。

模式三:工作流引擎集成 对于复杂的、固定的业务流程(如“用户开户-风险审核-发送欢迎邮件”),直接使用成熟的工作流引擎(如Airflow、Prefect)来编排工具调用会更合适。此时,LLM的角色可能只是触发这个预定义工作流的入口,或者在工作流的某个决策节点上提供智能判断。路由的“智能”部分体现在工作流节点的条件设置上。

在我们的“Isshin AI Agent”设想中, 模式二(分层路由) 通常是平衡智能、性能与可靠性的最佳实践。它像一个经验丰富的调度员,先快速浏览所有工人(工具)的简历(工具描述),挑出几个技能对口的,再让项目经理(LLM)面试决定最终人选并交代工作细节。

3. 核心组件拆解与实现要点

一套可用的工具路由架构,离不开几个核心组件的扎实实现。下面我以分层路由架构为例,拆解每个部分的关键细节。

3.1 工具抽象与注册中心

工具本身必须被良好地抽象和描述,机器才能理解。一个标准的工具描述应该包含:

  • 名称 :唯一标识符,如 generate_image
  • 描述 :用自然语言清晰说明这个工具是干什么的。 这是路由匹配的黄金信息 ,描述质量直接决定匹配精度。例如,“根据文本描述生成一张图片”就比“图片生成工具”好得多。
  • 参数模式 :定义输入参数的JSON Schema。包括每个参数的名称、类型、是否必需、描述、示例值。例如:
    {
      "theme": {
        "type": "string",
        "description": "图片的主题,如‘星空下的城堡’",
        "required": true
      },
      "style": {
        "type": "string",
        "description": "艺术风格,如‘油画风’、‘卡通’",
        "required": false,
        "default": "写实"
      }
    }
    
  • 执行函数 :一个具体的、可调用的函数或API端点。

你需要实现一个 工具注册中心 。所有可用工具都在应用启动时向这里注册。路由模块查询注册中心来获取工具列表。这带来了良好的解耦,新增工具只需实现并注册,无需修改路由核心逻辑。

实操心得 :工具描述不要写得太“技术化”,多从用户视角出发。同时,可以为工具添加“标签”或“分类”属性,便于第一层的粗筛。例如,给 send_email 工具打上 ["communication", "notification"] 标签。

3.2 意图理解与工具匹配层

这是路由的“大脑”所在。如前所述,我们采用分层策略。

第一层:基于嵌入向量的快速检索 将每个工具的“名称+描述+标签”拼接成一段文本,通过文本嵌入模型(如OpenAI的 text-embedding-3-small ,或开源的BGE模型)转换为向量,并存入向量数据库(如Chroma、Weaviate、Milvus)。 当用户指令到来时,同样将其转换为向量,然后在向量数据库中进行相似度搜索(如余弦相似度),返回最相似的K个工具。这一步的目标是 召回率 ,宁可多召回一些相关工具,也别漏掉关键工具。

注意 :向量检索的好坏极度依赖嵌入模型的质量和工具描述的文本质量。如果工具描述千篇一律(如“这是一个用于处理XX的工具”),检索效果会很差。务必让描述多样化、具体化。

第二层:基于LLM的精确决策与参数解析 将用户指令和检索到的K个工具详情,构造一个Prompt送给LLM。Prompt需要明确指示LLM完成两件事:

  1. 选择最合适的工具(可能一个或多个,也可能都不需要)。
  2. 如果选择了工具,则以指定的JSON格式输出调用参数。

一个简化的Prompt示例:

你是一个智能工具调度助手。请根据用户请求,从以下工具中选择最合适的一个或多个来完成任务。如果都不合适,请回复“无”。

可用工具:
1. 工具名: get_weather
   描述: 查询指定城市当前或未来的天气情况。
   参数: {"city": "城市名,字符串", "date": "查询日期,格式YYYY-MM-DD,可选,默认为今天"}

2. 工具名: send_email
   描述: 向指定的邮箱地址发送邮件。
   参数: {"to": "收件人邮箱", "subject": "邮件主题", "body": "邮件正文"}

用户请求:{user_input}

请严格按以下JSON格式输出:
{
  "selected_tools": ["工具名1", "工具名2", ...], // 如果没有,则为空数组[]
  "parameters": {
    "工具名1": {"参数1": "值1", ...},
    "工具名2": {...}
  }
}

关键点 :这里的LLM调用,建议使用具有JSON输出模式(如GPT-4的 response_format )或函数调用(Function Calling)能力的模型,这能极大提高输出结构的稳定性。对于开源模型,可以通过强格式化的Prompt和输出后处理来约束。

3.3 参数验证、安全与执行引擎

拿到LLM的输出后,不能直接相信,必须经过后处理。

  1. 参数验证 :根据工具注册时定义的JSON Schema,验证LLM提取的参数类型是否正确、必填项是否齐全。类型错误时尝试转换(如字符串转数字),缺失非必填项时填充默认值。
  2. 安全过滤 :这是生产环境的生命线。对于某些工具,必须进行安全检查。
    • SQL查询 :检查是否包含数据定义语言(DDL)或数据控制语言(DCL)等高危操作,或者通过数据库账户权限进行严格控制。
    • 文件操作 :限制可访问的目录路径,防止路径穿越攻击。
    • 网络请求 :限制可访问的域名或IP范围。
    • 内容生成 :对生成的内容(如文本、图片)进行合规性审核(涉黄、涉政、暴恐等)。
  3. 执行与超时控制 :调用具体的工具函数。必须为每个工具调用设置合理的超时时间,防止某个工具挂起导致整个Agent卡死。执行环境建议使用沙箱或进程隔离,尤其是运行不可信代码时。
  4. 错误处理与重试 :工具执行可能失败(网络超时、API限流、资源不足)。路由架构需要设计重试机制(如指数退避重试)和优雅的降级策略。当主要工具失败时,是否有备用方案?

3.4 会话状态与流程管理

对于多轮对话,Agent需要记住历史。这不仅仅是记住对话内容,更要记住 任务的状态

  • 会话上下文 :保存用户与Agent的完整对话历史,供LLM在理解后续请求时参考。
  • 任务状态机 :对于一个多步骤任务,需要维护其当前进度。例如,“制作报告”任务可能处于 数据查询中 图表生成中 文本撰写中 完成 等状态。这有助于Agent回答“我的报告做到哪一步了?”这样的问题。
  • 工具调用历史 :记录每次工具调用的输入、输出、错误信息。这对于调试、审计和用户解释(“我刚才做了什么”)至关重要。

实现上,可以设计一个 Session Workflow 对象来承载这些状态,并将其序列化存储到数据库或缓存中,以支持长时间运行的任务和会话恢复。

4. 实战构建:一个简易Isshin路由核心

光说不练假把式。我们用一个高度简化的Python示例,勾勒出分层路由架构的核心代码骨架。这里我们使用 FastAPI 作为Web框架, LangChain Tool 抽象和 OpenAI 的Function Calling能力来简化开发。

4.1 定义工具库

首先,我们定义几个工具并注册。

# tools.py
import json
from typing import Type, Any
from pydantic import BaseModel, Field
from langchain.tools import BaseTool

# 1. 定义工具的参数模型(Pydantic)
class WeatherInput(BaseModel):
    city: str = Field(description="The city name")
    date: str = Field(default="today", description="The date in YYYY-MM-DD format")

class EmailInput(BaseModel):
    to: str = Field(description="Recipient email address")
    subject: str = Field(description="Email subject")
    body: str = Field(description="Email body content")

# 2. 实现具体的工具类
class WeatherTool(BaseTool):
    name = "get_weather"
    description = "Get the current or future weather for a specific city."
    args_schema: Type[BaseModel] = WeatherInput

    def _run(self, city: str, date: str = "today") -> str:
        # 模拟调用天气API
        return f"The weather in {city} on {date} is sunny, 25°C."

class EmailTool(BaseTool):
    name = "send_email"
    description = "Send an email to a recipient."
    args_schema: Type[BaseModel] = EmailInput

    def _run(self, to: str, subject: str, body: str) -> str:
        # 模拟发送邮件
        return f"Email sent to {to} with subject '{subject}'."

# 3. 工具注册中心(简易版)
class ToolRegistry:
    def __init__(self):
        self._tools = {}

    def register(self, tool: BaseTool):
        self._tools[tool.name] = tool

    def get_tool(self, name: str) -> BaseTool:
        return self._tools.get(name)

    def get_all_tools(self) -> list[BaseTool]:
        return list(self._tools.values())

# 初始化注册中心
registry = ToolRegistry()
registry.register(WeatherTool())
registry.register(EmailTool())

4.2 实现分层路由逻辑

接下来,实现路由的核心逻辑,包括向量检索和LLM决策。

# router.py
import os
from typing import List, Dict, Any
from langchain.embeddings import OpenAIEmbeddings # 或用其他开源嵌入模型
from langchain.vectorstores import Chroma
from langchain.schema import Document
from langchain.chat_models import ChatOpenAI
from langchain.chains import create_tagging_chain_pydantic
# 假设我们有一个用于决策的Pydantic模型
from pydantic import BaseModel, Field
from tools import registry, WeatherInput, EmailInput

# 第一层:向量检索准备
class VectorRetriever:
    def __init__(self):
        # 使用OpenAI嵌入,生产环境可换为本地模型以降低成本
        self.embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
        # 将工具描述存入向量库
        documents = []
        for tool in registry.get_all_tools():
            # 将工具的关键信息拼接成文档
            doc_text = f"Name: {tool.name}. Description: {tool.description}. Args: {tool.args_schema.schema_json()}"
            documents.append(Document(page_content=doc_text, metadata={"name": tool.name}))
        self.vectorstore = Chroma.from_documents(documents, self.embeddings)

    def retrieve(self, query: str, k: int = 3) -> List[str]:
        """检索相关工具名"""
        docs = self.vectorstore.similarity_search(query, k=k)
        return [doc.metadata["name"] for doc in docs]

# 第二层:LLM决策与参数解析
class LLMRouter:
    def __init__(self):
        # 使用支持Function Calling的模型
        self.llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

    def route(self, user_input: str, candidate_tool_names: List[str]) -> Dict[str, Any]:
        # 1. 获取候选工具的详细信息
        candidate_tools = []
        for name in candidate_tool_names:
            tool = registry.get_tool(name)
            if tool:
                candidate_tools.append({
                    "name": tool.name,
                    "description": tool.description,
                    "args_schema": tool.args_schema.schema() # 获取JSON Schema
                })

        # 2. 构建Prompt(此处简化,实际可用LangChain的Agent相关类)
        # 更佳实践是使用LangChain的 `create_openai_functions_agent` 或 `create_structured_output_chain`
        # 这里为演示,我们手动构造一个函数调用(Function Calling)场景
        functions = []
        for tool_info in candidate_tools:
            functions.append({
                "name": tool_info["name"],
                "description": tool_info["description"],
                "parameters": tool_info["args_schema"]
            })

        # 3. 调用LLM,使用Function Calling
        try:
            # 这是模拟调用,实际OpenAI API调用需要按官方格式
            # 这里假设我们有一个helper函数来调用chat.completions并指定functions
            response = self._call_llm_with_functions(user_input, functions)
            # 解析LLM返回的function_call信息
            if response and "function_call" in response:
                tool_name = response["function_call"]["name"]
                tool_args = json.loads(response["function_call"]["arguments"])
                return {
                    "selected_tool": tool_name,
                    "parameters": tool_args
                }
        except Exception as e:
            print(f"LLM路由失败: {e}")
        return {"selected_tool": None, "parameters": {}}

    def _call_llm_with_functions(self, query: str, functions: list):
        # 此处应替换为真实的OpenAI API调用代码
        # 示例结构:
        # messages = [{"role": "user", "content": query}]
        # response = openai.ChatCompletion.create(
        #     model="gpt-3.5-turbo",
        #     messages=messages,
        #     functions=functions,
        #     function_call="auto",
        # )
        # return response.choices[0].message
        pass # 返回模拟数据
        return {
            "function_call": {
                "name": "get_weather",
                "arguments": '{"city": "北京", "date": "2023-10-27"}'
            }
        }

4.3 组装执行引擎与API

最后,我们将各个组件串联起来,并通过API暴露。

# main.py (FastAPI 示例)
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from tools import registry
from router import VectorRetriever, LLMRouter

app = FastAPI(title="Isshin AI Agent Router")

retriever = VectorRetriever()
router = LLMRouter()

class UserRequest(BaseModel):
    query: str
    session_id: str = None  # 用于支持多轮对话

@app.post("/route_and_execute")
async def route_and_execute(request: UserRequest):
    # 1. 检索候选工具
    candidate_tool_names = retriever.retrieve(request.query, k=3)
    if not candidate_tool_names:
        return {"response": "抱歉,没有找到能处理您请求的工具。"}

    # 2. LLM精确路由并解析参数
    routing_result = router.route(request.query, candidate_tool_names)
    if not routing_result["selected_tool"]:
        return {"response": "我理解您的需求,但目前无法通过现有工具执行。"}

    tool_name = routing_result["selected_tool"]
    tool_args = routing_result["parameters"]

    # 3. 获取工具实例并验证参数
    tool = registry.get_tool(tool_name)
    if not tool:
        raise HTTPException(status_code=500, detail=f"工具 {tool_name} 未找到。")

    # 4. 执行工具
    try:
        # 这里tool._run需要根据实际参数展开,示例中简化处理
        # 实际应使用Pydantic模型验证参数
        result = tool.run(tool_args) # run方法会处理参数验证和运行
        response_text = f"已执行工具 `{tool_name}`。结果:{result}"
    except Exception as e:
        response_text = f"执行工具 `{tool_name}` 时出错:{str(e)}"

    # 5. 将结果返回(在实际Agent中,这个结果可能还会喂给LLM生成更友好的回复)
    return {"response": response_text, "tool_used": tool_name, "result": result}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

这个示例虽然简化,但清晰地展示了分层路由(检索->精判->执行)的完整流程。在生产环境中,你需要加入更健壮的错误处理、会话管理、异步执行、监控日志等。

5. 避坑指南与性能优化

在实际开发和运维中,我踩过不少坑,也总结了一些优化点。

5.1 常见问题与排查

问题现象 可能原因 排查与解决思路
LLM总是选错工具 1. 工具描述模糊或相似。
2. Prompt指令不清晰。
3. 候选工具集(K值)过大或过小。
1. 优化工具描述 :让描述差异化、具体化,包含典型用例。例如,“发送邮件”可以写成“向个人或群组发送文本格式的电子邮件,支持添加附件”。
2. 改进Prompt :在Prompt中提供更详细的选择标准和反例。使用Few-shot,给出几个正确和错误的路由示例。
3. 调整K值 :通过测试集调整第一层检索返回的工具数量,平衡召回率和LLM决策负担。
参数解析不准或格式错误 1. LLM不理解参数约束。
2. 用户指令信息不足。
1. 强化参数描述 :在工具的JSON Schema中,为每个参数写清描述、示例和枚举值(如果有)。
2. 设计追问机制 :当LLM解析出的参数缺失或明显不合理时,不要直接报错,而是让Agent根据缺失的参数,生成一个追问用户的问题。例如,“您想查询哪个城市的天气呢?”
3. 使用结构化输出 :优先选用支持Function Calling或JSON Mode的模型,并在Prompt中严格要求输出格式。
工具执行超时或失败导致整个请求挂起 1. 工具本身API不稳定或慢。
2. 没有设置超时控制。
1. 设置超时 :为每个工具调用配置独立的超时时间(如10秒),并使用异步调用。
2. 实现熔断与降级 :对频繁失败的工具引入熔断器机制,暂时屏蔽;提供备选工具或友好的错误回复。
3. 异步化执行 :对于耗时长的工具,改为异步任务,先返回“任务已接收”的响应,通过轮询或Webhook通知用户结果。
多轮对话中,Agent忘记之前做过什么 1. 没有维护会话状态和工具调用历史。
2. 上下文长度有限,历史被截断。
1. 持久化会话 :为每个会话(session_id)在数据库或缓存中保存关键信息:用户消息、Agent回复、工具调用记录、当前任务状态。
2. 优化上下文管理 :不要无脑将全部历史对话扔给LLM。可以总结之前的工具调用结果和关键决策点,以摘要的形式放入上下文,节省Token并聚焦重点。
安全性问题,如SQL注入、任意文件读取 1. 工具参数未经验证直接使用。
2. 工具执行权限过高。
1. 输入验证与净化 :对所有输入进行严格的类型、范围、格式检查。对SQL参数使用参数化查询,对文件路径进行规范化并限制在安全目录内。
2. 最小权限原则 :工具执行时使用权限最低的账户或环境。例如,查询数据库使用只读账号。
3. 内容安全审核 :对工具生成的内容(如文本、图片)引入审核机制,可以是关键词过滤或调用内容安全API。

5.2 性能与成本优化技巧

  1. 缓存策略

    • 向量检索缓存 :对于常见的、高频的用户查询,其向量检索结果可以缓存一段时间,避免重复计算嵌入向量。
    • 工具结果缓存 :对于幂等性的工具调用(如查询天气、获取股票价格),其结果可以按参数缓存一段时间(如5分钟),大幅降低对外部API的调用和等待时间。
  2. 分层使用LLM

    • 在路由的第一层(检索)坚决不使用大模型,用轻量级的嵌入模型和向量检索。
    • 在第二层(精判)使用性价比高的模型(如GPT-3.5-Turbo),对于极端复杂的决策再考虑用GPT-4。
    • 考虑使用开源小模型(如7B-14B参数的模型)在本地部署来处理部分路由逻辑,以控制成本和延迟。
  3. 批量处理与异步流

    • 如果业务场景允许,可以将多个用户请求积累一小段时间进行批量路由和工具调用,尤其对于计算密集型的工具(如批量图片生成)。
    • 采用异步非阻塞架构。FastAPI/Starlette、Go等框架非常适合。当工具执行时,事件循环可以去处理其他请求。
  4. 监控与评估

    • 建立监控面板,关键指标包括:路由延迟、工具调用成功率、各工具耗时、LLM调用成本和Token消耗。
    • 定期用测试用例集评估路由的准确率。记录错误案例,持续优化工具描述和Prompt。

6. 进阶思考:从路由到自治Agent

当我们把工具路由做得足够稳健后,AI Agent的能力边界就大大拓展了。此时,我们可以思考一些更进阶的模式:

动态工具注册与发现 :工具是否可以不是预定义的?Agent能否在运行时,通过阅读API文档(Swagger/OpenAPI)自动学习并使用一个新工具?这需要路由架构具备一定的工具理解与泛化能力。

工具组合与规划 :对于“帮我订机票酒店并规划行程”这类复杂任务,Agent需要自动规划子任务步骤(规划-订票-订酒店-生成行程单)。这需要引入任务规划(Planning)模块,通常通过Chain-of-Thought(思维链)或更复杂的规划算法(如HFSM、行为树)来实现。此时,路由架构升级为“规划器+调度器”的组合。

强化学习优化 :Agent的路由决策是否可以通过历史反馈来优化?例如,当用户对某次工具调用的结果表示满意或纠正后,系统可以记录这条正/负反馈,微调路由策略(如调整工具描述的嵌入向量或LLM的Prompt),让下次遇到类似情况时做得更好。

构建“Isshin AI Agent”的路由架构,就像为你的智能体打造一个高效、可靠的“外接神经系统”。它让大模型从“纸上谈兵”的谋士,变成了“能调兵遣将”的实干家。这个过程充满挑战,从工具抽象、意图理解到安全执行,每一步都需要精心设计。但当你看到用户一句模糊的指令被自动拆解、调度、执行,最终返回一个确切的结果时,那种成就感是无可替代的。我的经验是,从小处着手,先用少数几个核心工具跑通闭环,再逐步扩展工具库和优化路由策略,持续迭代,你的Agent才会越来越聪明、越来越可靠。

更多推荐