mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-23 05:12:39 +00:00
docs: update the framework of doc site (#207)
Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
This commit is contained in:
9
docSite/content/docs/_index.md
Normal file
9
docSite/content/docs/_index.md
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
weight: 10
|
||||
title: "文档"
|
||||
description: "FastGPT 官方文档"
|
||||
icon: menu_book
|
||||
lead: ""
|
||||
draft: false
|
||||
images: []
|
||||
---
|
84
docSite/content/docs/development.md
Normal file
84
docSite/content/docs/development.md
Normal file
@@ -0,0 +1,84 @@
|
||||
---
|
||||
weight: 500
|
||||
title: "开发指南"
|
||||
description: "对 FastGPT 进行开发调试"
|
||||
icon: "developer_guide"
|
||||
draft: false
|
||||
images: []
|
||||
---
|
||||
|
||||
本文档介绍了如何设置开发环境以构建和测试 [FastGPT](https://fastgpt.run)。
|
||||
|
||||
### 安装依赖项
|
||||
|
||||
您需要在计算机上安装和配置以下依赖项才能构建 [FastGPT](https://fastgpt.run):
|
||||
|
||||
- [Git](http://git-scm.com/)
|
||||
- [Docker](https://www.docker.com/)
|
||||
- [Docker Compose](https://docs.docker.com/compose/install/)
|
||||
- [Node.js v18.x (LTS)](http://nodejs.org)
|
||||
- [npm](https://www.npmjs.com/) 版本 8.x.x 或 [Yarn](https://yarnpkg.com/)
|
||||
|
||||
## 本地开发
|
||||
|
||||
要设置一个可工作的开发环境,只需 Fork 项目的 Git 存储库,并部署一个数据库,然后开始进行开发测试。
|
||||
|
||||
### Fork存储库
|
||||
|
||||
您需要 Fork [存储库](https://github.com/labring/FastGPT)。
|
||||
|
||||
### 克隆存储库
|
||||
|
||||
克隆您在 GitHub 上 Fork 的存储库:
|
||||
|
||||
```
|
||||
git clone git@github.com:<github_username>/FastGPT.git
|
||||
```
|
||||
|
||||
client 目录下为 FastGPT 核心代码。NextJS 框架前后端放在一起,API 服务位于 `src/pages/api` 目录内。
|
||||
|
||||
### 安装数据库
|
||||
|
||||
第一次开发,需要先部署数据库,建议本地开发可以随便找一台 2C2G 的轻量小数据库实践。数据库部署教程:[Docker 快速部署](/docs/installation/docker/)
|
||||
|
||||
### 初始配置
|
||||
|
||||
**1. 环境变量**
|
||||
|
||||
复制.env.template 文件,生成一个.env.local 环境变量文件夹,修改.env.local 里内容才是有效的变量。变量说明见 .env.template
|
||||
|
||||
**2. config 配置文件**
|
||||
|
||||
复制 data/config.json 文件,生成一个 data/config.local.json 配置文件。
|
||||
|
||||
这个文件大部分时候不需要修改。只需要关注 SystemParams 里的参数:
|
||||
|
||||
+ `vectorMaxProcess`: 向量生成最大进程,根据数据库和 key 的并发数来决定,通常单个 120 号,2c4g 服务器设置10~15。
|
||||
+ `qaMaxProcess`: QA 生成最大进程
|
||||
+ `pgIvfflatProbe`: PostgreSQL vector 搜索探针,没有添加 vector 索引时可忽略。
|
||||
|
||||
### 运行
|
||||
|
||||
```bash
|
||||
cd client
|
||||
pnpm i
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
### 镜像打包
|
||||
|
||||
```bash
|
||||
docker build -t dockername/fastgpt .
|
||||
```
|
||||
|
||||
## 创建拉取请求
|
||||
|
||||
在进行更改后,打开一个拉取请求(PR)。提交拉取请求后,FastGPT 团队/社区的其他人将与您一起审查它。
|
||||
|
||||
如果遇到问题,比如合并冲突或不知道如何打开拉取请求,请查看 GitHub 的[拉取请求教程](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests),了解如何解决合并冲突和其他问题。一旦您的 PR 被合并,您将自豪地被列为[贡献者表](https://github.com/labring/FastGPT/graphs/contributors)中的一员。
|
||||
|
||||
## 加入社区
|
||||
|
||||
遇到困难了吗?有任何问题吗? 加入微信群与开发者和用户保持沟通。
|
||||
|
||||
<center><image width="400px" src="/wechat-fastgpt.webp" /></center>
|
8
docSite/content/docs/installation/_index.md
Normal file
8
docSite/content/docs/installation/_index.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
weight: 700
|
||||
title: "私有化部署"
|
||||
description: "FastGPT 私有化部署文档"
|
||||
icon: menu_book
|
||||
draft: false
|
||||
images: []
|
||||
---
|
258
docSite/content/docs/installation/docker.md
Normal file
258
docSite/content/docs/installation/docker.md
Normal file
@@ -0,0 +1,258 @@
|
||||
---
|
||||
title: "Docker Compose 快速部署"
|
||||
description: "使用 Docker Compose 快速部署 FastGPT"
|
||||
icon: ""
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 720
|
||||
---
|
||||
|
||||
## 准备条件
|
||||
|
||||
### 1. 准备好代理环境(国外服务器可忽略)
|
||||
|
||||
确保可以访问 OpenAI,具体方案可以参考:[Nginx 中转](/docs/installation/proxy/nginx/)
|
||||
|
||||
### 2. 多模型支持
|
||||
|
||||
推荐使用 one-api 项目来管理模型池,兼容 OpenAI 、Azure 和国内主流模型等。
|
||||
|
||||
具体部署方法可参考该项目的 [README](https://github.com/songquanpeng/one-api),也可以直接通过以下按钮一键部署:
|
||||
|
||||
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Done-api)
|
||||
|
||||
## 安装 Docker 和 docker-compose
|
||||
|
||||
{{< tabs tabTotal="3" >}}
|
||||
{{< tab tabName="Linux" >}}
|
||||
{{< markdownify >}}
|
||||
```bash
|
||||
# 安装 Docker
|
||||
curl -sSL https://get.daocloud.io/docker | sh
|
||||
systemctl enable --now docker
|
||||
# 安装 docker-compose
|
||||
curl -L https://github.com/docker/compose/releases/download/2.20.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
|
||||
chmod +x /usr/local/bin/docker-compose
|
||||
# 验证安装
|
||||
docker -v
|
||||
docker-compose -v
|
||||
```
|
||||
{{< /markdownify >}}
|
||||
{{< /tab >}}
|
||||
{{< tab tabName="MacOS" >}}
|
||||
{{< markdownify >}}
|
||||
推荐直接使用 [Orbstack](https://orbstack.dev/)。可直接通过 Homebrew 来安装:
|
||||
|
||||
```bash
|
||||
brew install orbstack
|
||||
```
|
||||
|
||||
或者直接[下载安装包](https://orbstack.dev/download)进行安装。
|
||||
{{< /markdownify >}}
|
||||
{{< /tab >}}
|
||||
{{< tab tabName="Windows" >}}
|
||||
{{< markdownify >}}
|
||||
我们建议将源代码和其他数据绑定到 Linux 容器中时,将其存储在 Linux 文件系统中,而不是 Windows 文件系统中。
|
||||
|
||||
可以选择直接[使用 WSL 2 后端在 Windows 中安装 Docker Desktop](https://docs.docker.com/desktop/wsl/)。
|
||||
|
||||
也可以直接[在 WSL 2 中安装命令行版本的 Docker](https://nickjanetakis.com/blog/install-docker-in-wsl-2-without-docker-desktop)。
|
||||
{{< /markdownify >}}
|
||||
{{< /tab >}}
|
||||
{{< /tabs >}}
|
||||
|
||||
## 创建 docker-compose.yml 文件
|
||||
|
||||
先创建一个目录(例如 fastgpt)并进入该目录:
|
||||
|
||||
```bash
|
||||
mkdir fastgpt
|
||||
cd fastgpt
|
||||
```
|
||||
|
||||
创建一个 docker-compose.yml 文件,粘贴下面的内容:
|
||||
|
||||
```yaml
|
||||
# 非 host 版本, 不使用本机代理
|
||||
version: '3.3'
|
||||
services:
|
||||
pg:
|
||||
image: ankane/pgvector:v0.4.2
|
||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.4.2 # 阿里云
|
||||
container_name: pg
|
||||
restart: always
|
||||
ports: # 生产环境建议不要暴露
|
||||
- 5432:5432
|
||||
networks:
|
||||
- fastgpt
|
||||
environment:
|
||||
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
|
||||
- POSTGRES_USER=username
|
||||
- POSTGRES_PASSWORD=password
|
||||
- POSTGRES_DB=postgres
|
||||
volumes:
|
||||
- ./pg/data:/var/lib/postgresql/data
|
||||
mongo:
|
||||
image: mongo:5.0.18
|
||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
|
||||
container_name: mongo
|
||||
restart: always
|
||||
ports: # 生产环境建议不要暴露
|
||||
- 27017:27017
|
||||
networks:
|
||||
- fastgpt
|
||||
environment:
|
||||
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
|
||||
- MONGO_INITDB_ROOT_USERNAME=username
|
||||
- MONGO_INITDB_ROOT_PASSWORD=password
|
||||
volumes:
|
||||
- ./mongo/data:/data/db
|
||||
fastgpt:
|
||||
container_name: fastgpt
|
||||
image: ghcr.io/labring/fastgpt:latest # git
|
||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:latest # 阿里云
|
||||
ports:
|
||||
- 3000:3000
|
||||
networks:
|
||||
- fastgpt
|
||||
depends_on:
|
||||
- mongo
|
||||
- pg
|
||||
restart: always
|
||||
environment:
|
||||
# root 密码,用户名为: root
|
||||
- DEFAULT_ROOT_PSW=1234
|
||||
# 中转地址,如果是用官方号,不需要管
|
||||
- OPENAI_BASE_URL=https://api.openai.com/v1
|
||||
- CHAT_API_KEY=sk-xxxx
|
||||
- DB_MAX_LINK=5 # database max link
|
||||
- TOKEN_KEY=any
|
||||
- ROOT_KEY=root_key
|
||||
# mongo 配置,不需要改
|
||||
- MONGODB_URI=mongodb://username:password@mongo:27017/?authSource=admin
|
||||
- MONGODB_NAME=fastgpt
|
||||
# pg配置
|
||||
- PG_HOST=pg
|
||||
- PG_PORT=5432
|
||||
- PG_USER=username
|
||||
- PG_PASSWORD=password
|
||||
- PG_DB_NAME=postgres
|
||||
networks:
|
||||
fastgpt:
|
||||
```
|
||||
|
||||
> 只需要改 fastgpt 容器的 3 个参数即可启动。
|
||||
|
||||
## 启动容器
|
||||
|
||||
```bash
|
||||
# 在 docker-compose.yml 同级目录下执行
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## 访问 FastGPT
|
||||
|
||||
目前可以通过 `ip:3000`` 直接访问(注意防火墙)。登录用户名为 `root`,密码为刚刚环境变量里设置的 `DEFAULT_ROOT_PSW`。
|
||||
|
||||
如果需要域名访问,请自行安装并配置 Nginx。
|
||||
|
||||
## QA
|
||||
|
||||
### 如何更新?
|
||||
|
||||
执行 `docker-compose up -d` 会自动拉取最新镜像,一般情况下不需要执行额外操作。
|
||||
|
||||
### 如何自定义配置文件?
|
||||
|
||||
需要在 `docker-compose.yml` 同级目录创建一个 `config.json` 文件,内容如下:
|
||||
|
||||
```json
|
||||
{
|
||||
"FeConfig": {
|
||||
"show_emptyChat": true,
|
||||
"show_register": false,
|
||||
"show_appStore": false,
|
||||
"show_userDetail": false,
|
||||
"show_git": true,
|
||||
"systemTitle": "FastGPT",
|
||||
"authorText": "Made by FastGPT Team.",
|
||||
"gitLoginKey": "",
|
||||
"scripts": []
|
||||
},
|
||||
"SystemParams": {
|
||||
"gitLoginSecret": "",
|
||||
"vectorMaxProcess": 15,
|
||||
"qaMaxProcess": 15,
|
||||
"pgIvfflatProbe": 20
|
||||
},
|
||||
"plugins": {},
|
||||
"ChatModels": [
|
||||
{
|
||||
"model": "gpt-3.5-turbo",
|
||||
"name": "GPT35-4k",
|
||||
"contextMaxToken": 4000,
|
||||
"quoteMaxToken": 2000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 0,
|
||||
"defaultSystem": ""
|
||||
},
|
||||
{
|
||||
"model": "gpt-3.5-turbo-16k",
|
||||
"name": "GPT35-16k",
|
||||
"contextMaxToken": 16000,
|
||||
"quoteMaxToken": 8000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 0,
|
||||
"defaultSystem": ""
|
||||
},
|
||||
{
|
||||
"model": "gpt-4",
|
||||
"name": "GPT4-8k",
|
||||
"contextMaxToken": 8000,
|
||||
"quoteMaxToken": 4000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 0,
|
||||
"defaultSystem": ""
|
||||
}
|
||||
],
|
||||
"QAModels": [
|
||||
{
|
||||
"model": "gpt-3.5-turbo-16k",
|
||||
"name": "GPT35-16k",
|
||||
"maxToken": 16000,
|
||||
"price": 0
|
||||
}
|
||||
],
|
||||
"VectorModels": [
|
||||
{
|
||||
"model": "text-embedding-ada-002",
|
||||
"name": "Embedding-2",
|
||||
"price": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
然后修改 `docker-compose.yml` 中的 `fastgpt` 容器内容,增加挂载选项即可:
|
||||
|
||||
```yaml
|
||||
fastgpt:
|
||||
container_name: fastgpt
|
||||
image: ghcr.io/labring/fastgpt:latest # github
|
||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:latest # 阿里云
|
||||
ports:
|
||||
- 3000:3000
|
||||
networks:
|
||||
- fastgpt
|
||||
depends_on:
|
||||
- mongo
|
||||
- pg
|
||||
restart: always
|
||||
environment:
|
||||
# root 密码,用户名为: root
|
||||
- DEFAULT_ROOT_PSW=1234
|
||||
volumes:
|
||||
- ./config.json:/app/data/config.json
|
||||
```
|
||||
|
||||
> 参考[配置详解](/docs/installation/reference/configuration/)
|
25
docSite/content/docs/installation/one-api.md
Normal file
25
docSite/content/docs/installation/one-api.md
Normal file
@@ -0,0 +1,25 @@
|
||||
---
|
||||
title: "部署 one-api,实现多模型支持"
|
||||
description: "通过接入 one-api 来实现对各种大模型的支持"
|
||||
icon: "Api"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 730
|
||||
---
|
||||
|
||||
[one-api](https://github.com/songquanpeng/one-api) 是一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。
|
||||
|
||||
FastGPT 可以通过接入 one-api 来实现对各种大模型的支持。部署方法也很简单,直接点击以下按钮即可一键部署 👇
|
||||
|
||||
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Done-api)
|
||||
|
||||
部署完后会跳转「应用管理」,数据库在另一个应用「数据库」中。需要等待 1~3 分钟数据库运行后才能访问成功。
|
||||
|
||||
配置好 one-api 的模型后,可以直接修改 FastGPT 的环境变量:
|
||||
|
||||
```bash
|
||||
# 下面的地址是 Sealos 提供的,务必写上 v1
|
||||
OPENAI_BASE_URL=https://xxxx.cloud.sealos.io/v1
|
||||
# 下面的 key 由 one-api 提供
|
||||
CHAT_API_KEY=sk-xxxxxx
|
||||
```
|
8
docSite/content/docs/installation/proxy/_index.md
Normal file
8
docSite/content/docs/installation/proxy/_index.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
weight: 740
|
||||
title: "代理方案"
|
||||
description: "使用代理访问 OpenAI"
|
||||
icon: public
|
||||
draft: false
|
||||
images: []
|
||||
---
|
54
docSite/content/docs/installation/proxy/cloudflare.md
Normal file
54
docSite/content/docs/installation/proxy/cloudflare.md
Normal file
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: "Cloudflare Worker 中转"
|
||||
description: "使用 Cloudflare Worker 实现中转"
|
||||
icon: "foggy"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 742
|
||||
---
|
||||
|
||||
[参考 "不做了睡觉" 的教程](https://gravel-twister-d32.notion.site/FastGPT-API-ba7bb261d5fd4fd9bbb2f0607dacdc9e)
|
||||
|
||||
**workers 配置文件**
|
||||
|
||||
```js
|
||||
const TELEGRAPH_URL = 'https://api.openai.com';
|
||||
|
||||
addEventListener('fetch', (event) => {
|
||||
event.respondWith(handleRequest(event.request));
|
||||
});
|
||||
|
||||
async function handleRequest(request) {
|
||||
// 安全校验
|
||||
if (request.headers.get('auth') !== 'auth_code') {
|
||||
return new Response('UnAuthorization', { status: 403 });
|
||||
}
|
||||
|
||||
const url = new URL(request.url);
|
||||
url.host = TELEGRAPH_URL.replace(/^https?:\/\//, '');
|
||||
|
||||
const modifiedRequest = new Request(url.toString(), {
|
||||
headers: request.headers,
|
||||
method: request.method,
|
||||
body: request.body,
|
||||
redirect: 'follow'
|
||||
});
|
||||
|
||||
const response = await fetch(modifiedRequest);
|
||||
const modifiedResponse = new Response(response.body, response);
|
||||
|
||||
// 添加允许跨域访问的响应头
|
||||
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
|
||||
|
||||
return modifiedResponse;
|
||||
}
|
||||
```
|
||||
|
||||
**修改 FastGPT 的环境变量**
|
||||
|
||||
> 务必别忘了填 v1!
|
||||
|
||||
```bash
|
||||
OPENAI_BASE_URL=https://xxxxxx/v1
|
||||
OPENAI_BASE_URL_AUTH=auth_code
|
||||
```
|
47
docSite/content/docs/installation/proxy/http_proxy.md
Normal file
47
docSite/content/docs/installation/proxy/http_proxy.md
Normal file
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: "HTTP 代理中转"
|
||||
description: "使用 HTTP 代理实现中转"
|
||||
icon: "http"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 743
|
||||
---
|
||||
|
||||
如果你有代理工具(例如 [Clash](https://github.com/Dreamacro/clash) 或者 [sing-box](https://github.com/SagerNet/sing-box)),也可以使用 HTTP 代理来访问 OpenAI。只需要添加以下两个环境变量即可:
|
||||
|
||||
```bash
|
||||
AXIOS_PROXY_HOST=
|
||||
AXIOS_PROXY_PORT=
|
||||
```
|
||||
|
||||
以 Clash 为例,建议指定 `api.openai.com` 走代理,其他请求都直连。示例配置如下:
|
||||
|
||||
```yaml
|
||||
mixed-port: 7890
|
||||
allow-lan: false
|
||||
bind-address: '*'
|
||||
mode: rule
|
||||
log-level: warning
|
||||
dns:
|
||||
enable: true
|
||||
ipv6: false
|
||||
nameserver:
|
||||
- 8.8.8.8
|
||||
- 8.8.4.4
|
||||
cache-size: 400
|
||||
proxies:
|
||||
-
|
||||
proxy-groups:
|
||||
- { name: '♻️ 自动选择', type: url-test, proxies: [香港V01×1.5], url: 'https://api.openai.com', interval: 3600}
|
||||
rules:
|
||||
- 'DOMAIN-SUFFIX,api.openai.com,♻️ 自动选择'
|
||||
- 'MATCH,DIRECT'
|
||||
```
|
||||
|
||||
然后给 FastGPT 添加两个环境变量:
|
||||
|
||||
```bash
|
||||
AXIOS_PROXY_HOST=127.0.0.1
|
||||
AXIOS_PROXY_PORT=7890
|
||||
```
|
||||
|
105
docSite/content/docs/installation/proxy/nginx.md
Normal file
105
docSite/content/docs/installation/proxy/nginx.md
Normal file
@@ -0,0 +1,105 @@
|
||||
---
|
||||
title: "Nginx 中转"
|
||||
description: "使用 Sealos 部署 Nginx 实现中转"
|
||||
icon: "cloud_sync"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 741
|
||||
---
|
||||
|
||||
## 登录 Sealos
|
||||
|
||||
[Sealos](https://cloud.sealos.io/)
|
||||
|
||||
## 创建应用
|
||||
|
||||
打开 「应用管理」,点击「新建应用」:
|
||||
|
||||

|
||||

|
||||
|
||||
### 填写基本配置
|
||||
|
||||
务必开启外网访问,复制外网访问提供的地址。
|
||||
|
||||

|
||||
|
||||
### 添加配置文件
|
||||
|
||||
1. 复制下面这段配置文件,注意 `server_name` 后面的内容替换成第二步的外网访问地址。
|
||||
|
||||
```nginx
|
||||
user nginx;
|
||||
worker_processes auto;
|
||||
worker_rlimit_nofile 51200;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
resolver 8.8.8.8;
|
||||
proxy_ssl_server_name on;
|
||||
|
||||
access_log off;
|
||||
server_names_hash_bucket_size 512;
|
||||
client_header_buffer_size 64k;
|
||||
large_client_header_buffers 4 64k;
|
||||
client_max_body_size 50M;
|
||||
|
||||
proxy_connect_timeout 240s;
|
||||
proxy_read_timeout 240s;
|
||||
proxy_buffer_size 128k;
|
||||
proxy_buffers 4 256k;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name tgohwtdlrmer.cloud.sealos.io; # 这个地方替换成 Sealos 提供的外网地址
|
||||
|
||||
location ~ /openai/(.*) {
|
||||
proxy_pass https://api.openai.com/$1$is_args$args;
|
||||
proxy_set_header Host api.openai.com;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
# 如果响应是流式的
|
||||
proxy_set_header Connection '';
|
||||
proxy_http_version 1.1;
|
||||
chunked_transfer_encoding off;
|
||||
proxy_buffering off;
|
||||
proxy_cache off;
|
||||
# 如果响应是一般的
|
||||
proxy_buffer_size 128k;
|
||||
proxy_buffers 4 256k;
|
||||
proxy_busy_buffers_size 256k;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
2. 点开高级配置。
|
||||
3. 点击「新增配置文件」。
|
||||
4. 文件名写: `/etc/nginx/nginx.conf`。
|
||||
5. 文件值为刚刚复制的那段代码。
|
||||
6. 点击确认。
|
||||
|
||||

|
||||
|
||||
### 部署应用
|
||||
|
||||
填写完毕后,点击右上角的「部署」,即可完成部署。
|
||||
|
||||
## 修改 FastGPT 环境变量
|
||||
|
||||
1. 进入刚刚部署应用的详情,复制外网地址
|
||||
|
||||
> 注意:这是个 API 地址,点击打开是无效的。如需验证,可以访问: `*.cloud.sealos.io/openai/api`,如果提示 `Invalid URL (GET /api)` 则代表成功。
|
||||
|
||||

|
||||
|
||||
2. 修改环境变量(是 FastGPT 的环境变量,不是 Sealos 的):
|
||||
|
||||
```bash
|
||||
OPENAI_BASE_URL=https://tgohwtdlrmer.cloud.sealos.io/openai/v1
|
||||
```
|
||||
|
||||
**Done!**
|
8
docSite/content/docs/installation/reference/_index.md
Normal file
8
docSite/content/docs/installation/reference/_index.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
weight: 750
|
||||
title: "配置说明"
|
||||
description: "FastGPT 配置指南"
|
||||
icon: quick_reference_all
|
||||
draft: false
|
||||
images: []
|
||||
---
|
66
docSite/content/docs/installation/reference/chatglm2.md
Normal file
66
docSite/content/docs/installation/reference/chatglm2.md
Normal file
@@ -0,0 +1,66 @@
|
||||
---
|
||||
title: "接入 ChatGLM2-6B"
|
||||
description: " 将 FastGPT 接入私有化模型 ChatGLM2-6B"
|
||||
icon: "model_training"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 753
|
||||
---
|
||||
|
||||
## 前言
|
||||
|
||||
FastGPT 允许你使用自己的 OpenAI API KEY 来快速调用 OpenAI 接口,目前集成了 GPT-3.5, GPT-4 和 embedding,可构建自己的知识库。但考虑到数据安全的问题,我们并不能将所有的数据都交付给云端大模型。
|
||||
|
||||
那么如何在 FastGPT 上接入私有化模型呢?本文就以清华的 ChatGLM2 为例,为各位讲解如何在 FastGPT 中接入私有化模型。
|
||||
|
||||
## ChatGLM2-6B 简介
|
||||
|
||||
ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,具体介绍可参阅 [ChatGLM2-6B 项目主页](https://github.com/THUDM/ChatGLM2-6B)。
|
||||
|
||||
{{% alert context="warning" %}}
|
||||
注意,ChatGLM2-6B 权重对学术研究完全开放,在获得官方的书面许可后,亦允许商业使用。本教程只是介绍了一种用法,无权给予任何授权!
|
||||
{{% /alert %}}
|
||||
|
||||
## 推荐配置
|
||||
|
||||
依据官方数据,同样是生成 8192 长度,量化等级为 FP16 要占用 12.8GB 显存、int8 为 8.1GB 显存、int4 为 5.1GB 显存,量化后会稍微影响性能,但不多。
|
||||
|
||||
因此推荐配置如下:
|
||||
|
||||
{{< table "table-hover table-striped" >}}
|
||||
| 类型 | 内存 | 显存 | 硬盘空间 | 启动命令 |
|
||||
|------|---------|---------|----------|--------------------------|
|
||||
| fp16 | >=16GB | >=16GB | >=25GB | python openai_api.py 16 |
|
||||
| int8 | >=16GB | >=9GB | >=25GB | python openai_api.py 8 |
|
||||
| int4 | >=16GB | >=6GB | >=25GB | python openai_api.py 4 |
|
||||
{{< /table >}}
|
||||
|
||||
## 环境配置
|
||||
|
||||
+ Python 3.8.10
|
||||
+ CUDA 11.8
|
||||
+ 科学上网环境
|
||||
|
||||
## 部署步骤
|
||||
|
||||
1. 根据上面的环境配置配置好环境,具体教程自行 GPT;
|
||||
2. 在命令行输入命令 `pip install -r requirments.txt`;
|
||||
3. 打开你需要启动的 py 文件,在代码的第 76 行配置 token,这里的 token 只是加一层验证,防止接口被人盗用;
|
||||
4. 执行命令 `python openai_api.py 16`。这里的数字根据上面的配置进行选择。
|
||||
|
||||
然后等待模型下载,直到模型加载完毕为止。如果出现报错先问 GPT。
|
||||
|
||||
启动成功后应该会显示如下地址:
|
||||
|
||||

|
||||
|
||||
> 这里的 `http://0.0.0.0:6006` 就是连接地址。
|
||||
|
||||
然后现在回到 .env.local 文件,依照以下方式配置地址:
|
||||
|
||||
```bash
|
||||
OPENAI_BASE_URL=http://127.0.0.1:6006/v1
|
||||
OPENAIKEY=sk-aaabbbcccdddeeefffggghhhiiijjjkkk # 这里是你在代码中配置的 token,这里的 OPENAIKEY 可以任意填写
|
||||
```
|
||||
|
||||
这样就成功接入 ChatGLM2-6B 了。
|
117
docSite/content/docs/installation/reference/configuration.md
Normal file
117
docSite/content/docs/installation/reference/configuration.md
Normal file
@@ -0,0 +1,117 @@
|
||||
---
|
||||
title: "配置详解"
|
||||
description: "FastGPT 配置参数介绍"
|
||||
icon: "settings"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 751
|
||||
---
|
||||
|
||||
由于环境变量不利于配置复杂的内容,新版 FastGPT 采用了 ConfigMap 的形式挂载配置文件,你可以在 `client/data/config.json` 看到默认的配置文件。可以参考 [docker-compose 快速部署](/docs/installation/docker/) 来挂载配置文件。
|
||||
|
||||
开发环境下,你需要将示例配置文件 `config.json` 复制成 `config.local.json` 文件才会生效。
|
||||
|
||||
注意: 为了方便介绍,文档介绍里会把注释写到 json 文件,实际运行时候 json 文件不能包含注释。
|
||||
|
||||
这个配置文件中包含了前端页面定制、系统级参数、AI 对话的模型等……
|
||||
|
||||
{{% alert context="warning" %}}
|
||||
注意:下面的配置介绍仅是局部介绍,你需要完整挂载整个 `config.json`,不能仅挂载一部分。你可以直接在默认的 config.json 基础上根据下面的介绍进行修改。
|
||||
{{% /alert %}}
|
||||
|
||||
## 基础字段粗略说明
|
||||
|
||||
这里介绍一些基础的配置字段:
|
||||
|
||||
```json
|
||||
// 这个配置会控制前端的一些样式
|
||||
"FeConfig": {
|
||||
"show_emptyChat": true, // 对话页面,空内容时,是否展示介绍页
|
||||
"show_register": false, // 是否展示注册按键(包括忘记密码,注册账号和三方登录)
|
||||
"show_appStore": false, // 是否展示应用市场(不过目前权限还没做好,放开也没用)
|
||||
"show_userDetail": false, // 是否展示用户详情(账号余额、OpenAI 绑定)
|
||||
"show_git": true, // 是否展示 Git
|
||||
"systemTitle": "FastGPT", // 系统的 title
|
||||
"authorText": "Made by FastGPT Team.", // 签名
|
||||
"gitLoginKey": "" // Git 登录凭证
|
||||
},
|
||||
...
|
||||
...
|
||||
// 这个配置文件是系统级参数
|
||||
"SystemParams": {
|
||||
"gitLoginSecret": "", // Git 登录凭证
|
||||
"vectorMaxProcess": 15, // 向量生成最大进程,结合数据库性能和 key 来设置
|
||||
"qaMaxProcess": 15, // QA 生成最大进程,结合数据库性能和 key 来设置
|
||||
"pgIvfflatProbe": 20 // pg vector 搜索探针。没有设置索引前可忽略,通常 50w 组以上才需要设置。
|
||||
},
|
||||
...
|
||||
```
|
||||
|
||||
## 完整配置参数
|
||||
|
||||
```json
|
||||
{
|
||||
"FeConfig": {
|
||||
"show_emptyChat": true,
|
||||
"show_register": false,
|
||||
"show_appStore": false,
|
||||
"show_userDetail": false,
|
||||
"show_git": true,
|
||||
"systemTitle": "FastGPT",
|
||||
"authorText": "Made by FastGPT Team.",
|
||||
"gitLoginKey": "",
|
||||
"scripts": []
|
||||
},
|
||||
"SystemParams": {
|
||||
"gitLoginSecret": "",
|
||||
"vectorMaxProcess": 15,
|
||||
"qaMaxProcess": 15,
|
||||
"pgIvfflatProbe": 20
|
||||
},
|
||||
"plugins": {},
|
||||
"ChatModels": [
|
||||
{
|
||||
"model": "gpt-3.5-turbo",
|
||||
"name": "GPT35-4k",
|
||||
"contextMaxToken": 4000,
|
||||
"quoteMaxToken": 2000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 0,
|
||||
"defaultSystem": ""
|
||||
},
|
||||
{
|
||||
"model": "gpt-3.5-turbo-16k",
|
||||
"name": "GPT35-16k",
|
||||
"contextMaxToken": 16000,
|
||||
"quoteMaxToken": 8000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 0,
|
||||
"defaultSystem": ""
|
||||
},
|
||||
{
|
||||
"model": "gpt-4",
|
||||
"name": "GPT4-8k",
|
||||
"contextMaxToken": 8000,
|
||||
"quoteMaxToken": 4000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 0,
|
||||
"defaultSystem": ""
|
||||
}
|
||||
],
|
||||
"QAModels": [
|
||||
{
|
||||
"model": "gpt-3.5-turbo-16k",
|
||||
"name": "GPT35-16k",
|
||||
"maxToken": 16000,
|
||||
"price": 0
|
||||
}
|
||||
],
|
||||
"VectorModels": [
|
||||
{
|
||||
"model": "text-embedding-ada-002",
|
||||
"name": "Embedding-2",
|
||||
"price": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
74
docSite/content/docs/installation/reference/models.md
Normal file
74
docSite/content/docs/installation/reference/models.md
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
title: "多模型支持"
|
||||
description: "如何接入除了 GPT 以外的其他大模型"
|
||||
icon: "model_training"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 752
|
||||
---
|
||||
|
||||
默认情况下,FastGPT 只配置了 GPT 的 3 个模型,如果你需要接入其他模型,需要进行一些额外配置。
|
||||
|
||||
## 部署 one-api
|
||||
|
||||
首先你需要部署一个 [one-api](/docs/installation/one-api/),并添加对应的【渠道】
|
||||
|
||||

|
||||
|
||||
## 添加 FastGPT 配置
|
||||
|
||||
可以在 `/client/src/data/config.json` 里找到配置文件(本地开发需要复制成 config.local.json),配置文件中有一项是对话模型配置:
|
||||
|
||||
```json
|
||||
"ChatModels": [
|
||||
{
|
||||
"model": "gpt-3.5-turbo", // 这里的模型需要对应 OneAPI 的模型
|
||||
"name": "FastAI-4k", // 对外展示的名称
|
||||
"contextMaxToken": 4000, // 最大长下文 token,无论什么模型都按 GPT35 的计算。GPT 外的模型需要自行大致计算下这个值。可以调用官方接口去比对 Token 的倍率,然后在这里粗略计算。
|
||||
// 例如:文心一言的中英文 token 基本是 1:1,而 GPT 的中文 Token 是 2:1,如果文心一言官方最大 Token 是 4000,那么这里就可以填 8000,保险点就填 7000.
|
||||
"quoteMaxToken": 2000, // 引用知识库的最大 Token
|
||||
"maxTemperature": 1.2, // 最大温度
|
||||
"price": 1.5, // 1个token 价格 => 1.5 / 100000 * 1000 = 0.015元/1k token
|
||||
"defaultSystem": "" // 默认的系统提示词
|
||||
},
|
||||
{
|
||||
"model": "gpt-3.5-turbo-16k",
|
||||
"name": "FastAI-16k",
|
||||
"contextMaxToken": 16000,
|
||||
"quoteMaxToken": 8000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 3,
|
||||
"defaultSystem": ""
|
||||
},
|
||||
{
|
||||
"model": "gpt-4",
|
||||
"name": "FastAI-Plus",
|
||||
"contextMaxToken": 8000,
|
||||
"quoteMaxToken": 4000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 45,
|
||||
"defaultSystem": ""
|
||||
}
|
||||
],
|
||||
```
|
||||
|
||||
### 添加新模型
|
||||
|
||||
以添加文心一言为例:
|
||||
|
||||
```json
|
||||
"ChatModels": [
|
||||
...
|
||||
{
|
||||
"model": "ERNIE-Bot",
|
||||
"name": "文心一言",
|
||||
"contextMaxToken": 4000,
|
||||
"quoteMaxToken": 2000,
|
||||
"maxTemperature": 1,
|
||||
"price": 1.2
|
||||
}
|
||||
...
|
||||
]
|
||||
```
|
||||
|
||||
添加完后,重启应用即可在选择文心一言模型进行对话。
|
24
docSite/content/docs/installation/sealos.md
Normal file
24
docSite/content/docs/installation/sealos.md
Normal file
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: "Sealos 一键部署"
|
||||
description: "使用 Sealos 一键部署 FastGPT"
|
||||
icon: "cloud"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 710
|
||||
---
|
||||
|
||||
Sealos 的服务器在国外,不需要额外处理网络问题,无需服务器、无需魔法、无需域名,支持高并发 & 动态伸缩。点击以下按钮即可一键部署 👇
|
||||
|
||||
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt)
|
||||
|
||||
由于需要部署数据库,部署完后需要等待 2~4 分钟才能正常访问。默认用了最低配置,首次访问时会有些慢。
|
||||
|
||||

|
||||
|
||||
点击 Sealos 提供的外网地址即可打开 FastGPT 的可视化界面。
|
||||
|
||||

|
||||
|
||||
> 用户名:`root`
|
||||
>
|
||||
> 密码就是刚刚一键部署时设置的环境变量
|
66
docSite/content/docs/installation/upgrading/40.md
Normal file
66
docSite/content/docs/installation/upgrading/40.md
Normal file
@@ -0,0 +1,66 @@
|
||||
---
|
||||
title: "升级到 V4.0"
|
||||
description: "FastGPT 从旧版本升级到 V4.0 操作指南"
|
||||
icon: "upgrade"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 761
|
||||
---
|
||||
|
||||
如果您是**从旧版本升级到 V4**,由于新版 MongoDB 表变更比较大,需要按照本文档的说明执行一些初始化脚本。
|
||||
|
||||
## 重命名表名
|
||||
|
||||
需要连接上 MongoDB 数据库,执行两条命令:
|
||||
|
||||
```mongodb
|
||||
db.models.renameCollection("apps")
|
||||
db.sharechats.renameCollection("outlinks")
|
||||
```
|
||||
|
||||
{{% alert context="warning" %}}
|
||||
注意:从旧版更新到 V4, MongoDB 会自动创建空表,你需要先手动删除这两个空表,再执行上面的操作。
|
||||
{{% /alert %}}
|
||||
|
||||
## 初始化几个表中的字段
|
||||
|
||||
依次执行下面 3 条命令,时间比较长,不成功可以重复执行(会跳过已经初始化的数据),直到所有数据更新完成。
|
||||
|
||||
```mongodb
|
||||
db.chats.find({appId: {$exists: false}}).forEach(function(item){
|
||||
db.chats.updateOne(
|
||||
{
|
||||
_id: item._id,
|
||||
},
|
||||
{ "$set": {"appId":item.modelId}}
|
||||
)
|
||||
})
|
||||
|
||||
db.collections.find({appId: {$exists: false}}).forEach(function(item){
|
||||
db.collections.updateOne(
|
||||
{
|
||||
_id: item._id,
|
||||
},
|
||||
{ "$set": {"appId":item.modelId}}
|
||||
)
|
||||
})
|
||||
|
||||
db.outlinks.find({shareId: {$exists: false}}).forEach(function(item){
|
||||
db.outlinks.updateOne(
|
||||
{
|
||||
_id: item._id,
|
||||
},
|
||||
{ "$set": {"shareId":item._id.toString(),"appId":item.modelId}}
|
||||
)
|
||||
})
|
||||
```
|
||||
|
||||
## 初始化 API
|
||||
|
||||
部署新版项目,并发起 3 个 HTTP 请求(记得携带 `headers.rootkey`,这个值是环境变量里的)
|
||||
|
||||
1. https://xxxxx/api/admin/initv4
|
||||
2. https://xxxxx/api/admin/initChat
|
||||
3. https://xxxxx/api/admin/initOutlink
|
||||
|
||||
1 和 2 有可能会因为内存不足挂掉,可以重复执行。
|
27
docSite/content/docs/installation/upgrading/41.md
Normal file
27
docSite/content/docs/installation/upgrading/41.md
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: "升级到 V4.1"
|
||||
description: "FastGPT 从旧版本升级到 V4.1 操作指南"
|
||||
icon: "upgrade"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 762
|
||||
---
|
||||
|
||||
如果您是**从旧版本升级到 V4.1**,由于新版重新设置了对话存储结构,需要初始化原来的存储内容。
|
||||
|
||||
## 更新环境变量
|
||||
|
||||
V4.1 优化了 PostgreSQL 和 MongoDB 的连接变量,只需要填 1 个 URL 即可:
|
||||
|
||||
```bash
|
||||
# mongo 配置,不需要改. 如果连不上,可能需要去掉 ?authSource=admin
|
||||
- MONGODB_URI=mongodb://username:password@mongo:27017/fastgpt?authSource=admin
|
||||
# pg配置. 不需要改
|
||||
- PG_URL=postgresql://username:password@pg:5432/postgres
|
||||
```
|
||||
|
||||
## 初始化 API
|
||||
|
||||
部署新版项目,并发起 1 个 HTTP 请求(记得携带 `headers.rootkey`,这个值是环境变量里的)
|
||||
|
||||
+ https://xxxxx/api/admin/initChatItem
|
8
docSite/content/docs/installation/upgrading/_index.md
Normal file
8
docSite/content/docs/installation/upgrading/_index.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
weight: 760
|
||||
title: "版本升级"
|
||||
description: "FastGPT 升级指南"
|
||||
icon: upgrade
|
||||
draft: false
|
||||
images: []
|
||||
---
|
81
docSite/content/docs/intro.md
Normal file
81
docSite/content/docs/intro.md
Normal file
@@ -0,0 +1,81 @@
|
||||
---
|
||||
title: "快速了解 FastGPT"
|
||||
description: "FastGPT 的能力与优势"
|
||||
icon: "rocket_launch"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: -100
|
||||
---
|
||||
|
||||
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!
|
||||
|
||||
{{% alert icon="🤖 " context="success" %}}
|
||||
FastGPT 在线体验:[https://fastgpt.run](https://fastgpt.run)
|
||||
{{% /alert %}}
|
||||
|
||||
| | |
|
||||
| -------------------------- | -------------------------- |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|
||||
## FastGPT 能力
|
||||
|
||||
### 1. 专属 AI 客服
|
||||
|
||||
通过导入文档或已有问答对进行训练,让 AI 模型能根据你的文档以交互式对话方式回答问题。
|
||||
|
||||

|
||||
|
||||
### 2. 简单易用的可视化界面
|
||||
|
||||
FastGPT 采用直观的可视化界面设计,为各种应用场景提供了丰富实用的功能。通过简洁易懂的操作步骤,可以轻松完成 AI 客服的创建和训练流程。
|
||||
|
||||

|
||||
|
||||
### 3. 自动数据预处理
|
||||
|
||||
提供手动输入、直接分段、LLM 自动处理和 CSV 等多种数据导入途径,其中“直接分段”支持通过 PDF、WORD、Markdown 和 CSV 文档内容作为上下文。FastGPT 会自动对文本数据进行预处理、向量化和 QA 分割,节省手动训练时间,提升效能。
|
||||
|
||||

|
||||
|
||||
### 4. 工作流编排
|
||||
|
||||
基于 Flow 模块的工作流编排,可以帮助你设计更加复杂的问答流程。例如查询数据库、查询库存、预约实验室等。
|
||||
|
||||

|
||||
|
||||
### 5. 强大的 API 集成
|
||||
|
||||
FastGPT 对外的 API 接口对齐了 OpenAI 官方接口,可以直接接入现有的 GPT 应用,也可以轻松集成到企业微信、公众号、飞书等平台。
|
||||
|
||||

|
||||
|
||||
## FastGPT 特点
|
||||
|
||||
1. **项目完全开源**
|
||||
|
||||
FastGPT 遵循 Apache License 2.0 开源协议,你可以 [Fork](https://github.com/labring/FastGPT/fork) 之后进行二次开发和发布。FastGPT 社区版将保留核心功能,商业版仅在社区版基础上使用 API 的形式进行扩展,不影响学习使用。
|
||||
|
||||
2. **独特的 QA 结构**
|
||||
|
||||
针对客服问答场景设计的 QA 结构,提高在大量数据场景中的问答准确性。
|
||||
|
||||
3. **可视化工作流**
|
||||
|
||||
通过 Flow 模块展示了从问题输入到模型输出的完整流程,便于调试和设计复杂流程。
|
||||
|
||||
4. **无限扩展**
|
||||
|
||||
基于 API 进行扩展,无需修改 FastGPT 源码,也可快速接入现有的程序中。
|
||||
|
||||
5. **便于调试**
|
||||
|
||||
提供搜索测试、引用修改、完整对话预览等多种调试途径。
|
||||
|
||||
6. **支持多种模型**
|
||||
|
||||
支持 GPT、Claude、文心一言等多种 LLM 模型,未来也将支持自定义的向量模型。
|
||||
|
||||
## 知识库核心流程图
|
||||
|
||||

|
8
docSite/content/docs/use-cases/_index.md
Normal file
8
docSite/content/docs/use-cases/_index.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
weight: 600
|
||||
title: "使用案例"
|
||||
description: "有关 FastGPT 其他实践案例的更多信息"
|
||||
icon: "cases"
|
||||
draft: false
|
||||
images: []
|
||||
---
|
133
docSite/content/docs/use-cases/kb.md
Normal file
133
docSite/content/docs/use-cases/kb.md
Normal file
@@ -0,0 +1,133 @@
|
||||
---
|
||||
title: " 打造高质量 AI 知识库"
|
||||
description: " 利用 FastGPT 打造高质量 AI 知识库"
|
||||
icon: "school"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 640
|
||||
---
|
||||
|
||||
## 前言
|
||||
|
||||
自从去年 12 月 ChatGPT 发布后,带动了新的一轮应用交互革命。尤其是 GPT-3.5 接口全面放开后,LLM 应用雨后春笋般快速涌现,但因为 GPT 的可控性、随机性和合规性等问题,很多应用场景都没法落地。
|
||||
|
||||
3 月时候,在 Twitter 上刷到一个老哥使用 GPT 训练自己的博客记录,并且成本非常低(比起 FT)。他给出了一个完整的流程图:
|
||||
|
||||

|
||||
|
||||
看到这个推文后,我灵机一动,应用场景就十分清晰了。直接上手开干,在经过不到 1 个月时间,FastGPT 在原来多助手管理基础上,加入了向量搜索。于是便有了最早的一期视频:
|
||||
|
||||
{{< bilibili BV1Wo4y1p7i1 >}}
|
||||
|
||||
3 个月过去了,FastGPT 延续着早期的思路去完善和扩展,目前在向量搜索 + LLM 线性问答方面的功能基本上完成了。不过我们始终没有出一期关于如何构建知识库的教程,趁着 V4 在开发中,我们计划介绍一期《如何在 FastGPT 上构建高质量知识库》,以便大家更好的使用。
|
||||
|
||||
## FastGPT 知识库完整逻辑
|
||||
|
||||
在正式构建知识库前,我们先来了解下 FastGPT 是如何进行知识库检索的。首先了解几个基本概念:
|
||||
|
||||
1. 向量:将人类直观的语言(文字、图片、视频等)转成计算机可识别的语言(数组)。
|
||||
2. 向量相似度:两个向量之间可以进行计算,得到一个相似度,即代表:两个语言相似的程度。
|
||||
3. 语言大模型的一些特点:上下文理解、总结和推理。
|
||||
|
||||
结合上述 3 个概念,便有了 “向量搜索 + 大模型 = 知识库问答” 的公式。下图是 FastGPT V3 中知识库问答功能的完整逻辑:
|
||||
|
||||

|
||||
|
||||
与大部分其他知识库问答产品不一样的是, FastGPT 采用了 QA 问答对进行存储,而不是仅进行 chunk(文本分块)处理。目的是为了减少向量化内容的长度,让向量能更好的表达文本的含义,从而提高搜索精准度。
|
||||
此外 FastGPT 还提供了搜索测试和对话测试两种途径对数据进行调整,从而方便用户调整自己的数据。根据上述流程和方式,我们以构建一个 FastGPT 常见问题机器人为例,展示如何构建一个高质量的 AI 知识库。
|
||||
|
||||
## 构建知识库应用
|
||||
|
||||
首先,先创建一个 FastGPT 常见问题知识库
|
||||
|
||||

|
||||
|
||||
### 通过 QA 拆分,获取基础知识
|
||||
|
||||
我们先直接把 FastGPT Git 上一些已有文档,进行 QA 拆分,从而获取一些 FastGPT 基础的知识。下面是 README 例子。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### 修正 QA
|
||||
|
||||
通过 README 我们一共得到了 11 组数据,整体的质量还是不错的,图片和链接都提取出来了。不过最后一个知识点出现了一些截断,我们需要手动的修正一下。
|
||||
|
||||
此外,我们观察到第一列第三个知识点。这个知识点是介绍了 FastGPT 一些资源链接,但是 QA 拆分将答案放置在了 A 中,但通常来说用户的提问并不会直接问“有哪些链接”,通常会问:“部署教程”,“问题文档”之类的。因此,我们需要将这个知识点进行简单的一个处理,如下图:
|
||||
|
||||

|
||||
|
||||
我们先来创建一个应用,看看效果如何。 首先需要去创建一个应用,并且在知识库中关联相关的知识库。另外还需要在配置页的提示词中,告诉 GPT:“知识库的范围”。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
整体的效果还是不错的,链接和对应的图片都可以顺利的展示。
|
||||
|
||||
### 录入社区常见问题
|
||||
|
||||
接着,我们再把 FastGPT 常见问题的文档导入,由于平时整理不当,我们只能手动的录入对应的问答。
|
||||
|
||||

|
||||
|
||||
导入结果如上图。可以看到,我们均采用的是问答对的格式,而不是粗略的直接导入。目的就是为了模拟用户问题,进一步的提高向量搜索的匹配效果。可以为同一个问题设置多种问法,效果更佳。
|
||||
FastGPT 还提供了 openapi 功能,你可以在本地对特殊格式的文件进行处理后,再上传到 FastGPT,具体可以参考:[FastGPT Api Docs](https://kjqvjse66l.feishu.cn/docx/DmLedTWtUoNGX8xui9ocdUEjnNh)
|
||||
|
||||
## 知识库微调和参数调整
|
||||
|
||||
FastGPT 提供了搜索测试和对话测试两种途径对知识库进行微调,我们先来使用搜索测试对知识库进行调整。我们建议你提前收集一些用户问题进行测试,根据预期效果进行跳转。可以先进行搜索测试调整,判断知识点是否合理。
|
||||
|
||||
### 搜索测试
|
||||
|
||||

|
||||
|
||||
你可能会遇到下面这种情况,由于“知识库”这个关键词导致一些无关内容的相似度也被搜索进去,此时就需要给第四条记录也增加一个“知识库”关键词,从而去提高它的相似度。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### 提示词设置
|
||||
|
||||
提示词的作用是引导模型对话的方向。在设置提示词时,遵守 2 个原则:
|
||||
|
||||
1. 告诉 Gpt 回答什么方面内容。
|
||||
2. 给知识库一个基本描述,从而让 Gpt 更好的判断用户的问题是否属于知识库范围。
|
||||
|
||||

|
||||
|
||||
### 更好的限定模型聊天范围
|
||||
|
||||
首先,你可以通过调整知识库搜索时的相似度和最大搜索数量,实现从知识库层面限制聊天范围。通常我们可以设置相似度为 0.82,并设置空搜索回复内容。这意味着,如果用户的问题无法在知识库中匹配时,会直接回复预设的内容。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
由于 openai 向量模型并不是针对中文,所以当问题中有一些知识库内容的关键词时,相似度
|
||||
会较高,此时无法从知识库层面进行限定。需要通过限定词进行调整,例如:
|
||||
|
||||
> 我的问题如果不是关于 FastGPT 的,请直接回复:“我不确定”。你仅需要回答知识库中的内容,不在其中的内容,不需要回答。
|
||||
|
||||
效果如下:
|
||||
|
||||

|
||||
|
||||
当然,gpt35 在一定情况下依然是不可控的。
|
||||
|
||||
### 通过对话调整知识库
|
||||
|
||||
与搜索测试类似,你可以直接在对话页里,点击“引用”,来随时修改知识库内容。
|
||||
|
||||

|
||||
|
||||
## 总结
|
||||
|
||||
1. 向量搜索是一种可以比较文本相似度的技术。
|
||||
2. 大模型具有总结和推理能力,可以从给定的文本中回答问题。
|
||||
3. 最有效的知识库构建方式是 QA 和手动构建。
|
||||
4. Q 的长度不宜过长。
|
||||
5. 需要调整提示词,来引导模型回答知识库内容。
|
||||
6. 可以通过调整搜索相似度、最大搜索数量和限定词来控制模型回复的范围。
|
37
docSite/content/docs/use-cases/openai.md
Normal file
37
docSite/content/docs/use-cases/openai.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: "对接第三方 GPT 应用"
|
||||
description: "通过与 OpenAI 兼容的 API 对接第三方应用"
|
||||
icon: "model_training"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 620
|
||||
---
|
||||
|
||||
## 获取 API 秘钥
|
||||
|
||||
依次选择应用 -> 「API访问」,然后点击「API 密钥」来创建密钥。
|
||||
|
||||
{{% alert context="warning" %}}
|
||||
密钥需要自己保管好,一旦关闭就无法再复制密钥,只能创建新密钥再复制。
|
||||
{{% /alert %}}
|
||||
|
||||

|
||||
|
||||
## 组合秘钥
|
||||
|
||||
利用刚复制的 API 秘钥加上 AppId 组合成一个新的秘钥,格式为:`API 秘钥-AppId`,例如:`fastgpt-z51pkjqm9nrk03a1rx2funoy-642adec15f04d67d4613efdb`。
|
||||
|
||||
## 替换三方应用的变量
|
||||
|
||||
```bash
|
||||
OPENAI_API_BASE_URL: https://fastgpt.run/api/openapi (改成自己部署的域名)
|
||||
OPENAI_API_KEY = 组合秘钥
|
||||
```
|
||||
|
||||
**[ChatGPT Next Web](https://github.com/Yidadaa/ChatGPT-Next-Web) 示例:**
|
||||
|
||||

|
||||
|
||||
**[ChatGPT Web](https://github.com/Chanzhaoyu/chatgpt-web) 示例:**
|
||||
|
||||

|
113
docSite/content/docs/use-cases/prompt.md
Normal file
113
docSite/content/docs/use-cases/prompt.md
Normal file
@@ -0,0 +1,113 @@
|
||||
---
|
||||
title: "提示词示例"
|
||||
description: "FastGPT 更多提示词示例"
|
||||
icon: "sign_language"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 610
|
||||
---
|
||||
|
||||
## 客服
|
||||
|
||||
```
|
||||
您好您将扮演万千紧固件公司的售前客服。在第一次咨询中,您需要获取客户的联系人姓名和手机号码,并了解客户是终端生产企业还是工贸经销商。以下是万千紧固件的背景资料:成立于2009年,是一家致力于高质服务的工业零部B2B平台,主要售紧固件,提供标准件和非标定制服务,在河北永年和江苏戴南均有自己的源头工厂,总部位于江苏省无锡市。
|
||||
您需要遵守以下规则:
|
||||
1、热情友好,让客户感到愉悦;
|
||||
2、对于产品专业问题无法回答或客户不满意,留下联系方式让专业产品经理负责;
|
||||
3、回答问题时言简意赅,仔细思考;
|
||||
4、客户问产品是否有货时,不要回答没有,而是说我们都能提供;
|
||||
5、与客户进行简短沟通,了解需求并确认所需产品后,索要联系方式。
|
||||
|
||||
|
||||
样本示例1:
|
||||
客户:在吗?
|
||||
客服:在的,请问您需要咨询什么产品?
|
||||
客户:防盗螺栓有吗?
|
||||
客服:有的,我们提供全品类的紧固件产品,请告诉我具体的型号和用途。
|
||||
客户:用在铁塔机器上的,2040304不锈钢
|
||||
客服:请问需要多少件?
|
||||
客户:大概10万颗左右吧
|
||||
客户:给我个报价,优惠些,长期合作
|
||||
客服:非常抱歉,报价需要我们专业的产品同事,您能留下联系方式吗?我会安排他们立即与您联系。
|
||||
客户:王先,13928916752今天能联系么
|
||||
客服:可以的,我们的同事会在1个小时内与您联系,请注意接听来自无锡的电话。谢谢您的咨询。
|
||||
|
||||
样本示例2:
|
||||
客户:请问一下这个螺栓有没有33长度的?
|
||||
客服:您好,我是客服小万,请问您需要的是哪种螺栓?能说得更具体一些吗?
|
||||
客户:圆头方颈。
|
||||
客服:头部多大?
|
||||
客户:13。
|
||||
客户:M6的。
|
||||
客服:您要的是哪个材质的呢?
|
||||
客户:碳钢的,强度高一点。
|
||||
客服:您需要多少个呢?
|
||||
客户:大约2000个左右。
|
||||
客服:方便留下您的联系方式吗?
|
||||
客服:我会让同事在上午与您确认并回复。
|
||||
客户:18217699040。
|
||||
客服:请问您的姓氏是?
|
||||
客户:王。
|
||||
客服:好的。
|
||||
客户:谢谢。
|
||||
|
||||
样本示例3:
|
||||
客户:你们是生产还是贸易?
|
||||
客服:亲,感谢您的咨询。我们既生产也贸易,同时接受标准件和非标定制的订单。请问您需要采购什么产品?
|
||||
客户:SPR25x100L铜套的304材质螺母M64。
|
||||
客户:我想找源头工厂。
|
||||
客服:亲,我们就是源头工厂哦!请问您是关心价格还是质量呢?我们万千是国内大品牌,价格实惠,质量和交期都有保障。
|
||||
客户:工厂放心点,经销商门道太多。
|
||||
客服:亲,您可以放心,我们的产品质量有保障,如有不满意可退换;有问题我们也有专属客服经理24小时处理。
|
||||
客服:请问您具体需要多少数量呢?
|
||||
客户:2456个。
|
||||
客户:什么时候能给出报价?我这边比较着急使用。
|
||||
客服:亲,请留下您的联系方式,我会让我们专业的产品同事与您联系。
|
||||
客户:13928956789,李。
|
||||
|
||||
样本示例4:
|
||||
客户:你好,在吗?
|
||||
客服:在的。
|
||||
客服:请问您需要什么产品?
|
||||
客户:卡箍有吗?
|
||||
客服:有的,您需要哪一种?
|
||||
客户:我是用在电线杆上的。
|
||||
客户:我需要200个。
|
||||
客服:好的,您需要什么材质的?
|
||||
客户:有图片吗?我想看看是不是我需要的那种,材质无所谓。
|
||||
客服:好的,方便加您微信吗?在线上不方便发图片,加微信后我会给您发送图片以进行确认。
|
||||
客户:您的微信是多少?我加您。
|
||||
客服:好的,我的微信是18626076792,您可以添加一下。您也可以直接拨打电话与我们联系。
|
||||
客户:已添加,请通过微信沟通。
|
||||
客服:好的,已通过,我需要记录一下,请问您的电话方便吗?
|
||||
客户:187628100000。
|
||||
服:请问您的姓氏是?
|
||||
客户:陈。
|
||||
客服:好的。
|
||||
客户:谢谢。
|
||||
|
||||
样本示例5:
|
||||
客户:87322.5。
|
||||
客服:好的,您是要扁圆头半空心铆钉吗?您需要具体什么材质的呢?
|
||||
客户:材质无所谓。您们的最低起订量是多少?
|
||||
客服:起订量这边需要帮您查询一下系统。您是只要规格,材质无所谓吗?
|
||||
客户:是的,因为不好买。
|
||||
客服:好的,这边稍后查一下系统,确认是否有现货。如果没有现货,是否可以接受定制?我们公司也支持定制服务。
|
||||
客户:定制需要多少起订量?您能帮我询问一下不同材质的要求吗?
|
||||
客服:好的,方便留下您的联系方式吗?稍后我们会安排专业的同事与您联系,直接对接沟通。
|
||||
客户:18190818931。
|
||||
客服:请问您的姓氏是?
|
||||
客户:杨。
|
||||
客服:好的,请稍等。
|
||||
|
||||
样品示例6
|
||||
客户:不锈钢201 M87,单价多少?
|
||||
客服说:你好,请问您需要的是哪一种螺丝?
|
||||
客户:外六角螺栓
|
||||
客服说:好的,你需要多少啊?我们量大优惠越大
|
||||
客户:10000左右
|
||||
客服说:好的,只有这一种产品需要帮你报价吗,还有其他的产品需要一并帮你确认价格吗?
|
||||
客户:全牙201不锈钢 M825
|
||||
客服说:好的,您总共有几种产品需要报价?
|
||||
客户:十几种
|
||||
```
|
8
docSite/content/docs/workflow/_index.md
Normal file
8
docSite/content/docs/workflow/_index.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
weight: 400
|
||||
title: "高级编排"
|
||||
description: "FastGPT 高级编排文档"
|
||||
icon: "family_history"
|
||||
draft: false
|
||||
images: []
|
||||
---
|
8
docSite/content/docs/workflow/examples/_index.md
Normal file
8
docSite/content/docs/workflow/examples/_index.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
weight: 440
|
||||
title: "编排示例"
|
||||
description: "介绍 FastGPT 的高级编排实践案例"
|
||||
icon: "list"
|
||||
draft: false
|
||||
images: []
|
||||
---
|
456
docSite/content/docs/workflow/examples/google_search.md
Normal file
456
docSite/content/docs/workflow/examples/google_search.md
Normal file
@@ -0,0 +1,456 @@
|
||||
---
|
||||
title: "联网 GPT"
|
||||
description: "将 FastGPT 外接搜索引擎"
|
||||
icon: "search"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 441
|
||||
---
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
如上图,利用 HTTP 模块,你可以轻松的外接一个搜索引擎。这里以调用 Google Search API 为例。
|
||||
|
||||
## 注册 Google Search API
|
||||
|
||||
[参考这篇文章](https://zhuanlan.zhihu.com/p/174666017)
|
||||
|
||||
## 写一个 Google Search 接口
|
||||
|
||||
这里用 [Laf](https://laf.dev/) 快速实现一个接口,即写即发布,无需部署。务必打开 POST 请求方式。
|
||||
|
||||
```ts
|
||||
import cloud from '@lafjs/cloud';
|
||||
|
||||
const googleSearchKey = '';
|
||||
const googleCxId = '';
|
||||
const baseurl = 'https://www.googleapis.com/customsearch/v1';
|
||||
|
||||
export default async function (ctx: FunctionContext) {
|
||||
const { searchKey } = ctx.body;
|
||||
|
||||
if (!searchKey) {
|
||||
return {
|
||||
prompt: ''
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const { data } = await cloud.fetch.get(baseurl, {
|
||||
params: {
|
||||
q: searchKey,
|
||||
cx: googleCxId,
|
||||
key: googleSearchKey,
|
||||
c2coff: 1,
|
||||
start: 1,
|
||||
end: 5,
|
||||
dateRestrict: 'm[1]'
|
||||
}
|
||||
});
|
||||
const result = data.items.map((item) => item.snippet).join('\n');
|
||||
return { prompt: `搜索词: ${searchKey};google 搜索结果: ${result}` };
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
return {
|
||||
prompt: ''
|
||||
};
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 模块编排
|
||||
|
||||
复制下面配置,点击「高级编排」右上角的导入按键,导入该配置,导入后将接口地址复制到「HTTP 模块」。
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"moduleId": "userChatInput",
|
||||
"name": "用户问题(对话入口)",
|
||||
"flowType": "questionInput",
|
||||
"position": {
|
||||
"x": 464.32198615344566,
|
||||
"y": 1602.2698463081606
|
||||
},
|
||||
"inputs": [
|
||||
{
|
||||
"key": "userChatInput",
|
||||
"type": "systemInput",
|
||||
"label": "用户问题",
|
||||
"connected": true
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"key": "userChatInput",
|
||||
"label": "用户问题",
|
||||
"type": "source",
|
||||
"valueType": "string",
|
||||
"targets": [
|
||||
{
|
||||
"moduleId": "6g2075",
|
||||
"key": "content"
|
||||
},
|
||||
{
|
||||
"moduleId": "aijmbb",
|
||||
"key": "userChatInput"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"moduleId": "history",
|
||||
"name": "聊天记录",
|
||||
"flowType": "historyNode",
|
||||
"position": {
|
||||
"x": 452.5466249541586,
|
||||
"y": 1276.3930310334215
|
||||
},
|
||||
"inputs": [
|
||||
{
|
||||
"key": "maxContext",
|
||||
"type": "numberInput",
|
||||
"label": "最长记录数",
|
||||
"value": 6,
|
||||
"min": 0,
|
||||
"max": 50,
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "history",
|
||||
"type": "hidden",
|
||||
"label": "聊天记录",
|
||||
"connected": true
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"key": "history",
|
||||
"label": "聊天记录",
|
||||
"valueType": "chat_history",
|
||||
"type": "source",
|
||||
"targets": [
|
||||
{
|
||||
"moduleId": "6g2075",
|
||||
"key": "history"
|
||||
},
|
||||
{
|
||||
"moduleId": "aijmbb",
|
||||
"key": "history"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"moduleId": "6g2075",
|
||||
"name": "文本内容提取",
|
||||
"flowType": "contentExtract",
|
||||
"showStatus": true,
|
||||
"position": {
|
||||
"x": 971.5119545668634,
|
||||
"y": 1118.186021718385
|
||||
},
|
||||
"inputs": [
|
||||
{
|
||||
"key": "switch",
|
||||
"type": "target",
|
||||
"label": "触发器",
|
||||
"valueType": "any",
|
||||
"connected": false
|
||||
},
|
||||
{
|
||||
"key": "description",
|
||||
"type": "textarea",
|
||||
"valueType": "string",
|
||||
"label": "提取要求描述",
|
||||
"description": "写一段提取要求,告诉 AI 需要提取哪些内容",
|
||||
"required": true,
|
||||
"placeholder": "例如: \n1. 你是一个实验室预约助手。根据用户问题,提取出姓名、实验室号和预约时间",
|
||||
"value": "你是谷歌搜索机器人,可以生成搜索词。你需要自行判断是否需要生成搜索词,如果不需要则返回空字符串。",
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "history",
|
||||
"type": "target",
|
||||
"label": "聊天记录",
|
||||
"valueType": "chat_history",
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "content",
|
||||
"type": "target",
|
||||
"label": "需要提取的文本",
|
||||
"required": true,
|
||||
"valueType": "string",
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "extractKeys",
|
||||
"type": "custom",
|
||||
"label": "目标字段",
|
||||
"description": "由 '描述' 和 'key' 组成一个目标字段,可提取多个目标字段",
|
||||
"value": [
|
||||
{
|
||||
"desc": "搜索词",
|
||||
"key": "searchKey",
|
||||
"required": false
|
||||
}
|
||||
],
|
||||
"connected": true
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"key": "success",
|
||||
"label": "字段完全提取",
|
||||
"valueType": "boolean",
|
||||
"type": "source",
|
||||
"targets": []
|
||||
},
|
||||
{
|
||||
"key": "failed",
|
||||
"label": "提取字段缺失",
|
||||
"valueType": "boolean",
|
||||
"type": "source",
|
||||
"targets": [
|
||||
{
|
||||
"moduleId": "aijmbb",
|
||||
"key": "switch"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "fields",
|
||||
"label": "完整提取结果",
|
||||
"description": "一个 JSON 字符串,例如:{\"name:\":\"YY\",\"Time\":\"2023/7/2 18:00\"}",
|
||||
"valueType": "string",
|
||||
"type": "source",
|
||||
"targets": []
|
||||
},
|
||||
{
|
||||
"key": "searchKey",
|
||||
"label": "提取结果-搜索词",
|
||||
"description": "无法提取时不会返回",
|
||||
"valueType": "string",
|
||||
"type": "source",
|
||||
"targets": [
|
||||
{
|
||||
"moduleId": "5fk9ru",
|
||||
"key": "searchKey"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"moduleId": "5fk9ru",
|
||||
"name": "HTTP模块",
|
||||
"flowType": "httpRequest",
|
||||
"showStatus": true,
|
||||
"position": {
|
||||
"x": 1481.5339897373183,
|
||||
"y": 1290.2958964143072
|
||||
},
|
||||
"inputs": [
|
||||
{
|
||||
"key": "url",
|
||||
"value": "https://d8dns0.laf.dev/google_web_search",
|
||||
"type": "input",
|
||||
"label": "请求地址",
|
||||
"description": "请求目标地址",
|
||||
"placeholder": "https://api.fastgpt.run/getInventory",
|
||||
"required": true,
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "switch",
|
||||
"type": "target",
|
||||
"label": "触发器",
|
||||
"valueType": "any",
|
||||
"connected": false
|
||||
},
|
||||
{
|
||||
"valueType": "string",
|
||||
"type": "target",
|
||||
"label": "搜索词",
|
||||
"edit": true,
|
||||
"key": "searchKey",
|
||||
"required": true,
|
||||
"connected": true
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"label": "搜索词",
|
||||
"valueType": "string",
|
||||
"type": "source",
|
||||
"edit": true,
|
||||
"targets": [],
|
||||
"key": "searchKey"
|
||||
},
|
||||
{
|
||||
"label": "搜索结果",
|
||||
"valueType": "string",
|
||||
"type": "source",
|
||||
"edit": true,
|
||||
"targets": [
|
||||
{
|
||||
"moduleId": "aijmbb",
|
||||
"key": "systemPrompt"
|
||||
}
|
||||
],
|
||||
"key": "prompt"
|
||||
},
|
||||
{
|
||||
"key": "finish",
|
||||
"label": "请求结束",
|
||||
"valueType": "boolean",
|
||||
"type": "source",
|
||||
"targets": [
|
||||
{
|
||||
"moduleId": "aijmbb",
|
||||
"key": "switch"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"moduleId": "aijmbb",
|
||||
"name": "AI 对话",
|
||||
"flowType": "chatNode",
|
||||
"showStatus": true,
|
||||
"position": {
|
||||
"x": 2086.6387991825745,
|
||||
"y": 1090.812798225035
|
||||
},
|
||||
"inputs": [
|
||||
{
|
||||
"key": "model",
|
||||
"type": "custom",
|
||||
"label": "对话模型",
|
||||
"value": "gpt-3.5-turbo-16k",
|
||||
"list": [],
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "temperature",
|
||||
"type": "slider",
|
||||
"label": "温度",
|
||||
"value": 0,
|
||||
"min": 0,
|
||||
"max": 10,
|
||||
"step": 1,
|
||||
"markList": [
|
||||
{
|
||||
"label": "严谨",
|
||||
"value": 0
|
||||
},
|
||||
{
|
||||
"label": "发散",
|
||||
"value": 10
|
||||
}
|
||||
],
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "maxToken",
|
||||
"type": "custom",
|
||||
"label": "回复上限",
|
||||
"value": 8000,
|
||||
"min": 100,
|
||||
"max": 4000,
|
||||
"step": 50,
|
||||
"markList": [
|
||||
{
|
||||
"label": "100",
|
||||
"value": 100
|
||||
},
|
||||
{
|
||||
"label": "4000",
|
||||
"value": 4000
|
||||
}
|
||||
],
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "systemPrompt",
|
||||
"type": "textarea",
|
||||
"label": "系统提示词",
|
||||
"valueType": "string",
|
||||
"description": "模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}",
|
||||
"placeholder": "模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}",
|
||||
"value": "",
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "limitPrompt",
|
||||
"type": "textarea",
|
||||
"valueType": "string",
|
||||
"label": "限定词",
|
||||
"description": "限定模型对话范围,会被放置在本次提问前,拥有强引导和限定性。可使用变量,例如 {{language}}。引导例子:\n1. 知识库是关于 Laf 的介绍,参考知识库回答问题,与 \"Laf\" 无关内容,直接回复: \"我不知道\"。\n2. 你仅回答关于 \"xxx\" 的问题,其他问题回复: \"xxxx\"",
|
||||
"placeholder": "限定模型对话范围,会被放置在本次提问前,拥有强引导和限定性。可使用变量,例如 {{language}}。引导例子:\n1. 知识库是关于 Laf 的介绍,参考知识库回答问题,与 \"Laf\" 无关内容,直接回复: \"我不知道\"。\n2. 你仅回答关于 \"xxx\" 的问题,其他问题回复: \"xxxx\"",
|
||||
"value": "上文是谷歌搜索的结果,你可以提供实时信息,根据搜索结果回答问题。当前时间是{{cTime}}。",
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "switch",
|
||||
"type": "target",
|
||||
"label": "触发器",
|
||||
"valueType": "any",
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "quoteQA",
|
||||
"type": "target",
|
||||
"label": "引用内容",
|
||||
"valueType": "kb_quote",
|
||||
"connected": false
|
||||
},
|
||||
{
|
||||
"key": "history",
|
||||
"type": "target",
|
||||
"label": "聊天记录",
|
||||
"valueType": "chat_history",
|
||||
"connected": true
|
||||
},
|
||||
{
|
||||
"key": "userChatInput",
|
||||
"type": "target",
|
||||
"label": "用户问题",
|
||||
"required": true,
|
||||
"valueType": "string",
|
||||
"connected": true
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"key": "answerText",
|
||||
"label": "模型回复",
|
||||
"description": "直接响应,无需配置",
|
||||
"type": "hidden",
|
||||
"targets": []
|
||||
},
|
||||
{
|
||||
"key": "finish",
|
||||
"label": "回复结束",
|
||||
"description": "AI 回复完成后触发",
|
||||
"valueType": "boolean",
|
||||
"type": "source",
|
||||
"targets": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## 流程说明
|
||||
|
||||
1. 提取模块将用户的问题提取成搜索关键词。
|
||||
2. 将搜索关键词传入 HTTP 模块。
|
||||
3. HTTP 模块调用谷歌搜索接口,返回搜索内容。
|
||||
4. 将搜索内容传入【AI 对话】的提示词,引导模型进行回答。
|
87
docSite/content/docs/workflow/intro.md
Normal file
87
docSite/content/docs/workflow/intro.md
Normal file
@@ -0,0 +1,87 @@
|
||||
---
|
||||
title: "高级编排介绍"
|
||||
description: "快速了解 FastGPT 高级编排"
|
||||
icon: "circle"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 410
|
||||
---
|
||||
|
||||
FastGPT 从 V4 版本开始采用新的交互方式来构建 AI 应用。使用了 Flow 节点编排的方式来实现复杂工作流,提高可玩性和扩展性。但同时也提高了上手的门槛,有一定开发背景的用户使用起来会比较容易。
|
||||
|
||||

|
||||
|
||||
## 什么是模块?
|
||||
|
||||
在程序中,模块可以理解为一个个 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. 为了方便识别不同输入输出的类型,FastGPT 给每个模块的输入输出连接点赋予不同的颜色,你可以把相同颜色的连接点连接起来。其中,灰色代表任意类型,可以随意连接。
|
||||
2. 位于左侧的连接点为输入,右侧的为输出,连接只能将一个输入和输出连接起来,不能连接“输入和输入”或者“输出和输出”。
|
||||
3. 可以点击连接线中间的 x 来删除连接线。
|
||||
4. 可以左键点击选中连接线
|
||||
|
||||
## 如何阅读?
|
||||
|
||||
1. 建议从左往右阅读。
|
||||
2. 从 **用户问题** 模块开始。用户问题模块,代表的是用户发送了一段文本,触发任务开始。
|
||||
3. 关注【AI 对话】和【指定回复】模块,这两个模块是输出答案的地方。
|
8
docSite/content/docs/workflow/modules/_index.md
Normal file
8
docSite/content/docs/workflow/modules/_index.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
weight: 420
|
||||
title: "模块介绍"
|
||||
description: "介绍 FastGPT 的常用模块"
|
||||
icon: "apps"
|
||||
draft: false
|
||||
images: []
|
||||
---
|
71
docSite/content/docs/workflow/modules/ai_chat.md
Normal file
71
docSite/content/docs/workflow/modules/ai_chat.md
Normal file
@@ -0,0 +1,71 @@
|
||||
---
|
||||
title: "AI 对话"
|
||||
description: "FastGPT AI 对话模块介绍"
|
||||
icon: "chat"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 423
|
||||
---
|
||||
|
||||
## 特点
|
||||
|
||||
- 可重复添加(复杂编排时防止线太乱,可以更美观)
|
||||
- 有外部输入
|
||||
- 有静态配置
|
||||
- 触发执行
|
||||
- 核心模块
|
||||
|
||||

|
||||
|
||||
## 参数说明
|
||||
|
||||
### 对话模型
|
||||
|
||||
可以通过 [config.json](/docs/installation/reference/models/) 配置可选的对话模型,通过 [one-api](/docs/installation/one-api/) 来实现多模型接入。
|
||||
|
||||
### 温度 & 回复上限
|
||||
|
||||
+ **温度**:越低回答越严谨,少废话(实测下来,感觉差别不大)
|
||||
+ **回复上限**:最大回复 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 大模型的数据是一个数组,内容和顺序如下:
|
||||
|
||||
```bash
|
||||
[
|
||||
系统提示词
|
||||
引用内容
|
||||
聊天记录
|
||||
限定词
|
||||
问题
|
||||
]
|
||||
```
|
60
docSite/content/docs/workflow/modules/content_extract.md
Normal file
60
docSite/content/docs/workflow/modules/content_extract.md
Normal file
@@ -0,0 +1,60 @@
|
||||
---
|
||||
title: "内容提取"
|
||||
description: "FastGPT 内容提取模块介绍"
|
||||
icon: "content_paste_go"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 424
|
||||
---
|
||||
|
||||
## 特点
|
||||
|
||||
- 可重复添加
|
||||
- 有外部输入
|
||||
- 需要手动配置
|
||||
- 触发执行
|
||||
- function_call 模块
|
||||
- 核心模块
|
||||
|
||||

|
||||
|
||||
## 功能
|
||||
|
||||
从文本中提取结构化数据,通常是配合 HTTP 模块实现扩展。也可以做一些直接提取操作,例如:翻译。
|
||||
|
||||
## 参数说明
|
||||
|
||||
### 提取要求描述
|
||||
|
||||
顾名思义,给模型设置一个目标,需要提取哪些内容。
|
||||
|
||||
**示例 1**
|
||||
|
||||
> 你是实验室预约助手,从对话中提取出姓名,预约时间,实验室号。当前时间 {{cTime}}
|
||||
|
||||
**示例 2**
|
||||
|
||||
> 你是谷歌搜索助手,从对话中提取出搜索关键词
|
||||
|
||||
**示例 3**
|
||||
|
||||
> 将我的问题直接翻译成英文,不要回答问题
|
||||
|
||||
### 历史记录
|
||||
|
||||
通常需要一些历史记录,才能更完整的提取用户问题。例如上图中需要提供姓名、时间和实验室名,用户可能一开始只给了时间和实验室名,没有提供自己的姓名。再经过一轮缺失提示后,用户输入了姓名,此时需要结合上一次的记录才能完整的提取出 3 个内容。
|
||||
|
||||
### 目标字段
|
||||
|
||||
目标字段与提取的结果相对应,从上图可以看到,每增加一个字段,输出会增加一个对应的出口。
|
||||
|
||||
+ **key**: 字段的唯一标识,不可重复!
|
||||
+ **字段描述**:描述该字段是关于什么的,例如:姓名、时间、搜索词等等。
|
||||
+ **必须**:是否强制模型提取该字段,可能提取出来是空字符串。
|
||||
|
||||
## 输出介绍
|
||||
|
||||
- **字段完全提取**:说明用户的问题中包含需要提取的所有内容。
|
||||
- **提取字段缺失**:与 “字段完全提取” 对立,有缺失提取的字段时触发。
|
||||
- **完整提取结果**: 一个 JSON 字符串,包含所有字段的提取结果。
|
||||
- **目标字段提取结果**:类型均为字符串。
|
18
docSite/content/docs/workflow/modules/guide.md
Normal file
18
docSite/content/docs/workflow/modules/guide.md
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
title: "用户引导"
|
||||
description: "FastGPT 用户引导模块介绍"
|
||||
icon: "psychology"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 426
|
||||
---
|
||||
|
||||
## 特点
|
||||
|
||||
- 仅可添加 1 个
|
||||
- 无外部输入
|
||||
- 不参与实际调度
|
||||
|
||||
如图,可以在用户提问前给予一定引导。并可以设置引导问题。
|
||||
|
||||

|
19
docSite/content/docs/workflow/modules/history.md
Normal file
19
docSite/content/docs/workflow/modules/history.md
Normal file
@@ -0,0 +1,19 @@
|
||||
---
|
||||
title: "历史记录"
|
||||
description: "FastGPT 历史记录模块介绍"
|
||||
icon: "history"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 427
|
||||
---
|
||||
|
||||
# 特点
|
||||
|
||||
- 可重复添加(防止复杂编排时线太乱,重复添加可以更美观)
|
||||
- 无外部输入
|
||||
- 流程入口
|
||||
- 自动执行
|
||||
|
||||
每次对话时,会从数据库取最多 n 条聊天记录作为上下文。注意,不是指本轮对话最多 n 条上下文,本轮对话还包括:提示词、限定词、引用内容和问题。
|
||||
|
||||

|
104
docSite/content/docs/workflow/modules/http.md
Normal file
104
docSite/content/docs/workflow/modules/http.md
Normal file
@@ -0,0 +1,104 @@
|
||||
---
|
||||
title: "HTTP 模块"
|
||||
description: "FastGPT HTTP 模块介绍"
|
||||
icon: "http"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 428
|
||||
---
|
||||
|
||||
## 特点
|
||||
|
||||
- 可重复添加
|
||||
- 有外部输入
|
||||
- 手动配置
|
||||
- 触发执行
|
||||
- 核中核模块
|
||||
|
||||

|
||||
|
||||
## 介绍
|
||||
|
||||
HTTP 模块会向对应的地址发送一个 POST 请求(Body 中携带 JSON 类型的参数,具体的参数可自定义),并接收一个 JSON 响应值,字段也是自定义。如上图中,我们定义了一个入参:「提取的字段」(定义的 key 为 appointment,类型为 string)和一个出参:「提取结果」(定义的 key 为 response,类型为 string)。
|
||||
|
||||
那么,这个请求的命令为:
|
||||
|
||||
```bash
|
||||
curl --location --request POST 'https://xxxx.laf.dev/appointment-lab' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--data-raw '{
|
||||
"appointment":"{\"name\":\"小明\",\"time\":\"2023/08/16 15:00\",\"labname\":\"子良A323\"}"
|
||||
}'
|
||||
```
|
||||
|
||||
响应为:
|
||||
|
||||
```json
|
||||
{
|
||||
"response": "您已经有一个预约记录了,每人仅能同时预约一个实验室:\n 姓名:小明\n 时间: 2023/08/15 15:00\n 实验室: 子良A323\n "
|
||||
}
|
||||
```
|
||||
|
||||
{{% alert context="warning" %}}
|
||||
如果你不想额外部署服务,可以使用 [Laf](https://laf.dev/) 来快速开发上线接口,即写即发,无需部署。
|
||||
|
||||
下面是在 Laf 上编写的一个请求示例:
|
||||
{{% /alert %}}
|
||||
|
||||
```ts
|
||||
import cloud from '@lafjs/cloud';
|
||||
const db = cloud.database();
|
||||
|
||||
export default async function (ctx: FunctionContext) {
|
||||
const { appointment } = ctx.body;
|
||||
const { name, time, labname } = JSON.parse(appointment);
|
||||
|
||||
const missData = [];
|
||||
if (!name) missData.push('你的姓名');
|
||||
if (!time) missData.push('需要预约的时间');
|
||||
if (!labname) missData.push('实验室名称');
|
||||
|
||||
if (missData.length > 0) {
|
||||
return {
|
||||
response: `请提供: ${missData.join('、')}`
|
||||
};
|
||||
}
|
||||
|
||||
const { data: record } = await db
|
||||
.collection('LabAppointment')
|
||||
.where({
|
||||
name,
|
||||
status: 'unStart'
|
||||
})
|
||||
.getOne();
|
||||
|
||||
if (record) {
|
||||
return {
|
||||
response: `您已经有一个预约记录了,每人仅能同时预约一个实验室:
|
||||
姓名:${record.name}
|
||||
时间: ${record.time}
|
||||
实验室: ${record.labname}
|
||||
`
|
||||
};
|
||||
}
|
||||
|
||||
await db.collection('LabAppointment').add({
|
||||
name,
|
||||
time,
|
||||
labname,
|
||||
status: 'unStart'
|
||||
});
|
||||
|
||||
return {
|
||||
response: `预约成功。
|
||||
姓名:${name}
|
||||
时间: ${time}
|
||||
实验室: ${labname}
|
||||
`
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
## 作用
|
||||
|
||||
基于 HTTP 模块可以无限扩展,比如操作数据库、执行联网搜索、发送邮箱等等。如果你有有趣的案例,欢迎提交 PR 到 [编排案例](/docs/category/examples)
|
17
docSite/content/docs/workflow/modules/input.md
Normal file
17
docSite/content/docs/workflow/modules/input.md
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
title: "用户问题"
|
||||
description: "FastGPT 用户问题模块介绍"
|
||||
icon: "input"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 430
|
||||
---
|
||||
|
||||
## 特点
|
||||
|
||||
- 可重复添加(防止复杂编排时线太乱,重复添加可以更美观)
|
||||
- 无外部输入
|
||||
- 流程入口
|
||||
- 自动执行
|
||||
|
||||

|
78
docSite/content/docs/workflow/modules/question.md
Normal file
78
docSite/content/docs/workflow/modules/question.md
Normal file
@@ -0,0 +1,78 @@
|
||||
---
|
||||
title: "问题分类"
|
||||
description: "FastGPT 问题分类模块介绍"
|
||||
icon: "quiz"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 425
|
||||
---
|
||||
|
||||
## 特点
|
||||
|
||||
- 可重复添加
|
||||
- 有外部输入
|
||||
- 需要手动配置
|
||||
- 触发执行
|
||||
- function_call 模块
|
||||
|
||||

|
||||
|
||||
## 功能
|
||||
|
||||
可以将用户的问题进行分类,分类后执行不同操作。在一些较模糊的场景中,分类效果不是很明显。
|
||||
|
||||
## 参数说明
|
||||
|
||||
### 系统提示词
|
||||
|
||||
被放置在对话最前面,可用于补充说明分类内容的定义。例如问题会被分为:
|
||||
|
||||
1. 打招呼
|
||||
2. Laf 常见问题
|
||||
3. 其他问题
|
||||
|
||||
由于 Laf 不是一个明确的东西,需要给它一个定义,此时提示词里可以填入 Laf 的定义:
|
||||
|
||||
```
|
||||
Laf 是云开发平台,可以快速的开发应用
|
||||
Laf 是一个开源的 BaaS 开发平台(Backend as a Service)
|
||||
Laf 是一个开箱即用的 serverless 开发平台
|
||||
Laf 是一个集「函数计算」、「数据库」、「对象存储」等于一身的一站式开发平台
|
||||
Laf 可以是开源版的腾讯云开发、开源版的 Google Firebase、开源版的 UniCloud
|
||||
```
|
||||
|
||||
### 聊天记录
|
||||
|
||||
适当增加一些聊天记录,可以联系上下文进行分类。
|
||||
|
||||
### 用户问题
|
||||
|
||||
用户输入的内容。
|
||||
|
||||
### 分类内容
|
||||
|
||||
依然以这 3 个分类为例,可以看到最终组成的 Function。其中返回值由系统随机生成,不需要关心。
|
||||
|
||||
1. 打招呼
|
||||
2. Laf 常见问题
|
||||
3. 其他问题
|
||||
|
||||
```js
|
||||
const agentFunction = {
|
||||
name: agentFunName,
|
||||
description: '判断用户问题的类型属于哪方面,返回对应的枚举字段',
|
||||
parameters: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
type: {
|
||||
type: 'string',
|
||||
description: `打招呼,返回: abc;Laf 常见问题,返回:vvv;其他问题,返回:aaa`
|
||||
enum: ["abc","vvv","aaa"]
|
||||
}
|
||||
},
|
||||
required: ['type']
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
上面的 Function 必然会返回 `type = abc,vvv,aaa` 其中一个值,从而实现分类判断。
|
32
docSite/content/docs/workflow/modules/reply.md
Normal file
32
docSite/content/docs/workflow/modules/reply.md
Normal file
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: "指定回复"
|
||||
description: "FastGPT 指定回复模块介绍"
|
||||
icon: "reply"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 429
|
||||
---
|
||||
|
||||
## 特点
|
||||
|
||||
- 可重复添加(防止复杂编排时线太乱,重复添加可以更美观)
|
||||
- 可手动输入
|
||||
- 可外部输入
|
||||
- 会输出结果给客户端
|
||||
|
||||
制定回复模块通常用户特殊状态回复,当然你也可以像图 2 一样,实现一些比较骚的操作~ 触发逻辑非常简单:
|
||||
|
||||
1. 一种是写好回复内容,通过触发器触发。
|
||||
2. 一种是不写回复内容,直接由外部输入触发,并回复输入的内容。
|
||||
|
||||
{{< figure
|
||||
src="/imgs/specialreply.png"
|
||||
alt=""
|
||||
caption="图 1"
|
||||
>}}
|
||||
|
||||
{{< figure
|
||||
src="/imgs/specialreply2.png"
|
||||
alt=""
|
||||
caption="图 2"
|
||||
>}}
|
24
docSite/content/docs/workflow/modules/trigger.md
Normal file
24
docSite/content/docs/workflow/modules/trigger.md
Normal file
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: "触发器"
|
||||
description: "FastGPT 触发器模块介绍"
|
||||
icon: "work_history"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 421
|
||||
---
|
||||
|
||||
细心的同学可以发现,在每个功能模块里都会有一个叫【触发器】的外部输入,并且是 any 类型。
|
||||
|
||||
它的**核心作用**就是控制模块的执行时机,以下图两个知识库搜索中的【AI 对话】模块为例子:
|
||||
|
||||
| 图 1 | 图 2 |
|
||||
| ---------------------------- | ---------------------------- |
|
||||
|  |  |
|
||||
|
||||
【知识库搜索】模块中,由于**引用内容**始终会有输出,会导致【AI 对话】模块的**引用内容**输入无论有没有搜到内容都会被赋值。如果此时不连接触发器(图 2),在搜索结束后必定会执行【AI 对话】模块。
|
||||
|
||||
有时候,你可能希望空搜索时候进行额外处理,例如:回复固定内容、调用其他提示词的 GPT、发送一个 HTTP 请求…… 此时就需要用到触发器,需要将 **搜索结果不为空** 和 **触发器** 连接起来。
|
||||
|
||||
当搜索结果为空时,【知识库搜索】模块不会输出 **搜索结果不为空** 的结果,因此 【AI 对话】 模块的触发器始终为空,便不会执行。
|
||||
|
||||
总之,记住模块执行的逻辑就可以灵活的使用触发器:**外部输入字段(有连接的才有效)全部被赋值时才会被执行**。
|
35
docSite/content/docs/workflow/modules/variable.md
Normal file
35
docSite/content/docs/workflow/modules/variable.md
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
title: "全局变量"
|
||||
description: "FastGPT 全局变量模块介绍"
|
||||
icon: "variables"
|
||||
draft: false
|
||||
toc: true
|
||||
weight: 422
|
||||
---
|
||||
|
||||
## 特点
|
||||
|
||||
- 仅可添加 1 个
|
||||
- 需要手动配置
|
||||
- 对其他模块有影响
|
||||
- 可作为用户引导
|
||||
|
||||
## 说明
|
||||
|
||||
可以在对话前设置一些问题,让用户输入或选择,并将用户输入/选择的结果注入到其他模块中。目前仅会注入到 string 类型的数据里(对应蓝色圆圈的输入)。
|
||||
|
||||
如下图,定义了两个变量:目标语言和下拉框测试(忽略)
|
||||
|
||||
用户在对话前会被要求先填写目标语言,配合用户引导,我们就构建了一个简单的翻译机器人。**目标语言**的 `key:language` 被写入到【AI 对话】模块的限定词里。
|
||||
|
||||

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

|
||||
|
||||
## 系统级变量
|
||||
|
||||
除了用户自定义设置的变量外,还会有一些系统变量:
|
||||
|
||||
+ **cTime**: 当前时间。例如:2023/3/3 20:22
|
Reference in New Issue
Block a user