flow moduoles (#161)

* flow intro

* docs:flow modules

* docs:flow modules
This commit is contained in:
Archer
2023-08-09 18:07:58 +08:00
committed by GitHub
parent b6f9f77ed4
commit 657d0ad374
52 changed files with 485 additions and 56 deletions

View File

@@ -0,0 +1,64 @@
# AI 对话
- 可重复添加(复杂编排时候防止线太乱,可以更美观)
- 有外部输入
- 有静态配置
- 触发执行
- 核心模块
![](./imgs/aichat.png)
## 参数说明
### 对话模型
可以通过 [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 大模型的数据是一个数组,内容和顺序如下:
```
[
系统提示词
引用内容
聊天记录
限定词
问题
]
```

View File

@@ -0,0 +1,9 @@
# 用户引导
- 仅可添加 1 个
- 无外部输入
- 不参与实际调度
如图,可以在用户提问前给予一定引导。并可以设置引导问题。
![](./imgs/guide.png)

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

View File

@@ -0,0 +1,16 @@
# 指定回复
- 可重复添加(复杂编排时候防止线太乱,可以更美观)
- 可手动输入
- 可外部输入
- 会输出结果给客户端
制定回复模块通常用户特殊状态回复,当然你也可以像图 2 一样,实现一些比较骚的操作~ 触发逻辑非常简单,一种是写好回复内容,通过触发器触发;一种是不写回复内容,直接由外部输入触发,并回复输入的内容。
![](./imgs/specialreply.png)
图 1
![](./imgs/specialreply2.png)
图 2

View File

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

View File

@@ -0,0 +1,8 @@
# 用户问题
- 可重复添加(复杂编排时候防止线太乱,可以更美观)
- 无外部输入
- 流程入口
- 自动执行
![](./imgs/chatinput.png)

View File

@@ -0,0 +1,22 @@
---
sidebar_position: 2
---
# 全局变量
- 仅可添加 1 个
- 手动配置
- 对其他模块有影响
- 可作为用户引导
可以在对话前设置一些问题,让用户输入或选择,并将用户输入/选择的结果注入到其他模块中。目前仅会注入到 string 类型的数据里(对应蓝色的圆圈)。
如下图,定义了两个变量:目标语言和下拉框测试(忽略)
用户在对话前会被要求先填写目标语言,配合用户引导,我们就构建了一个简单的翻译机器人。**目标语言**的 keylanguage 被写入到【AI 对话】模块的限定词里。
![](./imgs/variable.png)
通过完整对话记录我们可以看到,实际的限定词从:“将我的问题直接翻译成{{language}}” 变成了 “将我的问题直接翻译成英语”,因为 {{language}} 被变量替换了。
![](./imgs/variable2.png)