开发个人Go-ChatGPT--5 模型管理 (二)

开发个人Go-ChatGPT–5 模型管理 (二)

ChatGPT

这是该项目的最终效果,使用ollamaopen-webui进行人与机器的对话功能,对话的后端服务则完全对接自己开发的Go项目。
chatgpt
如何实现呢?则通过这篇文章,一一给大家剖析后端的原理及功能实现。

ollama-go

请添加图片描述

根据上图结果,生成的stream响应,就可与open-webUI进行对话,实现ChatGPT的功能效果。

正片开始

文件目录:

├── chat
│   ├── api
│   │   ├── chat.api
│   │   ├── chat.go
│   │   ├── etc
│   │   │   └── chat.yaml
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── internal
│   │   │   ├── config
│   │   │   ├── handler
│   │   │   ├── logic
│   │   │   ├── svc
│   │   │   └── types
│   │   ├── logs
│   │   │   ├── access.log
│   │   │   ├── error.log
│   │   │   ├── severe.log
│   │   │   ├── slow.log
│   │   │   └── stat.log
│   │   └── web
│   │       └── static
│   └── rpc
│       ├── chat
│       │   ├── chat_grpc.pb.go
│       │   └── chat.pb.go
│       ├── chatclient
│       │   └── chat.go
│       ├── chat.go
│       ├── chat.proto
│       ├── etc
│       │   └── chat.yaml
│       ├── go.mod
│       ├── go.sum
│       ├── internal
│       │   ├── config
│       │   ├── logic
│       │   ├── server
│       │   └── svc
│       └── logs
│           ├── access.log
│           ├── error.log
│           ├── severe.log
│           ├── slow.log
│           └── stat.log

5.1 生成 chat model 模型

  • 创建 chat.sql,生成chat相关数据表。字段不可缺少任意一个,否则open-webui无法正常展示

    CREATE TABLE `chat` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`user_id` varchar(255)  NOT NULL DEFAULT '' COMMENT '用户ID',`title` varchar(255)  NOT NULL DEFAULT '' COMMENT '标题',`chat` longtext  NOT NULL COMMENT '',`archived` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '',`share_id` varchar(255)  NOT NULL DEFAULT '' COMMENT '分享用户ID',`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;
    
  • 创建prompt.sql,生成prompt相关数据表。字段不可缺少任意一个,否则open-webui无法正常展示

    drop table if exists prompt;
    CREATE TABLE `prompt` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`command` varchar(255)  NOT NULL DEFAULT '' COMMENT '命令',`user_id` varchar(255)  NOT NULL DEFAULT '' COMMENT '用户ID',`title` varchar(255)  NOT NULL DEFAULT '' COMMENT '标题',`content` longtext  NOT NULL COMMENT '文本',`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`),UNIQUE KEY `command` (`command`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;
    
  • 运行模板生成命令 model文件放置在通用目录,和go-zero官方案例不同

    # chat model
    goctl model mysql ddl -src ./model/chat.sql -dir ./model -c# prompt model
    goctl model mysql ddl -src ./model/prompt.sql -dir ./model -c
    

5.2 生成 chat api 服务

前缀,路由,传参,响应不可变,否则 openui调用失败

  • 创建 chat.api 文件

    type (// 产品创建CreateRequest {UserId   string `json:"userId"`Title    string `json:"title"`Chat     string `json:"chat"`ShareId  string `json:"shareId"`Archived int64  `json:"archived"`}CreateResponse {Id int64 `json:"id"`}// 产品创建// 产品修改UpdateRequest {Chat string `json:"chat"`}UpdateResponse  {}// 产品修改// 产品删除RemoveRequest {Id int64 `json:"id, optional"`}RemoveResponse  {}// 产品删除// 产品详情DetailRequest {Id int64 `json:"id, optional"`}DetailResponse {Id       int64  `json:"id"`UserId   string `json:"userId"`Title    string `json:"title"`Chat     string `json:"chat"`ShareId  string `json:"shareId"`Archived int64  `json:"archived"`}// 产品详情ListRequest  {}// 数组 产品详情ListResponse {Data []DetailResponse `json:"data"`}VersionResponse {Version string `json:"version"`}ChangelogResponse {Changelog string `json:"changelog"`}ConfigResponse {Status                   bool                       `json:"status"`Name                     string                     `json:"name"`Version                  string                     `json:"version"`DefaultLocale            string                     `json:"default_locale"`Images                   bool                       `json:"images"`DefaultModels            interface{}                `json:"default_models"`DefaultPromptSuggestions []DefaultPromptSuggestions `json:"default_prompt_suggestions"`TrustedHeaderAuth        bool                       `json:"trusted_header_auth"`}DefaultPromptSuggestions {Title   []string `json:"title"`Content string   `json:"content"`}ModelReponse {Models []ModelDetail `json:"models"`}ModelDetail {Id         string  `json:"id"`Name       string  `json:"name"`Model      string  `json:"model"`ModifiedAt string  `json:"modified_at"`Size       int64   `json:"size"`Digest     string  `json:"digest"`Details    Details `json:"details"`}Details {Format            string      `json:"format"`Family            string      `json:"family"`Families          interface{} `json:"families"`ParameterSize     string      `json:"parameter_size"`QuantizationLevel string      `json:"quantization_level"`}Prompt {Id      int64  `json:"id"`Command string `json:"command"`UserId  string `json:"user_id"`Title   string `json:"title"`Content string `json:"content"`}PromptResponse {Prompts []Prompt `json:"prompts"`}DefaultModels {Models string `json:"models"`}Chat {ID        string `json:"id"`Title     string `json:"title"`UpdatedAt int    `json:"updated_at"`CreatedAt int    `json:"created_at"`}ChatMessage {Chats Chat `json:"chats"`}NewChatRequest {Chat ChatEntity `json:"chat"`}ChatEntity {Id        string                   `json:"id"`Title     string                   `json:"title"`Models    []string                 `json:"models"`Options   map[string]interface{}   `json:"options,optional"`Messages  []map[string]interface{} `json:"messages,optional"`History   map[string]interface{}   `json:"history,optional"`Tags      []map[string]interface{} `json:"tags,optional"`Timestamp int64                    `json:"timestamp"`}// new chatNewChatEntity {Model    string           `json:"model"`Messages []MessagesEntity `json:"messages"`Options  OptionsEntity    `json:"options"`}MessagesEntity {Role    string `json:"role"`Content string `json:"content"`}OptionsEntity  {}ChatRespone {Text string `json:"text"`}UpdateChatRequest {Chat UpdateChat `json:"chat"`}UpdateChat {Messages []UpdateMessages `json:"messages, optional"`History  UpdateHistory    `json:"history, optional"`}UpdateMessages {Id          string   `json:"id"`ChildrenIds []string `json:"childrenIds"`Role        string   `json:"role"`Content     string   `json:"content"`Timestamp   int64    `json:"timestamp"`}UpdateHistory {Messages  map[string]interface{} `json:"messages"`CurrentId string                 `json:"currentId"`}CompleteRequest {Model    string           `json:"model"`Messages []MessagesEntity `json:"messages"`Stream   bool             `json:"stream"`}
    )@server (jwt: Auth
    )
    service Chat {@handler Versionget /ollama/api/version returns (VersionResponse)@handler OllTagsget /ollama/api/tags returns (ModelReponse)@handler Chatpost /ollama/api/chat (NewChatEntity) returns (ChatRespone)@handler Completepost /ollama/v1/chat/completions (CompleteRequest) returns (ChatRespone)
    }service Chat {@handler Changelogget /api/changelog returns (ChangelogResponse)@handler Configget /api/config returns (ConfigResponse)
    }@server (jwt:    Authprefix: /api/v1
    )
    service Chat {@handler GetPromptget /prompts returns (PromptResponse)@handler GetDefaultModelspost /configs/default/models (DefaultModels) returns (DefaultModels)
    }@server (jwt:    Authprefix: /api/v1
    )
    service Chat {@handler Createpost /chats/new (NewChatRequest) returns (CreateResponse)@handler Updatepost /chats/:id (UpdateChatRequest) returns (UpdateResponse)@handler Removedelete /chats/:id (RemoveRequest) returns (RemoveResponse)@handler Listget /chats (ListRequest) returns ([]Chat)@handler Detailget /chats/:id (DetailRequest) returns (DetailResponse)
    }
  • 运行模板生成命令

    goctl api go -api ./api/chat.api -dir ./api
    

5.3 生成 user rpc 服务

  • 创建 chat.proto文件

    syntax = "proto3";package chat;option go_package = "./chat";message Empty {
    }
    // 产品创建
    message CreateRequest {string UserId = 1;string Title = 2;string Chat = 3;string ShareId = 4;int64 Archived = 5;
    }
    message CreateResponse {int64 Id = 1;
    }
    // 产品创建// 产品修改
    message UpdateRequest {int64 Id = 1;string UserId = 2;string Title = 3;string Chat = 4;string ShareId = 5;int64 Archived = 6;
    }
    message UpdateResponse {
    }
    // 产品修改// 产品删除
    message RemoveRequest {int64 Id = 1;
    }
    message RemoveResponse {
    }
    // 产品删除// 产品详情
    message DetailRequest {int64 Id = 1;
    }
    message DetailResponse {int64 Id = 1;string UserId = 2;string Title = 3;string Chat = 4;string ShareId = 5;int64 Archived = 6;
    }
    // 产品详情message ListChats {repeated DetailResponse List = 1;
    }// 调用ollama 大模型
    message CallRequest {string Name = 1;string Prompt = 2;string Role = 3;
    }message CallResponse {string Text = 1;
    }message Prompt {int64 Id = 1;string Command = 2;string Title = 3;string UserId = 4;string Content = 5;
    }message ListPrompts{repeated Prompt List = 1;
    }message NewChatEntity {string Model = 1;repeated MessagesEntity Messages = 2;OptionsEntity Options = 3;
    }message MessagesEntity {string Role = 1;string Content = 2;
    }message OptionsEntity {}service Chat {rpc Create(CreateRequest) returns(CreateResponse);rpc Update(UpdateRequest) returns(UpdateResponse);rpc Remove(RemoveRequest) returns(RemoveResponse);rpc Detail(DetailRequest) returns(DetailResponse);rpc ListChat(Empty) returns(ListChats);rpc ListPrompt(Empty) returns(ListPrompts);rpc Call(CallRequest) returns(CallResponse);rpc GenPrompt(NewChatEntity) returns(CallResponse);
    }
    
  • 运行模板生成命令

    goctl rpc protoc ./rpc/chat.proto --go_out=./rpc/types --go-grpc_out=./rpc/types --zrpc_out=./rpc
    

5.4 配置文件

  • rpc/etc

    Name: chat.rpc
    ListenOn: 0.0.0.0:9002Etcd:Hosts:- ******:2379Key: chat.rpcTimeout: 0Mysql:Host: ******Port: 3309DbName: openuiUser: rootPassword: "**********"DBZone: "TS"Charset: utf8mb4MaxIdle: 10MaxOpen: 100LogMode: trueLoc: Asia/ShanghaiDebug: trueTablePrefix: "v1_"MaxLifetime: 300CacheRedis:Name: "openui"Nettype: "tcp"Address: "******:6379"Auth: ""DB: 0Salt: ******#日志配置
    LogConf:ServiceName: chat.rpcMode: fileTimeFormat: 2006-01-02 15:04:05.000Path: logsLevel: infoCompress: trueStat: false # 不记录CPU、内存等信息KeepDays: 10MaxBackups: 2
    
  • api/etc

    Name: Chat
    Host: 0.0.0.0
    Port: 8082Mysql:Host: **********Port: 3309DbName: openuiUser: rootPassword: "**********"DBZone: "TS"Charset: utf8mb4MaxIdle: 10MaxOpen: 100LogMode: trueLoc: Asia/ShanghaiDebug: trueTablePrefix: "v1_"MaxLifetime: 300Timeout: 0CacheRedis:Name: "openui"Nettype: "tcp"Address: "**********:6379"Auth: ""DB: 0Auth:AccessSecret: **********AccessExpire: 86400#日志配置
    LogConf:ServiceName: chat.apiMode: fileTimeFormat: 2006-01-02 15:04:05.000Path: logsLevel: infoCompress: trueStat: false # 不记录CPU、内存等信息KeepDays: 10MaxBackups: 2ChatRpc:Etcd:Hosts:- **********:2379Key: chat.rpcOllUrl: http://**********:11434
    

5.5 业务处理

  • 业务处理就不过多描述了,具体处理流程可以看相应文件的实现

项目地址

jackwillsmith/openui-svelte-build (github.com)

GitHub - jackwillsmith/openui-backend-go: openui-backend-go

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类与对像(1)

好几个月没有写了,差了好多,这些天补回来吧。 接下来,让我们正式步入C与C语言开始不同的地方。 我对类的理解:类是对于具有相同或相似属性的数据集合。 类的关键词:class,public,protected&a…

自己训练 PaddleOCR

打标工具 https://github.com/Evezerest/PPOCRLabel 感谢这位热心网友提供的标注工具,操作非常的方便 数据准备 类似的如下,程序已经帮你自动抠图了 小坑。。。 只是这个工具有个小坑get_rotate_crop_image() 我的标注数据导出时,很多数据变成倒的 hmmmm, 你管我~ …

Apache Seata分布式事务启用Nacos做配置中心

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Seata分布式事务启用Nacos做配置中心 Seata分布式事务启用Nacos做配置中心 项目地址 本文作…

2024年AI技术深入研究

2024年AI技术持续快速发展,应用领域广泛,产业发展迅速,市场趋势积极,学术研究深入。 AI技术进展大模型发展 2024年,智谱AI正在研发对标OpenAI Sora的高质量文生视频模型,预计最快年内发布。智谱AI的进展显示了国内AI大模型领域的快速发展,以及与国际领先技术的竞争态势…

代码随想录-Day49

300. 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的 …

【话题】AI是在帮助开发者还是取代他们

大家好,我是全栈小5,欢迎阅读小5的系列文章,这是《话题》系列文章 目录 引言AI在代码生成中的应用AI在错误检测和自动化测试中的作用对开发者职业前景的影响技能需求的变化与适应策略结论文章推荐 引言 随着人工智能(AI&#xff…

接口测试工具Postman

Postman Postman介绍 开发API后,用于API测试的工具。在我们平时开发中,特别是需要与接口打交道时,无论是写接口还是用接口,拿到接口后肯定都得提前测试一下。在开发APP接口的过程中,一般接口写完之后,后端…

【最新整理】全国高校本科及专科招生和毕业数据集(2008-2022年)

整理了各省高校本科、专科招生和毕业数据等21个相关指标,包括招生、在校、毕业人数,以及财政教育支出、教育经费等数据。含原始数据、线性插值、回归填补三个版本,希望对大家有所帮助 一、数据介绍 数据名称:高校本科、专科招生…

JWT(Json Web Token)在.NET Core中的使用

登录成功时生成JWT字符串目录 JWT是什么? JWT的优点: JWT在.NET Core 中的使用 JWT是什么? JWT把登录信息(也称作令牌)保存在客户端为了防止客户端的数据造假,保存在客户端的令牌经过了签名处理&#xf…

LT8712 支持USB Type-C的DP到HDMI/VGA 用于对接站 适配器

描述 LT8712是一个DisplayPort(DP)到HDMI和VGA转换器,设计用于同时连接一个DP源到一个VGA收发器和最多两个HDMI收发器。LT8712集成了一个DP1.2兼容的接收器、一个高速三通道视频DAC和两个HDMI1.4兼容的发射器(发射器0和发射器1)。接收端口集成了CC控制器&#xff0c…

html+js+css做的扫雷

做了个扫雷&#x1f4a3; 88大小 源代码在文章最后 界面 先点击蓝色开局按钮 然后就可以再扫雷的棋盘上玩 0代表该位置没有雷 其他数字代表周围雷的数量 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&qu…

价格预言机的使用总结(一):Chainlink篇

文章首发于公众号&#xff1a;Keegan小钢 前言 价格预言机已经成为了 DeFi 中不可获取的基础设施&#xff0c;很多 DeFi 应用都需要从价格预言机来获取稳定可信的价格数据&#xff0c;包括借贷协议 Compound、AAVE、Liquity &#xff0c;也包括衍生品交易所 dYdX、PERP 等等。…

【腾讯内推】腾讯2025校招/青云计划/社招——长期有效

及时跟进进度&#xff0c;保证不让简历石沉大海&#xff01; 涵盖NLP/CV/CG/ML/多模态/数据科学/多媒体等各方向! 定向匹配优质团队/竞争力薪酬/覆盖全球工作地点! 招聘对象: 本硕博:2024年1月-2025年12月毕业的同学 目前最热岗位: 技术研究-自然语言处理 技术研究-计算机视觉 …

【Linux】进程创建和终止 | slab分配器

进程创建 fork 1.fork 之后发生了什么 将给子进程分配新的内存块和内核数据结构&#xff08;形成了新的页表映射&#xff09;将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork 返回&#xff0c;开始调度器调度 这样就可以回答之前返回两个值&#xff1f…

Java面试八股之MySQL存储货币数据,用什么类型合适

MySQL存储货币数据&#xff0c;用什么类型合适 在MySQL中存储货币数据&#xff0c;最合适的类型是DECIMAL。这是因为货币数据通常需要高精度&#xff0c;尤其是对于财务交易&#xff0c;即使是极小的精度损失也可能导致严重的会计错误。DECIMAL类型可以提供固定的精度&#xf…

c++:struct和class的区别

C和C中struct的区别 (1)C中不支持成员函数&#xff08;只能通过函数指针成员变量间接支持&#xff09;&#xff0c;而C源生支持。 (2)C中不支持static成员&#xff0c;而C中支持。后面会详细讲&#xff0c;C static class是一个大知识点 (3)访问权限&#xff0c;C中默认public…

利用 Hexo 搭建个人博客

〇、前言 本文将会讨论&#xff0c;如何将 CSDN 上的博客&#xff0c;拉取到本地&#xff0c;然后PicGo、Hexo、Github 等工具建立个人博客&#xff0c;环境为 Ubuntu 20.04。 一、利用 Hexo 预备工作 首先安装 Node.js、npm、git工具。 > node -v v12.22.9 > npm -…

Midjourney 预设

使用命令/settings 进入预设,根据点击不同选项来配置。 🌹 1. 设置工作所使用的模型版本。 1️⃣ MJ Version 1 2️⃣ MJ Version 2 3️⃣ MJ Version 3 4️⃣ MJ Version 4 5️⃣ MJ Version 5 5️⃣ MJ Version 5.1 🔧Raw Mode 🌈 Niji Version 4 🍎 Niji Versio…

深入探索C语言中的结构体:定义、特性与应用

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 目录 结构体的介绍结构体定义结构成员的类型结构体变量的定义和初始化结构体成员的访问结构体传参 结构体的介绍 在C语言中&#xff0c;结构体是一种用户自定义的数据类型&#xff0c;它允许开发者将不同类型的变量组合在一起…

数据库管理工具 -- Navicat Premium v17.0.8 特别版

软件简介 Navicat Premium 是一款功能强大的数据库管理工具&#xff0c;适用于Windows、Mac和Linux平台。它支持多种数据库&#xff0c;包括MySQL、MariaDB、SQL Server、PostgreSQL、Oracle、SQLite等。用户可以通过Navicat Premium轻松地连接到各种数据库服务器&#xff0c;…