当前位置: 首页 > news >正文

大模型笔记02--基于fastgpt和oneapi构建大模型应用平台

大模型笔记02--基于fastgpt和oneapi构建大模型应用平台

  • 介绍
  • 部署&测试
    • 部署fastgpt+oneapi服务
    • 部署向量模型m3e和nomic-embed-text
    • 测试大模型
  • 注意事项
  • 说明

介绍

随着大模型的快速发展,众多IT科技厂商都开发训练了各自的大模型,并提供了各具特色的AI产品。早期比较常见的做法是提供聊天机器人,如今逐步发展为各类AI智能体,用户可以在平台上选择自己需要能力构建特有的智能体。例如语聚AI,智谱清言,Fastgpt, coze, dify 等平台,它们都具备了较强的智能体定制能力。
如果想快速体验可以直接在平台上注册账号,按需使用即可。若想为自己的团队或者公司提供智能体,那么就可以基于开源产品搭建相关平台,或者二开。
本文基于开源的FastGPT, Ollama, Oneapi搭建一个基于LLM大语言模型的知识库问答平台, 实现知识管理和检索能力。

部署&测试

前提条件需要部署ollama,具体步骤可以参考文档 大模型笔记01–基于ollama和open-webui快速部署chatgpt。
其次需要部署FastGPT和Oneapi, 它们的主要用途如下:
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景。
Oneapi一个开源的OpenAI 接口管理 & 分发系统,它支持 Azure,Anthropic Claude,Google PaLM 2 & Gemini, Ollama、智谱 ChatGLM、百度文心一言、讯飞星火认知、阿里通义千问、360 智脑以及腾讯混元等大模型,可用于二次分发管理 key.

部署fastgpt+oneapi服务

fastgpt提供了基于docker compose的快速部署方式,此处直接使用docker compose来部署:

mkdir fastgpt
cd fastgpt
curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
# pgvector 版本(测试推荐,简单快捷)
curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-pgvector.yml
docker compose up -d
# milvus 版本
# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml
# zilliz 版本
# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml

服务正常拉起来后,可以通过docker compose ps 开到如下6个运行的容器:
在这里插入图片描述
通过 http://127.0.0.1:3000 访问fastgpt, 默认账号/密码: root / 1234
在这里插入图片描述
通过 http://127.0.0.1:3001/ 访问oneapi, 默认账号/密码: root / 123456
在这里插入图片描述
在oneapi中按需配置ollama渠道,使用Ollama自己部署模型的时候秘钥可以随意写,使用其它大模型厂商的话要按需填写提供的秘钥
在这里插入图片描述
渠道添加完成后记得测试一下,确保可以正常访问ollama
在这里插入图片描述
在fastgpt的confg.json中加上对应的模型,按需更改model和name字段,然后重启fastgpt服务即可
vim config.json

 "llmModels": [{"model": "gemma2:9b", // 模型名(对应OneAPI中渠道的模型名)"name": "ollama-gemma2-9b", // 模型别名"avatar": "/imgs/model/openai.svg", // 模型的logo"maxContext": 125000, // 最大上下文"maxResponse": 16000, // 最大回复"quoteMaxToken": 120000, // 最大引用内容"maxTemperature": 1.2, // 最大温度"charsPointsPrice": 0, // n积分/1k token(商业版)"censor": false, // 是否开启敏感校验(商业版)"vision": true, // 是否支持图片输入"datasetProcess": true, // 是否设置为知识库处理模型(QA),务必保证至少有一个为true,否则知识库会报错"usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true)"usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true)"usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true)"usedInQueryExtension": true, // 是否用于问题优化(务必保证至少有一个为true)"toolChoice": true, // 是否支持工具选择(分类,内容提取,工具调用会用到。目前只有gpt支持)"functionCall": false, // 是否支持函数调用(分类,内容提取,工具调用会用到。会优先使用 toolChoice,如果为false,则使用 functionCall,如果仍为 false,则使用提示词模式)"customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型"customExtractPrompt": "", // 自定义内容提取提示词"defaultSystemChatPrompt": "", // 对话默认携带的系统提示词"defaultConfig": {} // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)},{"model": "qwen2:7b", // 模型名(对应OneAPI中渠道的模型名)"name": "ollama-qwen2-7b", // 模型别名......"defaultConfig": {} // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)},{"model": "llama3.1:8b", // 模型名(对应OneAPI中渠道的模型名)"name": "ollama-llama3.1-8b", // 模型别名......}

docker restart fastgpt
在这里插入图片描述

部署向量模型m3e和nomic-embed-text

可以通过docker的形式部署m3e, 也可以通过ollama的形式部署

docker:
docker run -d --net=host --name m3e -p 6008:6008 --gpus all -e sk-key=111111admin  registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api
测试方法
$ curl --location --request POST 'http://0.0.0.0:6008/v1/embeddings' \
--header 'Authorization: Bearer 111111admin' \
--header 'Content-Type: application/json' \
--data-raw '{"model": "m3e","input": ["laf是什么"]
}'ollama:
ollama pull nomic-embed-text:v1.5 
ollama pull milkey/m3e:large-f16
测试方法
curl http://localhost:11434/api/embeddings -d '{"model": "nomic-embed-text:v1.5","prompt": "The sky is blue because of Rayleigh scattering"
}'

m3e-large-api测试输出:
在这里插入图片描述
nomic-embed-text:v1.5 测试输出:
在这里插入图片描述
测试成功后在oneapi中配置上述向量模型。
若使用m3e,其代理填写 http://192.xx.xx.1:6008(按需填写实际m3e服务的ip和端口),秘钥填写上述sk-key对应的内容;
若通过ollama访问向量模型,其代理需要配置为 http://192.x.x.1:11435(前面ip根据实际填写即可,此处使用代理的端口11435),ollama默认使用/api/embeddings提供向量访问,因此我们需要使用代理将/v1/embeddings转发到该接口,具体配置见 注意事项->问题4中的 /etc/nginx/conf.d/ollama.conf ;
配置完成后需要测试可用性, 然后在 config.json 中加上自己的向量模型,具体配置如下:
vim config.json

  "vectorModels": [{"model": "nomic-embed-text:v1.5", // 模型名(与OneAPI对应)"name": "nomic-embed-text-v1.5", // 模型展示名"avatar": "/imgs/model/openai.svg", // logo"charsPointsPrice": 0, // n积分/1k token"defaultToken": 500, // 默认文本分割时候的 token"maxToken": 2000, // 最大 token"weight": 100, // 优先训练权重"defaultConfig": {}, // 自定义额外参数。例如,如果希望使用 embedding3-large 的话,可以传入 dimensions:1024,来返回1024维度的向量。(目前必须小于1536维度)"dbConfig": {}, // 存储时的额外参数(非对称向量模型时候需要用到)"queryConfig": {} // 参训时的额外参数},{"model": "text-embedding-3-small","name": "text-embedding-3-small","avatar": "/imgs/model/openai.svg","charsPointsPrice": 0,"defaultToken": 512,"maxToken": 3000,"weight": 100},{"model": "m3e","name": "m3e","avatar": "/imgs/model/openai.svg","charsPointsPrice": 0,"defaultToken": 512,"maxToken": 3000,"weight": 100}]

测试大模型

  1. 新建数据集
    如下图,我们直接新建数据集 nomic-embed-text-v1.5 ,使用nomic-embed-text:v1.5 和 qwen2:7b 两个模型。
    在这里插入图片描述
    在skills目录提前准备好的文档,并按照步骤导入,数据导入到Ready需要大模型发一些时间处理(GPU一般的话就比较慢,笔者P2200 5G显存就有点慢),耐心等待处理完成即可
    在这里插入图片描述
  2. 新建大模型应用
    参考官方文档在工作台新建一个大模型应用,此处新建agent-qwen2-7b,使用qwen2-7b大模型,关联上知识库 nomic-embed-text-v1.5(搜索模式使用混合检索), 配置完成后测试一下结果,可以发现它有从5个目标参考文档中检索知识,结合检索的目标知识回答我们的问题。
    在这里插入图片描述
    测试完成,点击发布,发布成功后可以直接通过聊天界面进入到agent-qwen2-7b应用了,如下图:
    在这里插入图片描述
    至此,一个具备知识库能力的智能体应用已经完成了; 若需要让其更加智能,我们可以按需补充合适的文档和提示词,让其按照我们的方式检索、回答问题。

注意事项

  1. ollama需要配置 OLLAMA_HOST=0.0.0.0 , 否则oneapi容器无法正常访问ollama服务。

  2. 配置渠道的时候最好每个渠道配置唯一的一个模型,这样使用的时候容易区分。

  3. 新增知识库导入数据时候报错"当前分组 default 下对于模型 text-embedding-ada-002 无可用渠道"
    在这里插入图片描述
    如果有openai的token的话可以在oneapi配置text-embedding-ada-002这个渠道,没有的话自行部署向量模型,并在oneapi新建对应的渠道,新建知识库的时使用自己新建的渠道即可。
    当前分组 default 下对于模型 text-embedding-ada-002 无可用渠道

  4. 在使用知识库的时候,发现数据一直处于索引中,机器CPU长期处于高负荷状态
    在这里插入图片描述
    发现fastgpt报错503, upstream_error, 如下图所示:
    在这里插入图片描述
    oneapi报错:
    在这里插入图片描述
    因为 ollama向量接口为 /api/embeddings, 而fastgpt调用onepai默认接口为/v1/embeddings, 因此会报错,此时可以在本地通过nginx代理ollama,将oneapi的/v1/embeddings转发到ollama的 /api/embeddings中。
    代理配置如下:

    vim /etc/nginx/conf.d/ollama.conf
    server {listen 11435;server_name ollama-server;location / {proxy_pass http://127.0.0.1:11434;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}location /v1/embeddings {rewrite ^/v1/embeddings$ /api/embeddings break;}location /api/embeddings {proxy_pass http://127.0.0.1:11434;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
    }
    

    转发成功后可以看到nginx日志请求正常:
    在这里插入图片描述
    oneapi中/v1/embeddings接口也恢复正常:
    在这里插入图片描述
    过一段时间后数据集准备就绪,节点CPU慢慢降下来恢复正常
    在这里插入图片描述
    ollama向量模型知识库上传数据一直卡在索引,docker日志报404 中提到配置host.docker.internal, 笔者测试过几次不行,最后通过nginx代理解决该问题。

  5. fastgpt 通过oneapi调用ollama qwen2:2b报错 error unmarshalling stream response

    fastgpt提示:
    LLM api response empty
    oneapi报错:
    [SYS] 2024/09/08 - 11:18:57 | error unmarshalling stream response: invalid character '}' after top-level value 
    解决方法:
    将渠道设置为自定义,暂时不用配置为ollama, 调整后重启oneapi就没有继续报错了
    参考 [ollama部署qwen2:7b api调用报错](https://github.com/songquanpeng/one-api/issues/1646)
    

说明

软件:
ubuntu2404 Desktop
oneapi v0.6.8
fastgpt v4.8.10
ollama 0.3.6
参考文档:
fastgpt官方文档
one-api github
ollama + fastgpt搭建本地私有AI大模型智能体工作流(AI Agent Flow)-- windows环境
Fastgpt配合chatglm+m3e或ollama+m3e搭建个人知识库
大模型必备 - 中文最佳向量模型 acge_text_embedding
Ollama 中文文档
奔跑的蜗牛-人工智能案例合集

相关文章:

大模型笔记02--基于fastgpt和oneapi构建大模型应用平台

大模型笔记02--基于fastgpt和oneapi构建大模型应用平台 介绍部署&测试部署fastgptoneapi服务部署向量模型m3e和nomic-embed-text测试大模型 注意事项说明 介绍 随着大模型的快速发展,众多IT科技厂商都开发训练了各自的大模型,并提供了各具特色的AI产…...

linux-用户与权限管理-组管理

在 Linux 系统中,用户、组与权限管理是保障系统安全的重要机制。用户和组的管理不仅涉及对系统资源的访问控制,还用于权限的分配和共享。组管理在 Linux 中尤其重要,它能够帮助管理员组织用户并为不同的组分配特定权限,从而控制用…...

Day23_0.1基础学习MATLAB学习小技巧总结(23)——句柄图形

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。 参考书目:《MATLAB基础教程 (第三版) (薛山)》 之前的章节都是…...

同步io和异步io

同步 I/O 和异步 I/O 是处理输入输出操作的两种不同策略,它们各有优缺点,适用于不同的场景。下面是它们的主要区别: 同步 I/O 定义:在同步 I/O 模型中,发起 I/O 操作的线程会被阻塞,直到操作完成。换句话说…...

AI基础 L19 Quantifying Uncertainty and Reasoning with Probabilities I 量化不确定性和概率推理

Acting Under Uncertainty 1 Reasoning Under Uncertainty • Real world problems contain uncertainties due to: — partial observability, — nondeterminism, or — adversaries. • Example of dental diagnosis using propositional logic T oothache ⇒ C av ity • H…...

C++ 关于时间的轮子

时间字符串转chrono::system_clock std::chrono::system_clock::time_point parse_date(const std::string& date_str) {std::tm tm {};std::istringstream ss(date_str);ss >> std::get_time(&tm, "%Y-%m-%d"); // 假设日期字符串格式为YYYY-MM-DDr…...

阿里达摩院:FunASR - onnxruntime 部署

阿里达摩院:FunASR - onnxruntime 部署 git clone https://github.com/alibaba/FunASR.git 切换到 onnxruntime cd FunASR/runtime/onnxruntime1下载 onnxruntime wget https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/dep_libs/onnxruntime-linux-x64-1.14.0.t…...

SpringMvc注解

SpringMvc注解 1 SpringMcv基础环境搭建 注&#xff1a;如果已经有SpringMvc项目直接跳过这个就可以了 1 新建项目 2.修改文件为packaging 为war包 <packaging>war</packaging> <?xml version"1.0" encoding"UTF-8"?> <pr…...

队列的基本概念及顺序实现

队列的基本概念 队列的定义 ​ 队列(Queue)简称队&#xff0c;也是一宗操作受限的线性表&#xff0c;只允许在表的一段进行插入&#xff0c;而在表的另一端进行删除。向队列中插入元素成为入队或进队&#xff1b;删除元素成为出队或离队。 ​ 特性&#xff1a;先进先出 (Fir…...

Leetcode 最长连续序列

算法流程&#xff1a; 哈希集合去重&#xff1a; 通过将数组中的所有元素放入 unordered_set&#xff0c;自动去除重复元素。集合的查找操作是 O(1)&#xff0c;这为后续的快速查找提供了保证。 遍历数组&#xff1a; 遍历数组中的每一个元素。对于每个元素&#xff0c;首先检…...

linux网络编程——UDP编程

写在前边 本文是B站up主韦东山的4_8-3.UDP编程示例_哔哩哔哩_bilibili视频的笔记&#xff0c;其中有些部分博主也没有理解&#xff0c;希望各位辩证的看。 UDP协议简介 UDP 是一个简单的面向数据报的运输层协议&#xff0c;在网络中用于处理数据包&#xff0c;是一种无连接的…...

第四部分:1---文件内核对象,文件描述符,输出重定向

目录 struct file内核对象&#xff1a; 如何读写文件&#xff1f; 文件描述符在文件描述符表中的分配规则&#xff1a; 输出重定向初步解析&#xff1a; dup2实现复制文件描述符&#xff1a; struct file内核对象&#xff1a; struct file 是在内核空间中创建的用于描述文…...

如何在开发与生产环境中应用 Flask 进行数据库管理:以 SQLAlchemy 和 Flask-Migrate 为例

在使用 Flask 进行开发时&#xff0c;数据库管理是一个至关重要的环节。借助 SQLAlchemy 作为 ORM&#xff08;对象关系映射&#xff09;工具和 Flask-Migrate 进行数据库迁移&#xff0c;开发者可以高效地进行数据库管理&#xff0c;并在不同的环境&#xff08;如开发环境和生…...

【Java零基础】Java核心知识点之:Map

HashMap(数组链表红黑树) HashMap 根据键的 hashCode 值存储数据&#xff0c;大多数情况下可以直接定位到它的值&#xff0c;因而具有很快的访问速度&#xff0c;但遍历顺序却是不确定的。 HashMap 最多只允许一条记录的键为 null&#xff0c;允许多条记录的值为 null。HashMa…...

9.12日常记录

1.extern关键字 1&#xff09;诞生动机:在一个C语言项目中&#xff0c;需要再多个文件中使用同一全局变量或是函数&#xff0c;那么就需要在这些文件中再声明一遍 2&#xff09;用于声明在其他地方定义的一个变量或是函数&#xff0c;在当前位置只是声明&#xff0c;告诉编译器…...

光纤的两种模式

光纤主要分为两种模式&#xff1a;‌‌单模光纤&#xff08;Single-Mode Fiber, SMF&#xff09;‌和‌‌多模光纤&#xff08;Multi-Mode Fiber, MMF&#xff09;‌。这两种光纤在传输特性、应用场景以及传输距离上存在显著差异。‌12 单模光纤 ‌定义‌&#xff1a;单模光纤…...

SpringMVC的初理解

1. SpringMVC是对表述层&#xff08;Controller&#xff09;解决方案 主要是 1.简化前端参数接收( 形参列表 ) 2.简化后端数据响应(返回值) 1.数据的接受 1.路径的匹配 使用RequestMapping(可以在类上或在方法上)&#xff0c;支持模糊查询&#xff0c;在内部有method附带…...

Python 基本库用法:数学建模

文章目录 前言数据预处理——sklearn.preprocessing数据标准化数据归一化另一种数据预处理数据二值化异常值处理 numpy 相关用法跳过 nan 值的方法——nansum和nanmean展开多维数组&#xff08;变成类似list列表的形状&#xff09;重复一个数组——np.tile 分组聚集——pandas.…...

Android Greendao的数据库复制到设备指定位置

方法如下&#xff1a; private void export() {// 确保您已经请求并获得了WRITE_EXTERNAL_STORAGE权限// 获取要储存的设备路径String picturesDirPath Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();// 在公共目录下创建…...

Ajax 揭秘:异步 Web 交互的艺术

Ajax 揭秘&#xff1a;异步 Web 交互的艺术 一 . Ajax 的概述1.1 什么是 Ajax ?1.2 同步和异步的区别1.3 Ajax 的应用场景1.3.1 注册表单的用户名异步校验1.3.2 内容自动补全 二 . Ajax 的交互模型和传统交互模型的区别三 . Ajax 异步请求 axios3.1 axios 介绍3.1.1 使用步骤3…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...