我用FastGPT复刻了官方DeepSeek+联网~
手把手教你复刻官方DeepSeek:FastGPT本地部署与联网实战
上周有朋友留言,说对比了一圈各家提供的DeepSeek服务,还是觉得官方原版用起来最顺手。这个问题其实挺有意思——官方到底做了什么优化,让体验感明显优于其他渠道?
有意思的是,就在昨天DeepSeek正式公布了R1的官方提示词和使用方法。看下来你会发现,官方其实并没有什么神秘的“黑科技”,整个调用逻辑非常朴素。更妙的是,这套逻辑完全可以在本地复现。
最近用
FastGPT
火山引擎的DeepSeek API
响应速度快、运行极其稳定
这套组合拳——
DeepSeek + FastGPT
先说下
FastGPT
开源
知识库问答
教程分为几个关键步骤:
1. 本地部署FastGPT
2. 获取火山引擎DeepSeek R1的API Key和模型ID(目前有50万tokens免费额度)
3. 将DeepSeek R1接入FastGPT
4. 通过FastGPT工作流,复刻官方的DeepSeek R1+联网功能
一、本地部署FastGPT
先说部署这件事。还是老规矩,
部署FastGPT之前要先安装Docker
Docker的安装教程网上已铺天盖地,这里不再重复。下面以Windows为例,Linux和Mac的操作思路完全一致。
接下来用
FastGPT官方提供的docker-compose.yml文件
第一步:随便找个文件夹,新建一个空白.txt文件。
第二步:把下面的docker-compose.yml内容完整复制进去,保存。
# 数据库的默认账号和密码仅首次运行时设置有效
# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包)
version: '3.3'
services:
# db
pg:
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.7.0 # 阿里云
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: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
container_name: mongo
restart: always
ports:
- 27017:27017
networks:
- fastgpt
command: mongod --keyFile /data/mongodb.key --replSet rs0
environment:
- MONGO_INITDB_ROOT_USERNAME=myusername
- MONGO_INITDB_ROOT_PASSWORD=mypassword
volumes:
- ./mongo/data:/data/db
entrypoint:
- bash
- -c
- |
openssl rand -base64 128 > /data/mongodb.key
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
echo 'const isInited = rs.status().ok === 1
if(!isInited){
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo:27017" }
]
})
}' > /data/initReplicaSet.js
# 启动MongoDB服务
exec docker-entrypoint.sh "$$@" &
# 等待MongoDB服务启动
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
echo "Waiting for MongoDB to start..."
sleep 2
done
# 执行初始化副本集的脚本
mongo -u myusername -p mypassword --authenticationDatabase admin /data/initReplicaSet.js
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
wait $$!
# fastgpt
sandbox:
container_name: sandbox
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.21-fix # 阿里云
networks:
- fastgpt
restart: always
fastgpt:
container_name: fastgpt
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.21-fix # 阿里云
ports:
- 3000:3000
networks:
- fastgpt
depends_on:
- mongo
- pg
- sandbox
restart: always
environment:
# 前端访问地址: http://localhost:3000
- FE_DOMAIN=
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
- DEFAULT_ROOT_PSW=1234
# AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
- OPENAI_BASE_URL=http://oneapi:3000/v1
# AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
- CHAT_API_KEY=sk-fastgpt
# 数据库最大连接数
- DB_MAX_LINK=30
# 登录凭证密钥
- TOKEN_KEY=any
# root的密钥,常用于升级时候的初始化请求
- ROOT_KEY=root_key
# 文件阅读加密
- FILE_TOKEN_KEY=filetoken
# MongoDB 连接参数. 用户名myusername,密码mypassword。
- MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
# pg 连接参数
- PG_URL=postgresql://username:password@pg:5432/postgres
# sandbox 地址
- SANDBOX_URL=http://sandbox:3000
# 日志等级: debug, info, warn, error
- LOG_LEVEL=info
- STORE_LOG_LEVEL=warn
# 工作流最大运行次数
- WORKFLOW_MAX_RUN_TIMES=1000
# 批量执行节点,最大输入长度
- WORKFLOW_MAX_LOOP_TIMES=100
# 自定义跨域,不配置时,默认都允许跨域(多个域名通过逗号分割)
- ALLOWED_ORIGINS=
# 是否开启IP限制,默认不开启
- USE_IP_LIMIT=false
volumes:
- ./config.json:/app/data/config.json
# oneapi
mysql:
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mysql:8.0.36 # 阿里云
container_name: mysql
restart: always
ports:
- 3306:3306
networks:
- fastgpt
command: --default-authentication-plugin=mysql_native_password
environment:
# 默认root密码,仅首次运行有效
MYSQL_ROOT_PASSWORD: oneapimmysql
MYSQL_DATABASE: oneapi
volumes:
- ./mysql:/var/lib/mysql
oneapi:
container_name: oneapi
image: ghcr.io/songquanpeng/one-api:v0.6.10
ports:
- 3001:3000
depends_on:
- mysql
networks:
- fastgpt
restart: always
environment:
# mysql 连接参数
- SQL_DSN=root:oneapimmysql@tcp(mysql:3306)/oneapi
# 登录凭证加密密钥
- SESSION_SECRET=oneapikey
# 内存缓存
- MEMORY_CACHE_ENABLED=true
# 启动聚合更新,减少数据交互频率
- BATCH_UPDATE_ENABLED=true
# 聚合更新时长
- BATCH_UPDATE_INTERVAL=10
# 初始化的 root 密钥(建议部署完后更改,否则容易泄露)
- INITIAL_ROOT_TOKEN=fastgpt
volumes:
- ./oneapi:/data
networks:
fastgpt:
然后将文件名从.txt改为
docker-compose.yml
接下来还需要一个配置文件
config.json
// 已使用 json5 进行解析,会自动去掉注释,无需手动去除
{
"feConfigs": {
"lafEnv": "https://laf.dev" // laf环境。https://laf.run (杭州阿里云) ,或者私有化的laf环境。如果使用 Laf openapi 功能,需要最新版的 laf 。
},
"systemEnv": {
"vectorMaxProcess": 15, // 向量处理线程数量
"qaMaxProcess": 15, // 问答拆分线程数量
"tokenWorkers": 50, // Token 计算线程保持数,会持续占用内存,不能设置太大。
"pgHNSWEfSearch": 100 // 向量搜索参数。越大,搜索越精确,但是速度越慢。设置为100,有99%+精度。
}
}
在当前文件夹的地址栏里输入
cmd
docker-compose up -d
等终端输出一堆“started”字样,就说明启动成功了。可以用
docker ps
整个服务栈中,主要关注
fastgpt
one-api
访问地址:
FastGPT页面:
http://127.0.0.1:3000/
root
1234
one-api页面:
http://127.0.0.1:3001/
root
123456
这里多说一句:
one-api是什么?
二、将满血版DeepSeek接入FastGPT
如何把DeepSeek接到FastGPT里?答案是通过
DeepSeek API
字节跳动旗下的火山引擎响应速度最快
50万tokens
先到火山引擎后台,获取R1和V3模型的ID以及API Key。具体获取步骤可以参考社区文章《火山引擎V3、R1 API》,介绍得比较详细。
拿到模型ID和API Key之后,接下来去
one-api
在one-api后台,选择
添加新的渠道
模型重定向JSON:
{
"deepseek-chat": "v3的模型id",
"deepseek-reasoner": "r1的模型id"
}
填好API Key后提交保存,然后点击测试——右上角弹出“保存成功”的提示,就说明配置生效了。
接着回到
FastGPT
deepseek-chat(V3)
deepseek-reasoner(R1)
搭建一个简易工作流,基本就能复刻出DeepSeek官方的R1+联网搜索效果。
工作流的逻辑非常清晰:首先是一个
问题分类节点
如果是联网类问题,走下半部分流程——先通过DuckDuckGo搜索用户问题,然后将搜索结果发给R1节点,并附上官方推荐的联网搜索提示词:
search_answer_zh_template =
'''# 以下内容是基于用户发送的消息的搜索结果:
{search_results}
在我给你的搜索结果中,每个结果都是[webpage X begin]...[webpage X end]格式的,X代表每篇文章的数字索引。请在适当的情况下在句子末尾引用上下文。请按照引用编号[citation:X]的格式在答案中对应部分引用上下文。如果一句话源自多个上下文,请列出所有相关的引用编号,例如[citation:3][citation:5],切记不要将引用集中在最后返回引用编号,而是在答案对应部分列出。
在回答时,请注意以下几点:
- 今天是{cur_date}。
- 并非搜索结果的所有内容都与用户的问题密切相关,你需要结合问题,对搜索结果进行甄别、筛选。
- 对于列举类的问题(如列举所有航班信息),尽量将答案控制在10个要点以内,并告诉用户可以查看搜索来源、获得完整信息。优先提供信息完整、最相关的列举项;如非必要,不要主动告诉用户搜索结果未提供的内容。
- 对于创作类的问题(如写论文),请务必在正文的段落中引用对应的参考编号,例如[citation:3][citation:5],不能只在文章末尾引用。你需要解读并概括用户的题目要求,选择合适的格式,充分利用搜索结果并抽取重要信息,生成符合用户要求、极具思想深度、富有创造力与专业性的答案。你的创作篇幅需要尽可能延长,对于每一个要点的论述要推测用户的意图,给出尽可能多角度的回答要点,且务必信息量大、论述详尽。
- 如果回答很长,请尽量结构化、分段落总结。如果需要分点作答,尽量控制在5个点以内,并合并相关的内容。
- 对于客观类的问答,如果问题的答案非常简短,可以适当补充一到两句相关信息,以丰富内容。
- 你需要根据用户要求和回答内容选择合适、美观的回答格式,确保可读性强。
- 你的回答应该综合多个相关网页来回答,不能重复引用一个网页。
- 除非用户要求,否则你回答的语言需要和用户提问的语言保持一致。
# 用户消息为:
{question}'''
如果是其他类型的问题(不需要联网),则走上半部分流程——不带任何系统提示词,直接调用R1。
有个细节需要注意:根据官方资料,
R1的温度值最好设置为0.6
当然,必须承认的是,这里用的DuckDuckGo是免费搜索引擎,搜索结果的质量和丰富度无法和DeepSeek官方的搜索引擎相比,也无法直接溯源到搜索页面。但从实际体验来看,
速度真的是快
最后,如果你是在云服务器上部署的,还可以方便地一键分享给朋友使用——复制访问链接发过去即可。如果是本地部署,也可以分享给局域网内的同事。如果需要外网访问,通过内网穿透工具(比如贝锐花生壳)也能轻松搞定,篇幅原因这里就不展开了。
希望这套教程能帮你快速上手。事实上FastGPT的玩法远不止于此——知识库、工作流、多模型路由……认真研究,能玩出的花样远超你的想象。大模型API是AI时代绕不开的基本功,真心建议动手实践一遍。纸上得来终觉浅,绝知此事要躬行。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名