flow moduoles (#161)
* flow intro * docs:flow modules * docs:flow modules
@@ -20,6 +20,12 @@
|
||||
"sidebar.docSidebar.category.Flow Modules": {
|
||||
"message": "高级编排"
|
||||
},
|
||||
"sidebar.docSidebar.category.Modules Intro": {
|
||||
"message": "模块介绍"
|
||||
},
|
||||
"sidebar.docSidebar.category.Examples": {
|
||||
"message": "例子"
|
||||
},
|
||||
"sidebar.docSidebar.category.Other": {
|
||||
"message": "其他"
|
||||
}
|
||||
|
@@ -2,7 +2,7 @@
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# 其他对话模型配置
|
||||
# 配置其他对话模型
|
||||
|
||||
默认情况下,FastGPT 只配置了 GPT 的 3 个模型,如果你需要接入其他模型,需要进行一些额外配置。
|
||||
|
||||
|
@@ -0,0 +1 @@
|
||||
# 待补充
|
Before Width: | Height: | Size: 413 KiB After Width: | Height: | Size: 437 KiB |
After Width: | Height: | Size: 273 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 329 KiB |
@@ -1,19 +1,83 @@
|
||||
# 介绍(待完成)
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
FastGpt V4 后将采用新的交互方式来构建 AI 应用。使用了“节点”编排的方式去掉原先的表单方式。提高可玩性和扩展性的同时也提高了上手的门槛,这篇文章就来简单介绍一下 “预览版” 的模块编排基本使用方法。
|
||||
# 快速了解
|
||||
|
||||

|
||||
FastGpt V4 后将采用新的交互方式来构建 AI 应用。使用了 Flow 节点编排的方式来实现复杂工作流,提高可玩性和扩展性。但同时也提高了上手的门槛,有一定开发背景的用户使用起来会比较容易。
|
||||
|
||||
预览版仅包含了 8 个模块,你可以利用它们来完全实现 V3 的知识库功能。此外,预览版还加入了问题分类模块,可以实现多路线任务。
|
||||
这篇文章就来简单介绍一下模块编排基本内容。每个模块的详解会单独分出一章。
|
||||
|
||||
## 基础知识
|
||||

|
||||
|
||||
### 什么是模块
|
||||
## 什么是模块?
|
||||
|
||||
在程序中,模块可以理解为一个个 function 或者接口。对于非技术背景同学,可以理解为它就是一个**步骤**。将多个模块一个个拼接起来,即可一步步的去实现最终的 AI 输出。
|
||||
在程序中,模块可以理解为一个个 function 或者接口。可以理解为它就是一个**步骤**。将多个模块一个个拼接起来,即可一步步的去实现最终的 AI 输出。
|
||||
|
||||
### 如何阅读和理解
|
||||
如下图,是一个最简单的 AI 对话。它由用户输入的问题、聊天记录以及 AI 对话模块组成。
|
||||
|
||||

|
||||
|
||||
运行的流程如下:
|
||||
|
||||
1. 用户输入问题后,会向服务器发送一个请求,并携带问题。从而得到【用户问题】模块的一个输出。
|
||||
2. 根据设置的【最长记录数】来进行获取数据库中的记录数,从而得到【聊天记录】模块的输出。
|
||||
经过上面两个流程,就得到了左侧两个蓝色点的结果。结果会被注入到右侧的【AI】对话模块。
|
||||
3. AI 对话模块根据传入的聊天记录和用户问题,调用对话接口,从而实现回答。(这里的对话结果输出隐藏了起来,默认只要触发了对话模块,就会往客户端输出内容)
|
||||
|
||||
### 模块分类
|
||||
|
||||
从功能上,可以分为 3 类:
|
||||
|
||||
1. 仅读模块:全局变量、用户引导
|
||||
2. 系统模块:聊天记录(无输入,直接从数据库取)、用户问题(流程入口)
|
||||
3. 功能模块:知识库搜索、AI 对话等剩余模块。(这些模块都有输入和输出,可以自由组合)
|
||||
|
||||
### 模块的组成
|
||||
|
||||
每个模块会包含 3 个核心部分:固定参数、外部输入(左边有个圆圈)和输出(右边有个圆圈)。
|
||||
|
||||
对于仅读模块,只需要根据提示填写即可,不参与流程运行。
|
||||
|
||||
对于系统模块,通常只有固定参数和输出,主要需要关注输出到哪个位置。
|
||||
|
||||
对于功能模块,通常这 3 部分都是重要的,以下图的 AI 对话为例
|
||||
|
||||

|
||||
|
||||
- 对话模型、温度、回复上限、系统提示词和限定词为固定参数,同时系统提示词和限定词也可以作为外部输入,意味着如果你有输入流向了系统提示词,那么原本填写的内容就会被**覆盖**。
|
||||
|
||||
- 触发器、引用内容、聊天记录和用户问题则为外部输入,需要从其他模块的输出流入。
|
||||
|
||||
- 回复结束则为该模块的输出。
|
||||
|
||||
### 模块什么时候执行?
|
||||
|
||||
记住原则:
|
||||
|
||||
1. 仅关心**已连接的**外部输入,即左边的圆圈被连接了。
|
||||
2. 当连接内容都有值时触发。
|
||||
|
||||
#### 例子 1:
|
||||
|
||||
聊天记录模块会自动执行,因此聊天记录输入会自动赋值。当用户发送问题时,【用户问题】模块会输出值,此时【AI 对话】模块的用户问题输入也会被赋值。两个连接的输入都被赋值后,会执行 【AI 对话】模块。
|
||||
|
||||

|
||||
|
||||
#### 例子 2:
|
||||
|
||||
下图是一个知识库搜索例子。
|
||||
|
||||
1. 历史记录会流入【AI】对话模块。
|
||||
2. 用户的问题会流入【知识库搜索】和【AI 对话】模块,由于【AI 对话】模块的触发器和引用内容还是空,此时不会执行。
|
||||
3. 【知识库搜索】模块仅一个外部输入,并且被赋值,开始执行。
|
||||
4. 【知识库搜索】结果为空时,“搜索结果不为空”的值为空,不会输出,因此【AI 对话】模块会因为触发器没有赋值而无法执行。而“搜索结果为空”会有输出,流向指定回复的触发器,因此【指定回复】模块进行输出。
|
||||
5. 【知识库搜索】结果不为空时,“搜索结果不为空”和“引用内容”都有输出,会流向【AI 对话】,此时【AI 对话】的 4 个外部输入都被赋值,开始执行。
|
||||
|
||||

|
||||
|
||||
## 如何阅读?
|
||||
|
||||
1. 建议从左往右阅读。
|
||||
2. 从 **用户问题** 模块开始。用户问题模块,代表的是用户发送了一段文本,触发任务开始。
|
||||
3.
|
||||
3. 关注 AI 对话和指定回复模块,这两个模块是输出答案的地方。
|
||||
|
@@ -0,0 +1,64 @@
|
||||
# AI 对话
|
||||
|
||||
- 可重复添加(复杂编排时候防止线太乱,可以更美观)
|
||||
- 有外部输入
|
||||
- 有静态配置
|
||||
- 触发执行
|
||||
- 核心模块
|
||||
|
||||

|
||||
|
||||
## 参数说明
|
||||
|
||||
### 对话模型
|
||||
|
||||
可以通过 [data/config.json](/docs/develop/data_config/chat_models) 配置可选的对话模型,通过 [OneAPI](http://localhost:3000/docs/develop/oneapi) 来实现多模型接入。
|
||||
|
||||
### 温度 & 回复上限
|
||||
|
||||
温度:越低回答越严谨,少废话(实测下来,感觉差别不大)
|
||||
|
||||
回复上限:最大回复 token 数量(只有 OpenAI 模型有效)。注意,是回复!不是总 tokens。
|
||||
|
||||
### 系统提示词(可被外部输入覆盖)
|
||||
|
||||
被防止在上下文数组的最前面,role 为 system,用于引导模型。具体用法参考各搜索引擎的教程~
|
||||
|
||||
### 限定词(可被外部输入覆盖)
|
||||
|
||||
与系统提示词类似,role 也是 system 类型,只不过位置会被放置在问题前,拥有更强的引导作用。
|
||||
|
||||
### 引用内容
|
||||
|
||||
接收一个外部输入的数组,主要是由【知识库搜索】模块生成,也可以由 Http 模块从外部引入。数据结构例子如下:
|
||||
|
||||
```ts
|
||||
type DataType = {
|
||||
kb_id?: string;
|
||||
id?: string;
|
||||
q: string;
|
||||
a: string;
|
||||
source?: string;
|
||||
};
|
||||
// 如果是外部引入的内容,尽量不要携带 kb_id 和 id
|
||||
const quoteList: DataType[] = [
|
||||
{ kb_id: '11', id: '222', q: '你还', a: '哈哈', source: '' },
|
||||
{ kb_id: '11', id: '333', q: '你还', a: '哈哈', source: '' },
|
||||
{ kb_id: '11', id: '444', q: '你还', a: '哈哈', source: '' }
|
||||
];
|
||||
```
|
||||
|
||||
## 完整上下文组成
|
||||
|
||||
最终发送给 LLM 大模型的数据是一个数组,内容和顺序如下:
|
||||
|
||||
```
|
||||
[
|
||||
系统提示词
|
||||
引用内容
|
||||
聊天记录
|
||||
限定词
|
||||
问题
|
||||
]
|
||||
|
||||
```
|
@@ -0,0 +1,9 @@
|
||||
# 用户引导
|
||||
|
||||
- 仅可添加 1 个
|
||||
- 无外部输入
|
||||
- 不参与实际调度
|
||||
|
||||
如图,可以在用户提问前给予一定引导。并可以设置引导问题。
|
||||
|
||||

|
@@ -0,0 +1,10 @@
|
||||
# 历史记录
|
||||
|
||||
- 可重复添加(复杂编排时候防止线太乱,可以更美观)
|
||||
- 无外部输入
|
||||
- 流程入口
|
||||
- 自动执行
|
||||
|
||||
每次对话时,会从数据库取最多 n 条聊天记录作为上下文。注意,不是指本轮对话最多 n 条上下文,本轮对话还包括:提示词、限定词、引用内容和问题。
|
||||
|
||||

|
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 182 KiB |
After Width: | Height: | Size: 228 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 285 KiB |
After Width: | Height: | Size: 108 KiB |
@@ -0,0 +1,16 @@
|
||||
# 指定回复
|
||||
|
||||
- 可重复添加(复杂编排时候防止线太乱,可以更美观)
|
||||
- 可手动输入
|
||||
- 可外部输入
|
||||
- 会输出结果给客户端
|
||||
|
||||
制定回复模块通常用户特殊状态回复,当然你也可以像图 2 一样,实现一些比较骚的操作~ 触发逻辑非常简单,一种是写好回复内容,通过触发器触发;一种是不写回复内容,直接由外部输入触发,并回复输入的内容。
|
||||
|
||||

|
||||
|
||||
图 1
|
||||
|
||||

|
||||
|
||||
图 2
|
@@ -0,0 +1,23 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# 触发器介绍
|
||||
|
||||
细心的同学可以发现,在每个功能模块里都会有一个叫【触发器】的外部输入,并且是 any 类型。
|
||||
|
||||
它的**核心作用**就是控制模块的执行时机,以下图 2 个知识库搜索中的【AI 对话】模块为例子:
|
||||
|
||||
| 图 1 | 图 2 |
|
||||
| ---------------------------- | ---------------------------- |
|
||||
|  |  |
|
||||
|
||||
【知识库搜索】模块中,由于**引用内容**始终会有输出,会导致【AI 对话】模块的**引用内容**输入无论有没有搜到内容都会被赋值。如果此时不连接触发器(图 2),在搜索结束后必定会执行【AI 对话】模块。
|
||||
|
||||
有时候,你可能希望空搜索时候进行额外处理,例如:回复固定内容、调用其他提示词的 GPT、发送一个 HTTP 请求…… 此时就需要用到触发器,需要将 **搜索结果不为空** 和 **触发器** 连接起来。
|
||||
|
||||
当搜索结果为空时,【知识库搜索】模块不会输出 **搜索结果不为空** 的结果,因此 【AI 对话】 模块的触发器始终为空,便不会执行。
|
||||
|
||||
总之,记住模块执行的逻辑就可以灵活的使用触发器:
|
||||
|
||||
**外部输入字段(有连接的才有效)全部被赋值时候执行**
|
@@ -0,0 +1,8 @@
|
||||
# 用户问题
|
||||
|
||||
- 可重复添加(复杂编排时候防止线太乱,可以更美观)
|
||||
- 无外部输入
|
||||
- 流程入口
|
||||
- 自动执行
|
||||
|
||||

|
@@ -0,0 +1,22 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# 全局变量
|
||||
|
||||
- 仅可添加 1 个
|
||||
- 手动配置
|
||||
- 对其他模块有影响
|
||||
- 可作为用户引导
|
||||
|
||||
可以在对话前设置一些问题,让用户输入或选择,并将用户输入/选择的结果注入到其他模块中。目前仅会注入到 string 类型的数据里(对应蓝色的圆圈)。
|
||||
|
||||
如下图,定义了两个变量:目标语言和下拉框测试(忽略)
|
||||
|
||||
用户在对话前会被要求先填写目标语言,配合用户引导,我们就构建了一个简单的翻译机器人。**目标语言**的 key:language 被写入到【AI 对话】模块的限定词里。
|
||||
|
||||

|
||||
|
||||
通过完整对话记录我们可以看到,实际的限定词从:“将我的问题直接翻译成{{language}}” 变成了 “将我的问题直接翻译成英语”,因为 {{language}} 被变量替换了。
|
||||
|
||||

|