Agent工具定义标准–OpenAPI架构设计、参数描述、LLM调用准确性优化
Dify的Agent是一个允许LLM自主选择和执行工具来完成任务的功能。代理稳定性几乎与工具定义的质量直接相关。在本文中,我们将对定义标准、测试方法和操作指南进行实用的解释,以使LLM能够准确地调用工具。
1.Agent中工具定义的作用
1.1 为什么工具定义决定了 Agent 的准确性
Agent的操作流程如下。
flowchart LR
U[ユーザー入力] --> A[Agent LLM]
A --> TD{ツール選択判断}
TD -->|ツールA| TA[ツールA実行]
TD -->|ツールB| TB[ツールB実行]
TD -->|ツール不要| DR[直接回答]
TA --> A
TB --> A
DR --> R[最終回答]
A --> R
当LLM选择工具时,是指工具的名称、描述和参数定义。换句话说,这些定义直接作为LLM决策的基础。
| 定义元素 | 对LLM的影响 |
|---|---|
| 工具名称 | 何时使用的第一印象 |
| 描述 | 决定使用的主要依据 |
| 参数名称 | 猜测要通过什么的依据 |
| 参数说明 | 生成参数值的依据 |
| 必填/可选 | 确定所需的输入 |
| 枚举/格式 | 了解价值约束 |
1.2 常见问题
- 工具描述不明确,LLM 选择了错误的工具
- 由于参数定义不足,LLM 传递了错误的值
- 多个工具的描述相似,导致LLM混乱
- 由于未定义的故障后备而导致代理循环
2. 如何定义自定义工具
2.1 Dify 中的工具添加流程
1.点击Dify控制台顶部的工具菜单 2. 选择 自定义工具 > 创建自定义工具 3. 输入工具名称和 OpenAPI 架构 4. 配置身份验证设置(API 密钥、Bearer Token等) 5. 通过运行测试验证操作 6. 将工具链接到代理应用程序
2.2 OpenAPI schema 的基本结构
Dify 自定义工具在 OpenAPI 3.0 / Swagger 2.0 格式架构中定义。
openapi: "3.0.0"
info:
title: "社内チケット管理API"
version: "1.0.0"
description: "社内ITサポートチケットの作成・検索・更新を行うAPI"
servers:
- url: "https://api.internal.example.com/v1"
paths:
/tickets:
post:
operationId: "createTicket"
summary: "新しいサポートチケットを作成する"
description: |
社内ITサポートチケットを新規作成します。
ユーザーがIT機器の故障、ソフトウェアの不具合、アカウントの問題を
報告する場合に使用してください。
一般的な質問への回答や、IT以外の問題には使用しないでください。
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- title
- category
- description
properties:
title:
type: string
description: "チケットのタイトル。問題を簡潔に表す30文字以内の文字列。"
example: "VPN接続エラー"
category:
type: string
enum: ["hardware", "software", "network", "account", "other"]
description: |
問題のカテゴリ。以下から選択:
- hardware: PC、モニター、キーボード等の物理的な機器の問題
- software: アプリケーションのインストール、動作不良、ライセンス
- network: WiFi、VPN、インターネット接続の問題
- account: パスワードリセット、アカウントロック、権限の問題
- other: 上記に該当しない問題
description:
type: string
description: "問題の詳細説明。発生状況、エラーメッセージ、影響範囲を含む。"
priority:
type: string
enum: ["critical", "high", "medium", "low"]
default: "medium"
description: |
優先度。以下の基準で選択:
- critical: 業務が完全に停止している(全社影響)
- high: 業務に重大な支障がある(部門影響)
- medium: 業務に一部支障がある(個人影響)
- low: 改善要望、将来的な対応でよいもの
responses:
"201":
description: "チケット作成成功"
content:
application/json:
schema:
type: object
properties:
ticket_id:
type: string
description: "作成されたチケットのID"
status:
type: string
description: "チケットのステータス"
"400":
description: "リクエストパラメータが不正"
"401":
description: "認証エラー"
/tickets/search:
get:
operationId: "searchTickets"
summary: "サポートチケットを検索する"
description: |
既存のサポートチケットを検索します。
ユーザーが過去のチケットの状況を確認したい場合や、
類似の問題が報告されていないか調べる場合に使用してください。
新しいチケットを作成する場合は createTicket を使用してください。
parameters:
- name: keyword
in: query
required: false
schema:
type: string
description: "検索キーワード。チケットのタイトルと説明文を全文検索。"
- name: status
in: query
required: false
schema:
type: string
enum: ["open", "in_progress", "resolved", "closed"]
description: "チケットのステータスでフィルタリング"
- name: created_after
in: query
required: false
schema:
type: string
format: date
description: "指定日以降に作成されたチケットを検索。ISO 8601形式(例: 2026-01-15)"
responses:
"200":
description: "検索結果"
content:
application/json:
schema:
type: object
properties:
tickets:
type: array
items:
type: object
properties:
ticket_id:
type: string
title:
type: string
status:
type: string
created_at:
type: string
total_count:
type: integer
3. 如何撰写有效的描述
3.1 描述三要素
工具描述必须包括以下三个要素:
1. このツールが「何をするか」(What)
2. 「いつ使うべきか」(When)
3. 「いつ使うべきでないか」(When NOT)
3.2 比较好的和坏的描述
不好的例子1:太模糊
# NG
description: "情報を検索します"
好例子1:具体清晰的界限
# OK
description: |
社内ナレッジベースから技術文書を検索します。
ユーザーが製品の仕様、設定手順、トラブルシューティング方法を
尋ねている場合に使用してください。
料金、契約、人事に関する質問には使用しないでください。
糟糕的例子2:多种工具之间的界限不明确
# NG: ツールA
description: "データを取得します"
# NG: ツールB
description: "情報を返します"
好例子2:清晰的差异化
# OK: ツールA - チケット検索
description: |
過去のサポートチケットをキーワードやステータスで検索します。
ユーザーが「前に報告した問題のステータスを知りたい」
「同じ問題が報告されていないか確認したい」場合に使用してください。
# OK: ツールB - ナレッジ検索
description: |
社内技術ドキュメントから解決方法を検索します。
ユーザーが「この問題をどう解決すればよいか」
「設定手順を教えてほしい」場合に使用してください。
3.3 参数描述指南
| 原理 | 好例子 | 坏榜样 |
|---|---|---|
| 指定类型和格式 | ISO 8601形式の日付文字列(例: 2026-04-12) | 日付 |
| 表示可能的值 | enum: ["high", "medium", "low"] | 優先度を文字列で |
| 包括示例 | 例: "VPN接続エラー" | 没有例子 |
| 表示字符限制 | 30文字以内の文字列 | 文字列 |
| 明确必需/可选 | required: true + 原因 | 未指定 |
| 表示默认值 | default: "medium" | 未指定 |
4. 认证设置
4.1 Dify 支持的认证方式
| 方法 | 设置位置 | 应用 |
|---|---|---|
| API 密钥(标头) | 将键分配给标题 | 通用API密钥认证 |
| API 密钥(查询) | 为查询参数分配键 | 对于遗留 API |
| 不记名令牌 | Authorization: Bearer xxx | OAuth 2.0 令牌 |
| 基本身份验证 | Authorization: Basic xxx | 用户名/密码认证 |
| 无 | 没有认证 | 公共API、内部网络 |
4.2 身份验证配置最佳实践
# Dify カスタムツール認証設定
authentication:
type: "api_key"
api_key_header: "X-API-Key"
# API Key は環境変数またはシークレットマネージャーから取得
# ハードコーディングしない
- 在 Dify 身份验证设置屏幕上输入 API 密钥(不要直接将其写入架构中)
- 在生产环境中,提供定期轮换密钥的机制。
- 最小权限(如果只读就可以,则不要授予写入权限)
5. Agent指令设计
除了工具定义之外,Agent的系统提示(指令)也极大地影响了工具选择的准确性。
5.1 代理指令模板
あなたはITサポートアシスタントです。
社員からのIT関連の問い合わせに対応します。
## 対応可能な業務
- 技術的な問題のトラブルシューティング
- サポートチケットの作成と状況確認
- 社内技術ドキュメントの検索
## ツール使用のルール
1. まず searchKnowledge で解決方法を検索してください
2. 解決方法が見つかった場合は、ツールの結果に基づいて回答してください
3. 解決方法が見つからない場合は、createTicket でチケットを作成してください
4. ユーザーが過去のチケットについて尋ねた場合は searchTickets を使用してください
## ツール使用の制約
- チケット作成前に必ずユーザーに内容を確認してください
- 1回の会話で同じツールを3回以上呼び出さないでください
- ツールの実行に失敗した場合は、エラー内容をユーザーに伝えてください
## 回答の制約
- IT以外の質問(人事、経理等)は対応範囲外であることを伝えてください
- 不明な点がある場合は推測せず、ユーザーに確認してください
5.2 确定工具使用的优先级
当代理拥有多个工具时,在说明中指定使用顺序可以提高准确性。
## ツール使用の優先順位
1. searchKnowledge(最優先): まず社内ナレッジを検索
2. searchTickets: ナレッジで解決しない場合、類似チケットを検索
3. createTicket(最後の手段): 上記で解決しない場合のみ新規チケット作成
6.测试方法
6.1 工具定义的测试矩阵
| 测试视角 | 测试案例 | 预期结果 |
|---|---|---|
| 选择正确的工具 | “VPN 无法连接” | 搜索知识叫做 |
| 选择正确的工具 | “上周的门票状况如何?” | searchTickets 称为 |
| 正确的工具选择 | “我的电脑坏了,我想请求维修” | 调用 createTicket |
| 抑制不必要的工具调用 | “今天天气怎么样?” | 回答“超出范围”而不调用该工具 |
| 参数正确性 | “为网络问题创建票证” | 类别: “网络” |
| 收集所需参数 | “创建票证”(信息不足) | 与用户确认缺失信息 |
| 错误处理 | 工具返回 500 错误 | 通知用户错误 |
6.2 测试执行流程
1.在Dify控制台的调试面板发送测试消息 2.查看工具调用日志:
- 选定的工具名称
- 传递的参数
- 工具响应
- 通过与预期结果比较来发现问题 4.修改描述或参数定义
- 重新测试
6.3 逐步测试方法
Phase 1: 単体テスト
├── 各ツールが正しく呼び出されるか(10ケース/ツール)
├── パラメータが正しく渡されるか
└── エラーレスポンスの処理
Phase 2: 統合テスト
├── 複数ツールの選択判断(20ケース)
├── ツール間の連携(検索→作成の流れ)
└── 会話のマルチターンでの一貫性
Phase 3: エッジケーステスト
├── 曖昧な入力への対応
├── 複数ツールが該当しうる入力
├── 大量の出力を返すツール
└── タイムアウト・エラーケース
7. 管理和扩展工具数量
7.1 刀具数量与精度的关系
| 工具数量 | LLM选拔精准度 | 建议措施 |
|---|---|---|
| 1-3 | 1-3高(稳定) | 可以按原样操作 |
| 4-7 | 中等(需要谨慎) | 加强描述差异化 |
| 8-15 | 降低风险 | 考虑划分类别和嵌套代理 |
| 16+ | 不推荐 | 始终拆分代理 |
7.2 代理嵌套模式
如果您有大量工具,请将代理分层。
flowchart TD
U[ユーザー入力] --> RA[ルーティング Agent]
RA -->|IT関連| ITA[IT Agent]
RA -->|人事関連| HRA[HR Agent]
RA -->|経理関連| FNA[Finance Agent]
ITA --> T1[チケットAPI]
ITA --> T2[ナレッジ検索]
HRA --> T3[勤怠API]
HRA --> T4[休暇API]
FNA --> T5[経費API]
FNA --> T6[請求API]
8. 常见问题及解决方法
| 问题 | 原因 | 对策 |
|---|---|---|
| LLM 选择了错误的工具 | 描述相似/不明确 | 指定“何时使用”和“何时不使用” |
| 参数值无效 | 类型/格式规范不足 | 添加枚举、格式、示例 |
| 无需调用工具直接回答 | 使用该工具的条件尚不清楚 | 明确规定了该工具的使用规则 |
| 多次调用同一个工具 | 无循环检测 | 使用指令 |
| 忽略工具响应 | 回复太长 | 简洁地格式化回复 |
| 跳过所需参数 | 未设置必填 | 模式中明确要求 |
9. 清单
在将工具定义投入生产之前,请检查以下内容:
模式质量
- operationId 是一个唯一且易于理解的名称吗?
- 摘要是否在一行中表示了该功能?
- 描述是否包括什么/何时/何时不?
- 参数类型、格式和约束是否准确?
- 所需标志设置正确吗?
- 是否涵盖了枚举的所有可能值?
- 它包含示例吗?
代理指令
- 是否明确说明了使用工具的规则和优先级?
- 是否定义了工具使用限制(次数限制等)?
- 问题的行为是否超出了定义的范围?
测试
- 您是否为每个工具执行了至少 10 个测试用例?
- 是否涵盖正常系统、异常系统和边缘情况?
- 多种工具之间的选择判断是否准确?
- 在错误情况下我们是否正确回退?
10. 总结
Agent工具定义的质量直接关系到Agent的可靠性。
| 元素 | 最重要的一点 |
|---|---|
| 描述 | 不仅要写“做什么”,还要写“何时使用、何时不使用” |
| 参数 | 指定所有类型、格式、约束和示例 |
| 代理须知 | 指定工具使用的规则和优先级 |
| 测试 | 系统验证刀具选择准确性和参数有效性 |
| 缩放 | 当工具数量增加时拆分Agent |
构建稳定的Agent的关键是将工具定义设计为不仅是“API规范”,而且是“LLM的说明”。