从模型生成回复
给定用户提示,从 AI 模型获取文本回复。
另请参阅
选项
-
账户名是用于 AI 账户名的文本表达式。在当前文件中,使用配置 AI 账户脚本步骤设置账户,并在此脚本步骤运行之前随时为其分配此名称。
-
模型是要使用的文本生成模型的名称。将模型名称指定为文本表达式。有关支持的模型,请参阅 FileMaker 技术规格。
-
“用户提示”是用于向模型发送自然语言请求或问题的文本表达式,通常是用户提出的请求。
-
“代理模式”控制此脚本步骤如何处理自动化工具交互:
-
开:启用自动多步交互,模型可以反复调用工具,直到得出最终结果。
-
关:执行单个交互,并在第一次工具调用后停止,而不执行工具调用或在回复中返回结果,允许手动处理和调试。如果没有进行工具调用,则在回复中返回来自模型的结果。
-
-
“回复”指定要存储脚本步骤结果的字段或变量。如果指定一个字段并选择“流”,则该字段必须位于当前布局上。
-
“指令”是一种文本表达式,为模型提供额外的上下文或行为准则。
-
“消息”指定包含消息历史记录的字段或变量,以提供之前交互的模型上下文。消息是 JSON 对象的数组。每个 JSON 对象必须包含消息文本(
content
)和内容提供者(role
) - 用户("user"
)或模型("assistant"
)- 的键值对。例如:复制[
{
"content": "What is the temperature in Cupertino?",
"role": "user"
},
{
"content": "The temperature in Cupertino is 72 degrees Fahrenheit.",
"role": "assistant"
}
] -
“将消息历史记录存储到”指定脚本步骤存储消息历史记录的变量。格式与“消息”相同,此脚本步骤当前运行的消息对添加到末尾。
如果您希望消息历史记录在当前脚本结束后保持不变,请使用全局变量(该变量在 FileMaker 客户端会话结束前保持不变)或将变量的值存储在字段中。请参阅“使用变量”或“设置字段脚本步骤”。
-
“消息历史记录计数”是一种数字表达式,用于控制之前的消息对(用户问题和助理答案)的数量,以包含在“将消息历史记录保存到”指定的变量中。
-
“温度”控制模型对提示响应的随机性或创造性。低值产生更确定的的事实结果。高值产生更有创意、出人意料或不太连贯的结果。请参阅模型提供商的文档,以获取您正在使用的特定模型的有效范围。
-
“工具定义”指定模型在处理过程中可以调用的可用工具的 JSON 数组。请参阅下面的“工具定义”。
-
“来自模型的工具调用”指定存储模型所进行的工具调用信息的位置。这可能有助于调试或审核模型对工具的使用。
-
“流”控制响应的交付方式:
-
开:检索响应并进行递增传递(逐字或逐短语)。这可让 FileMaker 客户端响应更快。
-
关:在可用之前检索整个回复。这可能会导致 FileMaker 客户端在等待完整回复时出现无响应。
-
-
参数是 JSON 对象的文本表达式,由模型提供商支持的其他参数的键值对组成。例如:
{"温度": 0.7,“种子”:42}
.有关受支持参数的键名称及其有效范围,请参阅模型提供商的文档。 -
在 Web 查看器中执行 JavaScript 指定在脚本步骤完成后在目标 Web 查看器中执行的 JavaScript 代码。此选项类似于运行在 Web 查看器中执行 JavaScript 脚本步骤作为下一个脚本步骤,除了“流”选项为“开”时,响应可以传递到 JavaScript 函数,并以流式传输到 Web 查看器。
-
Web 查看器指定当前布局上 Web 查看器的对象名称。
-
函数名称是在 Web 查看器中调用的 JavaScript 函数的名称。
-
兼容性
产品 | 是否支持 |
FileMaker Pro | 是 |
FileMaker Go | 是 |
FileMaker WebDirect | 是 |
FileMaker Server | 是 |
FileMaker Cloud | 是 |
FileMaker Data API | 是 |
自定义 Web 发布 | 是 |
原始版本
22.0
说明
此脚本步骤可促进定制化 App 和 AI 模型之间的多步骤交互,使模型能够在需要时通过工具调用访问和操作数据。脚本步骤基于代理模式选项以两种不同的模式运行,每种模式都提供不同级别的自动化和对交互的控制。
此脚本步骤和模型之间的交互通常会执行以下步骤:
-
此脚本步骤将用户提示、任何指令、来自消息的对话上下文以及可用的工具定义发送到配置的模型。
-
模型分析提示,确定它是否可以提供直接响应,还是需要使用工具来收集其他信息或执行操作。
-
如果需要工具,模型会根据可用工具定义和用户的请求生成具有适当参数的工具调用。
-
此脚本步骤接收来自模型的工具调用,然后 FileMaker客户端执行它们。工具执行可能包括预定义的工具,如 SQL 查询或调用您自己的自定义函数。
-
此脚本步骤将工具执行的结果发回模型,为模型提供继续处理所需的数据或确认。
-
如果模型确定需要额外的工具才可完全解决提示,它可能会产生更多工具调用(重复步骤 3-5)。这个迭代过程会持续进行,直到模型有足够的信息来提供全面的回复。
-
在模型完成所有必要的工具交互后,它生成整合工具结果并解决原始用户提示的最终回复。
-
此脚本步骤接收最终响应,将其存储在指定的”回复“目标中,并且可以选择性更新”将消息历史记录保存到“中的交互历史记录。
”代理模式“选项决定交互的处理方式:
-
开:启用与工具的自动多步交互,自动执行完整的工作流程(步骤 1-8)。当 AI 模型确定需要工具来满足请求时,它会自动调用适当的工具并继续处理,直到得出最终结果。该模型可以根据需要进行多轮工具调用,每轮都建立在之前工具执行的结果之上。此模式适用于需要多个工具交互的复杂任务,例如分析多个表中的数据、生成报告或执行多步骤操作。
-
关:与 AI 模型执行一次交互,仅执行步骤 1-3,并在第一次工具调用后停止。如果模型确定需要工具,脚本步骤会停止并返回”来自模型的工具调用“中的工具调用信息,而不是自动执行工具。此模式对于调试工具交互、了解模型想要使用哪些工具或想要手动控制工具执行时很有用。您可以检查工具调用,然后决定是手动执行它们还是修改方法。
此脚本步骤和模型之间的信息流确保敏感数据在启用 AI 驱动功能的同时保持安全。模型仅接收通过提示、指令和工具结果明确提供的信息 - 它无法直接访问您的 FileMaker 数据库或文件。工具调用在受控的 FileMaker 环境中执行,允许您通过 FileMaker 账户和权限保持对数据访问和操作的完全控制,同时利用模型的分析和推理功能。
工具定义
”工具使用“(一些模型提供商也称之为”函数调用“)允许模型回调到您的 FileMaker Pro 应用,以执行模型生成最终回复所需的某些操作或提供所需信息。在代理模式下,模型可以反复调用多个工具,直到完成为止。在”工具定义“选项中,您可以定义以下工具:
-
execute_sql
:一个执行指定 SQL 查询的预定义工具,能够以通过自然语言执行 SQL 查询脚本步骤同样的方式执行模型传递的 SQL 语句。 -
retrieve_image
:一个预定义的工具,从 SQL 查询、表名和容器字段名称指定的容器字段中检索图像。 -
自定义函数:文件中定义的任何自定义函数。请参阅”使用自定义函数“。
工具定义使用模型提供商要求的 JSON 格式指定。一般来说,定义是一个对象数组,每个对象都指定了工具的名称,详细说明了该工具的作用以及模型在使用时应遵循的规则,以及每个输入参数、其名称、数据类型和描述。描述应该尽可能详细,以便模型可靠地使用该工具。如果使用预定义的工具,请先使用下面提供的定义。如果需要,请修改它们,以获得所用模型的最佳结果。
为了帮助您调试工具定义,请将”来自模型的工具调用“选项设置为字段或变量,您可以在其中查看模型如何或是否调用工具。这有助于显示您在工具定义中提供的描述中可能需要添加或更改的内容。
有关用于工具定义和工具调用的特定 JSON 格式,请参阅模型提供商的文档,例如,Anthropic、Cohere 和 OpenAI。
execute_sql
函数名称 |
|
|
函数描述 |
|
|
参数名称 |
|
|
参数描述 |
将您希望模型使用的模式附加到本描述的末尾。在数据定义语言 (DDL) 中提供由 GetTableDDL函数返回的模式,用于您想要包含的表摹本。 |
返回:SQL 查询的结果返回为字符串。
retrieve_image
函数名称 |
|
|
函数描述 |
|
|
参数 1 名称 |
|
|
参数 1 描述 |
将您希望模型使用的模式附加到本描述的末尾。在数据定义语言 (DDL) 中提供由 GetTableDDL函数返回的模式,用于您想要包含的表摹本。 |
|
参数 2 名称 |
|
|
参数 2 描述 |
包含图像字段的表的名称。 |
|
参数 3 名称 |
|
|
参数 3 描述 |
存储图像的容器字段。 |
返回:以下格式的 JSON 数据,包含 Base64 编码字符串的图像。
[
{
"data": "/9j/4AAQ...//2Q=="
}
]
自定义函数
遵循以下工具定义规范,以调用自定义函数:
-
对于函数:
-
在”
名称
“键中,使用“编辑自定义函数”对话框中定义的自定义函数的名称。 -
在”
描述
“键中,提供有关自定义函数的作用以及模型在使用时应遵循的规则的详细说明。
-
-
对于参数:
-
参数的数量和顺序必须与“编辑自定义函数”对话框中定义的
参数
完全一致。参数名称不需要相同。 -
在”
描述
“键中,提供模型在参数中必须提供的内容的详细描述。 -
将”
类型
“键的值设置为“字符串”(参数始终被视为文本)。
-
注释
-
常见错误信息包括:当模型无法确定应使用的合适工具时,会提示“未找到与提示对应的工具调用”;当工具定义引用了不存在的自定义函数时,会提示“函数未找到”。
示例 1
配置 AI 账户,进入”联系人“布局,然后显示一个对话框,供用户输入问题。然后,“从模型中生成回复”脚本步骤将提示和最近的消息历史记录发送到模型,并将结果流式传输到回复字段。对于这样的简单问答互动,未选择代理模式。为了在当前 FileMaker 客户端会话期间与模型保持上下文,脚本步骤通过”将消息历史记录存储到“选项将最近的 10 条消息存储在 $$Messages 全局变量中。通过”消息“选项,当该脚本随后在同一会话中运行时,脚本步骤将 $$Messages 变量的值发送到模型。由于未使用”工具定义“选项,模型将无法回答有关您数据的问题。
配置 AI 账户 [ 账户名称: "my-account" ; 模型提供商: OpenAI ; API 密钥: Global::API_Key ]
转到布局 [ "联系人" (联系人) ]
显示自定义对话框 [ "输入问题" ; $UserPrompt ]
从模型生成回复 [ 账户名称: "my-account" ; 模型: Global::ModelName ; 用户提示: $UserPrompt ; 回复: Contacts::Response ; 消息: $$Messages ; 将消息历史记录保存到: $$Messages ; 消息历史记录计数: 10 ; 流 ]
示例 2
配置 AI 账户,转到”联系人“布局,接着向模型发送一个询问联系人表中数据的提示,模型会使用相关工具生成回复。由于最多有 10 条消息通过 $$Messages 保存到消息全局字段,因此整个 FileMaker 客户端会话都会保留上下文。
配置 AI 账户 [ 账户名称: "my-account" ; 模型提供商: OpenAI ; API 密钥: Global::API_Key ]
转到布局 [ "联系人" (联系人) ]
设置变量 [ $Instructions ; 值: "你是一个能够查询数据库信息的有用助手。 请始终提供清晰、格式规范的回复。”]
设置变量 [ $UserPrompt ; "我们有多少来自 Acme Anvils 的联系人,他们的姓名和电子邮箱地址分别是什么? 在我们设有销售办事处的城市的联系人后添加一个星号。"]
从模型生成回复 [ 账户名称: "my-account" ; 模型: Global::ModelName ; 用户提示: $UserPrompt ; 回复: Contacts::Response ; 来自模型的工具调用: $$ToolCalls ; 指令: $Instructions ; 消息: Global::Messages ; 将消息历史记录保存到: $$Messages ; 消息历史记录计数: 10 ; 工具定义: Global::ToolDefinitions ; 流 ]
设置字段 [ Global::Messages ; $$Messages ]
ToolDefinitions 字段包含以下针对 OpenAI 模型提供商的 JSON 格式内容:
[
{
"function": {
"description": "Respond to the user’s questions by executing the appropriate SQL query using this function. Strictly follow these rules:\r 1. The input should be a fully formed SQL query.\r 2.Perform separate SQL instead of one nested SQL.\r 3.Escaping special characters for SQL query.\r 4.If the result of the toolCall is a raw string that reads 'empty' or 'null', the answer should contain the quoted raw string, which is case sensitive.\r 5.Convert the user’s request into an SQL query using standard SQL syntax only. Ensure that table names and field names match exactly as they appear in the database schema.",
"name": "execute_sql",
"parameters": {
"properties": {
"sql_query": {
"description": "Generate a fully formed SQL query based on following rules:\r 1. Enclose all table and field names in double quotes.\r 2.Format dates as \"DATE 'YYYY-MM-DD'\", times as \"TIME 'HH:MM:SS'\" and timestamps as \"TIMESTAMP 'YYYY-MM-DD HH:MM:SS'\".\r 3.Return queries in plain text (not JSON).\r 4.Use \"FETCH FIRST n ROW ONLY\" instead of \"LIMIT\".\r 5.Support single queries only.\r 6.No semicolon is needed at the end of SQL query.\r 7.Don't generate nested SQL queries.\r 8.Use \"LIKE\" instead of \"ILIKE\".\r 9.Keep all comparisons case-sensitive.\r 10. Do not include fields that are not included in the question.\r 11.Use unquoted ROWID in queries.\r 12.Only utilize the following database schema:\rCREATE TABLE \"Contacts\" (\r\"First Name\" varchar(255),\r\"Last Name\" varchar(255),\r\"Email\" varchar(255),\r\r\"City\" varchar(255),\r\"Company\" varchar(255)\r);\r\r",
"type": "string"
}
},
"type": "object",
"required": ["sql_query"]
}
},
"type": "function"
},
{
"function": {
"description": "Check whether our company has a sales office in a specified city. If it does, this function returns 'yes'; otherwise, it returns 'no'.",
"name": "CityHasSalesOffice",
"parameters": {
"properties": {
"city": {
"description": "The name of a city",
"type": "string"
}
},
"type": "object",
"required": ["city"]
}
},
"type": "function"
}
]
对于 execute_sql,使用上面提供的函数描述和参数描述。在 sql_query 参数中,使用上面提供的描述,然后是联系人表的模式。
自定义函数 CityHasSalesOffice 根据指定城市是否有销售办事处返回“是”或“否”。
可能的回复流式传输到”回复“字段:
我们有 4 个来自 Acme Anvils 的联系人。以下是他们的姓名、电子邮件地址,以及表明他们是否在有销售办事处的城市的星号:
1. Alea Marks, aleamarks165@example.com
2. Kelly Holden, kellyholden1361@example.com *
3. Kelsey Cummings, kelseycummings1396@example.com
4. Kuame Savage, kuamesavage7146@example.com
$$ToolCalls 变量包含几个对 execute_sql 和 CityHasSalesOffice 的调用。
[
{
"index": 0,
"id": "call_e7...",
"type": "function",
"function": {
"name": "execute_sql",
"arguments": "{\"sql_query\":\"SELECT COUNT(*) FROM \\\"Contacts\\\" WHERE \\\"Company\\\" = 'Acme Anvils'\"}"
}
},
{
"index": 0,
"id": "call_o0...",
"type": "function",
"function": {
"name": "execute_sql",
"arguments": "{\"sql_query\":\"SELECT \\\"First Name\\\", \\\"Last Name\\\", \\\"Email\\\", \\\"City\\\" FROM \\\"Contacts\\\" WHERE \\\"Company\\\" = 'Acme Anvils'\"}"
}
},
{
"index": 0,
"id": "call_ev...",
"type": "function",
"function": {
"name": "CityHasSalesOffice",
"arguments": "{\"city\": \"Onitsha\"}"
}
},
{
"index": 1,
"id": "call_IC...",
"type": "function",
"function": {
"name": "CityHasSalesOffice",
"arguments": "{\"city\": \"Berlin\"}"
}
},
{
"index": 2,
"id": "call_Pw...",
"type": "function",
"function": {
"name": "CityHasSalesOffice",
"arguments": "{\"city\": \"Saint-Malo\"}"
}
},
{
"index": 3,
"id": "call_Uy...",
"type": "function",
"function": {
"name": "CityHasSalesOffice",
"arguments": "{\"city\": \"Wanneroo\"}"
}
}
]