执行器最佳实践
1. 背景
在大模型实时互动产品中,有很多特色功能,例如Function Call。有时客户希望在这些功能中,通过HTTP请求查询业务数据,或检索知识库,并让操作的执行结果能够反馈到系统的功能模块、或者说LLM中。
2. 执行器
2.1 执行器概念
大模型实时互动产品定义了执行器概念,用于在系统的部分模块中调用预先定义的资源,目的是让系统能够与外部服务、内部知识库进行交互,查询实时数据或执行动作(例如网页搜索、数据库查询或内容处理),并在系统内部使用执行结果,从而实现高度自定义的业务能力。
2.2 执行器分类
现阶段只有RAG执行器一种类型,后续可能会扩展HTTP执行器等。
2.3 执行器表达式和使用方式
系统支持在角色Prompt、Function描述中通过表达式形式,来定义执行器的使用或者是环境变量。
执行器表达式包含3个部分:
- 系统执行器类型名称,目前只支持
sys_rag。 - 执行器资源ID,由客户定义,可理解为要执行的目标方法名。
- 执行器参数,在部分类别的执行器中,支持传入执行动作所需的输入参数。
执行器表达式格式如下:
1{{系统执行器类型名称.执行器资源ID()}}
3. RAG执行器
使用RAG执行器功能,一般需要经过如下几步:
- 在控制台创建知识库并上传文档;
- 定义RAG资源池,在资源池中声明要检索的知识库ID、检索策略等;
- 在角色Prompt,或Function描述、Function参数描述中编写执行器表达式,以及如何使用执行结果的规则。
3.1 知识库建立
目前,RAG执行器只支持系统内置的轻量级知识库,不支持第三方知识库。
需要客户在控制台提前创建好知识库并上传文档。上传文档的要求及创建知识库的流程,请参考知识库使用最佳实践中3.1.1 文档要求和3.2 控制台方式接入小节。
3.2 定义RAG资源池
定义RAG资源池后,可以在系统多个模块中使用资源池中的资源,不同模块之间也可以复用同一个资源。
3.2.1 RagCfg数据结构
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | String | 是 | 执行器唯一ID,prompt表达式中通过sys_rag.<id>()调用执行器 |
| kbIds | String[] | 是 | 执行器检索的知识库ID列表,支持配置多个kbId |
| recall | Object | 否 | 召回配置 |
| +type | String | 否 | 检索类型,取值hybrid表示混合检索 |
| +topK | Integer | 否 | 控制召回阶段返回得分最高的k个元素 |
| +rerank | Object | 否 | 重排序配置 |
| +enable | Boolean | 否 | 是否开启重排序 |
| +topK | Integer | 否 | 控制重排序阶段返回得分最高的k个元素,需小于recall.topK |
3.2.2 配置方式
通过服务端API的创建大模型互动实例(互动智能体)接口,在config字段中增加ragCfgs字段,即可定义RAG资源池。
config数据结构(以下仅列出与RAG资源池字段):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ragCfgs | RagCfg[] | 否 | RAG执行器定义列表 |
配置示例如下:
1{
2 "config": "{\"ragCfgs\": [{...},{...}]}"
3}
3.2.3 RAG资源池示例
1{
2 "ragCfgs": [
3 {
4 "id": "answerRag",
5 "kbIds": ["kb1"]
6 },
7 {
8 "id": "func1Rag",
9 "kbIds": ["kb2"]
10 },
11 {
12 "id": "func2Rag",
13 "kbIds": ["kb3","kb4"],
14 "recall": {"topK": 1}
15 }
16 ]
17}
3.3 使用RAG执行器
3.3.1 RAG执行器表达式
RAG执行器名称为:sys_rag。
(1)基础用法 系统默认使用当前对话的用户query作为检索知识库的query,基础用法如下:
1{{sys_rag.执行器资源ID()}}
(2)高级用法(传入参数) 系统还支持使用固定的query检索知识库,需在表达式括号内传入参数,格式如下:
1{{sys_rag.执行器资源ID(query="参数取值")}}
3.3.2 支持模块
系统支持在如下模块中使用RAG执行器:
- 角色模块,可以在角色Prompt中使用RAG执行器表达式。
- Function Call模块,可以在Function的描述、以及参数的描述中使用RAG执行器表达式。
3.3.3 使用示例
如下是在历史老师角色Prompt中,使用RAG执行器基础用法和高级用法检索知识库的示例:
1## 角色设定
2你是一名知识渊博、耐心友善的历史老师。
3
4## 任务
5回答学生提出的历史问题,帮助学生理解历史事件、人物和时代背景。
6
7## 回答原则
81. 优先结合“相关历史知识”回答学生的问题。
92. “近代史概要”仅在与问题相关时作为背景补充。
103. 围绕学生的问题回答,不主动扩展无关内容。
114. 不机械复述知识库,应整理后用通俗易懂的方式讲解。
125. 不编造历史事实;存在争议时,客观说明不同观点。
13
14## 回答要求
15语言简洁、生动,适合学生理解。根据问题需要说明事件经过、原因、背景或影响。
16
17## 知识库检索结果
18### 相关历史知识
19{{sys_rag.answerRag()}}
20
21### 近代史概要
22{{sys_rag.answerRag(query="中国近代史概要")}}
3.3.4 使用建议
在Function Call等相对复杂的功能中,模型需要理解Function的能力并提取参数,上下文过长会影响参数提取效果。建议在Function Call中使用RAG执行器时,将recall.topK配置为1,避免引入过多上下文。
在角色对话场景中,一般无需配置recall和rerank;如果配置的话,recall.topK建议不要大于3。
3.4 知识库意图路由和RAG执行器对比
3.4.1 知识库意图路由
控制台/接口中的知识库意图路由功能,需要客户先配置意图路由,只有意图命中后,才会触发知识库检索和模型总结回答。
优点:
- 延迟低;
- 由大模型判断意图,避免召回无关知识内容而污染对话;
- 知识库总结回复规则已内置,无需客户关注。
缺点:
- 需要配置意图路由。如果意图不命中,无法检索知识库。
备注:
- 知识库意图路由,优先级高于Function Call,且不区分用户query是闲聊还是动作类。因此,当同时使用知识库意图路由和Function Call时,需要注意两者的意图路由不能有冲突。
3.4.2 RAG执行器
RAG执行器不仅可以用在角色对话功能上,还可以用在Function Call等模块;并且客户可以通过执行器表达式,自行编写知识库检索结果的使用规则。
优点:
- 高度自定义,客户可自行编写知识库结果使用规则;
- 可以用在Function Call等模块;
- 无需配置意图路由。
缺点:
- 执行器在实际使用时才会触发,延迟相对偏高;
- 默认检索可能会导致无关知识影响对话效果。
备注:
- RAG执行器只对配置了执行器表达式的模块生效。如果在角色Prompt中配置RAG执行器,则只有在闲聊时才会触发执行器检索;命中实搜、视觉等模块时,不会触发知识库检索,因此不会影响这些模块的回复效果;
- 如果产品形态较为单一、功能范围较小,对话功能集中于知识库问答,则建议通过RAG执行器实现默认检索。
评价此篇文章
