控制会话上下文 - Amazon Bedrock

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

控制会话上下文

为了更好地控制会话上下文,可以在代理中修改SessionState对象。该SessionState对象包含可以跨轮维护的信息(单独的InvokeAgent请求和响应)。在用户对话期间,您可以使用这些信息为代理提供对话上下文。

SessionState对象的一般格式如下。

{ "sessionAttributes": { "<attributeName1>": "<attributeValue1>", "<attributeName2>": "<attributeValue2>", ... }, "promptSessionAttributes": { "<attributeName3>": "<attributeValue3>", "<attributeName4>": "<attributeValue4>", ... }, "invocationId": "string", "returnControlInvocationResults": [ ApiResult or FunctionResult, ... ], "knowledgeBases": [ { "knowledgeBaseId": "string", "retrievalConfiguration": { "vectorSearchConfiguration": { "overrideSearchType": "HYBRID | SEMANTIC", "numberOfResults": int, "filter": RetrievalFilter object } } }, ... ] }

选择一个主题以了解有关SessionState对象中字段的更多信息。

会话和提示会话属性

Amazon Bedrock 代理允许您定义以下类型的上下文属性,这些属性将在会话的各个部分中持续存在:

  • 会话属性-在用户和代理之间的会中持续存在的属性。只要未超过会话时间限制 (theidleSessionTTLinSeconds),所有使用相同的InvokeAgent请求都sessionId属于同一个会话。

  • promptSessionAttributes— 在一回合(一次InvokeAgent调用)内持续存在的属性。编辑编排基础提示模板时,可以使用 $prompt_session_attributes$ 占位符。此占位符将在运行时使用您在promptSessionAttributes字段中指定的属性进行填充。

您可以通过两个不同的步骤定义会话状态属性:

会话属性示例

以下示例使用会话属性对发送给用户的消息进行个性化设置。

  1. 编写您的应用程序代码,要求用户提供他们的名字和他们想要向代理发出的请求,并将答案存储为变量<first_name>和<request>。

  2. 编写您的应用程序代码以发送带有以下正文的InvokeAgent请求:

    { "inputText": "<request>", "sessionState": { "sessionAttributes": { "firstName": "<first_name>" } } }
  3. 当用户使用您的应用程序并提供他们的名字时,您的代码将发送名字作为会话属性,代理将在会期间存储他们的名字。

  4. 由于会话属性是在 Lambda 输入事件中发送的,因此您可以在 Lambda 函数中为操作组引用这些会话属性。例如,如果操作 API 架构要求在请求正文中使用名字,则可以在为操作组编写 Lambda 函数时使用firstName会话属性,以便在发送 API 请求时自动填充该字段。

提示会话属性示例

以下一般示例使用提示会话属性为代理提供临时上下文。

  1. 编写应用程序代码,将用户请求存储在名为的变量中<request>。

  2. 如果用户在中使用表示相对时间的单词(例如 “tomorrow”),则编写应用程序代码以检索用户所在地的时区<request>,并存储在名为的变量中<timezone>。

  3. 编写您的应用程序以发送带有以下正文的InvokeAgent请求:

    { "inputText": "<request>", "sessionState": { "promptSessionAttributes": { "timeZone": "<timezone>" } } }
  4. 如果用户使用表示相对时间的单词,则您的代码将发送 p timeZone rompt session 属性,代理将在回合期间将其存储。

  5. 例如,如果用户询问I need to book a hotel for tomorrow,您的代码会将用户的时区发送给代理,代理可以确定 “明天” 所指的确切日期。

  6. 提示会话属性可以在以下步骤中使用。

操作组调用结果

如果您将操作组配置为在InvokeAgent响应中返回控制权,则可以通过包含以下字段在后续InvokeAgent响应中发送调用该sessionState操作组的结果:

  • invocationId— 此 ID 必须与InvokeAgent响应returnControl字段中ReturnControlPayload对象中invocationId返回的 ID 相匹配。

  • returnControlInvocationResults— 包括您通过调用操作获得的结果。您可以将应用程序设置为传递ReturnControlPayload对象以执行 API 请求或调用您定义的函数。然后,您可以在此处提供该操作的结果。returnControlInvocationResults列表中的每个成员都是以下成员之一:

    • 一个ApiResult对象,其中包含代理预测的应InvokeAgent按先前顺序调用的 API 操作,以及在系统中调用该操作的结果。一般格式如下:

      { "actionGroup": "string", "apiPath": "string", "httpMethod": "string", "httpStatusCode": integer, "responseBody": { "TEXT": { "body": "string" } } }
    • 一个FunctionResult对象,其中包含代理预测的函数应InvokeAgent按先前的顺序调用,以及在系统中调用该操作的结果。一般格式如下:

      { "actionGroup": "string", "function": "string", "responseBody": { "TEXT": { "body": "string" } } }

提供的结果可用作进一步编排的上下文,发送到后期处理以供代理格式化响应,或者直接用于代理对用户的响应。

知识库检索配置

要修改附加到代理的知识库的检索配置,请在knowledgeBaseConfigurations字段中添加要指定其配置的每个知识库的配置列表。请指定 knowledgeBaseId。在该vectorSearchConfiguration字段中,您可以指定以下查询配置(有关这些配置的更多信息,请参阅查询配置):

  • 搜索类型-知识库是仅搜索矢量嵌入 (SEMANTIC) 还是同时搜索矢量嵌入和原始文本 (HYBRID)。使用字overrideSearchType段。

  • 检索到的最大结果数-要在响应中使用的查询检索结果的最大数量。

  • 元数据和筛选-可以配置为根据数据源文件中的元数据属性筛选结果的筛选器。