使用工具,您可以将代理应用连接到外部系统。这些系统可以增强代理应用的知识,使其能够高效地执行复杂任务。
您可以使用内置工具或构建符合自己需求的自定义工具。
限制
存在以下限制:
- 为代理应用创建数据存储区工具时,您必须创建数据存储区(或连接现有数据存储区)。
- 不支持同时具有分块和非分块数据存储区的应用。
内置工具
内置工具由 Google 托管。 您可以在代理应用中激活这些工具,而无需手动配置。
支持的内置工具包括:
Code Interpreter
:一款 Google 第一方工具,集代码生成和代码执行功能于一身,可让用户执行各种任务,包括数据分析、数据可视化、文本处理、解决方程式或优化问题。
您的代理应用已经过优化,可确定应如何以及何时调用这些工具,但您也可以提供其他示例来满足您的使用场景。
示例应具有如下架构:
{
"toolUse": {
"tool": "projects/PROJECT_ID/locations/LOCATION_ID/agents/AGENT_ID/tools/df-code-interpreter-tool",
"action": "generate_and_execute",
"inputParameters": [
{
"name": "generate_and_execute input",
"value": "4 + 4"
}
],
"outputParameters": [
{
"name": "generate_and_execute output",
"value": {
"output_files": [
{
"name": "",
"contents": ""
}
],
"execution_result": "8",
"execution_error": "",
"generated_code": "GENERATED_CODE"
}
}
]
}
}
OpenAPI 工具
代理应用可以通过提供 OpenAPI 架构,使用 OpenAPI 工具连接到外部 API。默认情况下,代理应用将代表您调用该 API。或者,您也可以在客户端执行 OpenAPI 工具。
示例架构:
openapi: 3.0.0
info:
title: Simple Pets API
version: 1.0.0
servers:
- url: 'https://api.pet-service-example.com/v1'
paths:
/pets/{petId}:
get:
summary: Return a pet by ID.
operationId: getPet
parameters:
- in: path
name: petId
required: true
description: Pet id
schema:
type: integer
responses:
200:
description: OK
/pets:
get:
summary: List all pets
operationId: listPets
parameters:
- name: petName
in: query
required: false
description: Pet name
schema:
type: string
- name: label
in: query
description: Pet label
style: form
explode: true
required: false
schema:
type: array
items:
type: string
- name: X-OWNER
in: header
description: Optional pet owner provided in the HTTP header
required: false
schema:
type: string
- name: X-SESSION
in: header
description: Dialogflow session id
required: false
schema:
$ref: "@dialogflow/sessionId"
responses:
'200':
description: An array of pets
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Pet'
post:
summary: Create a new pet
operationId: createPet
requestBody:
description: Pet to add to the store
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
responses:
'201':
description: Pet created
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
components:
schemas:
Pet:
type: object
required:
- id
- name
properties:
id:
type: integer
format: int64
name:
type: string
owner:
type: string
label:
type: array
items:
type: string
您可以选择使用内部架构引用 @dialogflow/sessionId
作为参数架构类型。使用此参数架构类型时,当前对话的 Dialogflow 会话 ID 将作为参数值提供。例如:
- name: X-SESSION
in: header
description: Dialogflow session id
required: false
schema:
$ref: "@dialogflow/sessionId"
OpenAPI 工具限制
存在以下限制:
- 支持的参数类型为
path
、query
和header
。尚不支持cookie
参数类型。 - OpenAPI 架构定义的参数支持以下数据类型:
string
、number
、integer
、boolean
、array
。尚不支持“object
”类型。 - 您目前无法在控制台示例编辑器中指定查询参数。
- 请求和响应正文必须为空或 JSON。
OpenAPI 工具 API 身份验证
调用外部 API 时,支持以下身份验证选项:
- Dialogflow Service Agent 身份验证
- Dialogflow 可以使用 Dialogflow Service Agent 生成 ID 令牌或访问令牌。 当 Dialogflow 调用外部 API 时,令牌会添加到授权 HTTP 标头中。
- 将 roles/cloudfunctions.invoker 和 roles/run.invoker 角色授予 service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com 后,您就可以使用 ID 令牌访问 Cloud Functions 和 Cloud Run 服务。如果 Cloud Functions 和 Cloud Run 服务位于同一资源项目中,则您无需额外的 IAM 权限即可调用它们。
- 向 service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com 授予所需角色后,您可以使用访问令牌访问其他 Google Cloud API。
- API 密钥
- 您可以通过提供密钥名称、请求位置(标头或查询字符串)和 API 密钥来配置 API 密钥身份验证,以便 Dialogflow 在请求中传递 API 密钥。
- OAuth
- 服务器到服务器身份验证支持 OAuth 客户端凭据流程。需要在 Dialogflow 中配置来自 OAuth 提供方的客户端 ID、客户端密钥和令牌端点。Dialogflow 会交换 OAuth 访问令牌,并将其传入请求的 auth 标头中。
- 对于其他 OAuth 流程,您需要使用函数工具与您自己的登录界面集成,以交换令牌。
- 双向 TLS 身份验证
- 请参阅双向 TLS 身份验证文档。
- 自定义 CA 证书
- 请参阅自定义 CA 证书文档。
数据存储区工具
代理应用可以使用数据存储区工具回答最终用户在您的数据存储区中提出的问题。您可以为每种工具设置一个每种类型的数据存储区,该工具将查询每个数据存储区以查找答案。 默认情况下,代理应用将代表您调用数据存储区工具。或者,您也可以在客户端执行数据存储区工具。
数据存储区类型可以是以下类型之一:
PUBLIC_WEB
:包含公开 Web 内容的数据存储区。UNSTRUCTURED
:包含非结构化私密数据的数据存储区。STRUCTURED
:包含结构化数据(例如常见问题解答)的数据存储区。
以下示例展示了如何引用数据存储区:
"dataStoreConnections": [
{
"dataStoreType": "PUBLIC_WEB",
"dataStore": "projects/PROJECT_NUMBER/locations/LOCATION_ID/collections/default_collection/dataStores/DATASTORE_ID"
},
{
"dataStoreType": "UNSTRUCTURED",
"dataStore": "projects/PROJECT_NUMBER/locations/LOCATION_ID/collections/default_collection/dataStores/DATASTORE_ID"
},
{
"dataStoreType": "STRUCTURED",
"dataStore": "projects/PROJECT_NUMBER/locations/LOCATION_ID/collections/default_collection/dataStores/DATASTORE_ID"
}
]
数据存储区工具响应还可能包含有关用于生成响应的内容来源的片段。代理应用可以进一步提供说明,说明如何通过数据存储区继续提供回答,或者在没有回答时如何进行响应。
您可以通过添加特定问题的 FAQ 条目来覆盖答案。
示例可用于进一步增强代理应用的行为。该示例应具有以下架构:
{
"toolUse": {
"tool": "projects/PROJECT_ID/locations/LOCATION_ID/agents/AGENT_ID/tools/TOOL_ID",
"action": "TOOL_DISPLAY_NAME",
"inputParameters": [
{
"name": "TOOL_DISPLAY_NAME input",
"value": {
"query": "QUERY"
}
}
],
"outputParameters": [
{
"name": "TOOL_DISPLAY_NAME output",
"value": {
"answer": "ANSWER",
"snippets": [
{
"title": "TITLE",
"text": "TEXT_FROM_DATASTORE",
"uri": "URI_OF_DATASTORE"
}
]
}
}
]
}
}
创建数据存储区
如需创建数据存储区并将其关联到您的应用,您可以使用控制台左侧导航栏中的工具链接。按照说明创建数据存储区。
其他查询参数
创建数据存储区工具示例时,有两个可选参数和必需的 query
字符串可供使用:filter
字符串和 userMetadata
结构化对象。
filter
参数可用于过滤结构化数据或包含元数据的非结构化数据的搜索查询。此字符串必须遵循受支持的过滤条件表达式语法。
建议使用多个示例来指示代理 LLM 如何填充此参数。如果过滤条件字符串无效,则在执行搜索查询时,系统会忽略该过滤条件。
根据位置优化搜索结果的 filter
字符串示例可能如下所示:
"filter": "country: ANY(\"Canada\")"
userMetadata
参数提供有关最终用户的信息。任何键值对都可以填充到此参数中。这些元数据会传递到数据存储区工具中,以便更好地为搜索结果和工具响应提供信息。建议提供多个示例,指导代理 LLM 如何填充此参数。
用于优化与特定用户相关的搜索结果的 userMetadata
参数值示例可能如下所示:
"userMetadata": {
"favoriteColor": "blue",
...
}
如果您在测试期间发现某些响应不符合您的预期,可以在数据存储区工具的“工具”页面中进行以下自定义:
依据信心
对于根据连接的数据存储区的内容生成的每个响应,代理都会评估一个置信度,该置信度用于衡量响应中的所有信息都由数据存储区中的信息提供支持。您可以通过选择您可以接受的最低置信度来自定义允许的回答。系统只会显示等于或高于该置信度的回答。
有 5 个置信度可供选择:VERY_LOW
、LOW
、MEDIUM
、HIGH
和 VERY_HIGH
。
摘要配置
您可以选择数据存储区代理针对摘要生成请求使用的生成模型。如果未选择任何模型,则会使用默认模型选项。下表列出了可用的选项:
模型标识符 | 语言支持 |
---|---|
text-bison@001 | 提供所有支持的语言。 |
text-bison@002 | 提供所有支持的语言。 |
微调 text-bison@001(对话) | 目前仅支持英语文本。 |
微调 text-bison@001(信息类) | 目前仅支持英语文本。 |
双子座 - Pro | 提供所有支持的语言。 |
您还可以自行为摘要 LLM 调用提供提示。
提示是可能包含预定义占位符的文本模板。系统会在运行时将占位符替换为适当的值,并将最终文本发送给 LLM。
占位符如下所示:
$original-query
:用户的查询文本。$rewritten-query
:代理使用重写模块将原始用户查询重写为更准确的格式。$sources
:代理使用 Enterprise Search 根据用户的查询搜索来源。找到的源代码以特定格式呈现:[1] title of first source content of first source [2] title of second source content of first source
$conversation
:对话历史记录按以下格式呈现:Human: user's first query AI: answer to user's first query Human: user's second query AI: answer to user's second query
当 LLM 无法提供答案时,自定义提示应指示 LLM 返回“NOT_ENOUGH_INFORMATION”。代理会将此常量转换为便于用户理解的消息。
禁止的词组(代理级配置)
您可以选择定义不允许使用的特定词组。 这些属性在代理级别配置,并供代理 LLM 和数据存储区工具使用。如果生成的响应或 LLM 提示的部分内容(例如用户的输入)一字不差地包含任何禁止的短语,则系统不会显示该响应。
函数工具
如果您的客户端代码可以访问某项功能,但 OpenAPI 工具无法访问该功能,那么您可以使用函数工具。 函数工具始终在客户端执行,而不是由代理应用执行。
具体过程如下:
- 您的客户端代码会发送检测意图请求。
- 代理应用检测到需要函数工具,并且检测意图响应包含工具的名称以及输入参数。此会话将暂停,直到收到另一个包含工具结果的检测意图请求。
- 您的客户端代码调用该工具。
- 您的客户端代码会发送另一个检测意图请求,该请求以输出参数的形式提供工具结果。
以下示例展示了函数工具的输入和输出架构:
{
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, for example, San Francisco, CA"
}
},
"required": [
"location"
]
}
{
"type": "object",
"properties": {
"temperature": {
"type": "number",
"description": "The temperature"
}
}
}
以下示例显示了使用 REST 的初始检测意图请求和响应:
HTTP method and URL:
POST https://REGION_ID-dialogflow.googleapis.com/v3/projects/PROJECT_ID/locations/LOCATION_ID/agents/AGENT_ID/sessions/SESSION_ID:detectIntent
{
"queryInput": {
"text": {
"text": "what is the weather in Mountain View"
},
"languageCode": "en"
}
}
{
"queryResult": {
"text": "what is the weather in Mountain View",
"languageCode": "en",
"responseMessages": [
{
"source": "VIRTUAL_AGENT",
"toolCall": {
"tool": "<tool-resource-name>",
"action": "get-weather-tool",
"inputParameters": {
"location": "Mountain View"
}
}
}
]
}
}
以下示例展示了第二个检测意图请求,该请求提供了工具结果:
{
"queryInput": {
"toolCallResult": {
"tool": "<tool-resource-name>",
"action": "get-weather-tool",
"outputParameters": {
"temperature": 28.0
}
},
"languageCode": "en"
}
}
客户端执行
与函数工具一样,OpenAPI 和数据存储区工具可以在客户端执行,方法是在与会话交互时应用 API 替换。
例如:
DetectIntentRequest {
...
query_params {
playbook_state_override {
playbook_execution_mode: ALWAYS_CLIENT_EXECUTION
}
}
...
}
具体过程如下:
- 您的客户端代码会发送一个指定客户端执行的检测 intent 请求。
- 代理应用检测到需要某个工具,并且检测意图响应包含该工具的名称以及输入参数。此会话将暂停,直到收到另一个包含工具结果的检测意图请求。
- 您的客户端代码调用该工具。
- 您的客户端代码会发送另一个检测意图请求,该请求以输出参数的形式提供工具结果。