开发个人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 chat
    	NewChatEntity {
    		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 Version
    	get /ollama/api/version returns (VersionResponse)
    
    	@handler OllTags
    	get /ollama/api/tags returns (ModelReponse)
    
    	@handler Chat
    	post /ollama/api/chat (NewChatEntity) returns (ChatRespone)
    
    	@handler Complete
    	post /ollama/v1/chat/completions (CompleteRequest) returns (ChatRespone)
    }
    
    service Chat {
    	@handler Changelog
    	get /api/changelog returns (ChangelogResponse)
    
    	@handler Config
    	get /api/config returns (ConfigResponse)
    }
    
    @server (
    	jwt:    Auth
    	prefix: /api/v1
    )
    service Chat {
    	@handler GetPrompt
    	get /prompts returns (PromptResponse)
    
    	@handler GetDefaultModels
    	post /configs/default/models (DefaultModels) returns (DefaultModels)
    }
    
    @server (
    	jwt:    Auth
    	prefix: /api/v1
    )
    service Chat {
    	@handler Create
    	post /chats/new (NewChatRequest) returns (CreateResponse)
    
    	@handler Update
    	post /chats/:id (UpdateChatRequest) returns (UpdateResponse)
    
    	@handler Remove
    	delete /chats/:id (RemoveRequest) returns (RemoveResponse)
    
    	@handler List
    	get /chats (ListRequest) returns ([]Chat)
    
    	@handler Detail
    	get /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:9002
    
    Etcd:
        Hosts:
            - ******:2379
        Key: chat.rpc
    
    Timeout: 0
    
    Mysql:
        Host: ******
        Port: 3309
        DbName: openui
        User: root
        Password: "**********"
        DBZone: "TS"
        Charset: utf8mb4
        MaxIdle: 10
        MaxOpen: 100
        LogMode: true
        Loc: Asia/Shanghai
        Debug: true
        TablePrefix: "v1_"
        MaxLifetime: 300
    
    CacheRedis:
        Name: "openui"
        Nettype: "tcp"
        Address: "******:6379"
        Auth: ""
        DB: 0
    
    Salt: ******
    
    #日志配置
    LogConf:
        ServiceName: chat.rpc
        Mode: file
        TimeFormat: 2006-01-02 15:04:05.000
        Path: logs
        Level: info
        Compress: true
        Stat: false # 不记录CPU、内存等信息
        KeepDays: 10
        MaxBackups: 2
    
  • api/etc

    Name: Chat
    Host: 0.0.0.0
    Port: 8082
    
    Mysql:
        Host: **********
        Port: 3309
        DbName: openui
        User: root
        Password: "**********"
        DBZone: "TS"
        Charset: utf8mb4
        MaxIdle: 10
        MaxOpen: 100
        LogMode: true
        Loc: Asia/Shanghai
        Debug: true
        TablePrefix: "v1_"
        MaxLifetime: 300
    
    Timeout: 0
    
    CacheRedis:
        Name: "openui"
        Nettype: "tcp"
        Address: "**********:6379"
        Auth: ""
        DB: 0
    
    Auth:
        AccessSecret: **********
        AccessExpire: 86400
    
    #日志配置
    LogConf:
        ServiceName: chat.api
        Mode: file
        TimeFormat: 2006-01-02 15:04:05.000
        Path: logs
        Level: info
        Compress: true
        Stat: false # 不记录CPU、内存等信息
        KeepDays: 10
        MaxBackups: 2
    
    ChatRpc:
        Etcd:
            Hosts:
                - **********:2379
            Key: chat.rpc
    
    OllUrl: http://**********:11434
    

5.5 业务处理

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

项目地址

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

html的作业

目录 作业题目 1.用户注册 A图 B代码 2.工商银行电子汇款单 A图 B代码 3.李白诗词 A图 B代码 4.豆瓣电影 A图 B代码 学习产出&#xff1a; 作业题目 1.用户注册 A图 B代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset&qu…

常见算法和Lambda

常见算法和Lambda 文章目录 常见算法和Lambda常见算法查找算法基本查找&#xff08;顺序查找&#xff09;二分查找/折半查找插值查找斐波那契查找分块查找扩展的分块查找&#xff08;无规律的数据&#xff09; 常见排序算法冒泡排序选择排序插入排序快速排序递归快速排序 Array…

52-4 内网代理1 - 内网代理简介

一、正向连接 正向连接是指受控端主机监听一个端口,由控制端主机主动发起连接的过程。这种连接方式适用于受控主机拥有公网IP地址的情况。例如,在攻击者和受害者都具有公网IP的情况下,攻击者可以直接通过受害者的公网IP地址访问受害者主机,因此可以使用正向连接来建立控制通…

mysql5.6的安装步骤

1.下载mysql 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 在这里我们下载zip的包 2.解压mysql包到指定目录 3. 添加my.ini文件 # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configurat…

调试支付分回调下载平台证书

之前的原生代码放到webman里面&#xff0c;死活跑不通 没办法&#xff0c;只能用esayWeChat6.7 &#xff08;自行下载&#xff09; 它里面配置要用到平台证书 平台证书又要用到 composer require wechatpay/wechatpay 但是请求接口之前&#xff0c;你先要用到一个临时的平台…

ELK日志实时监控

目录 一、ELK/EFK简介 1.1 什么是ELK/EFK? 1.2 常见架构 1、Elasticsearch Logstash Kibana 2、Elasticsearch Logstash Filebeat Kibana 3、Elasticsearch Logstash Filebeat Kibana Redis 4、Elasticsearch Fluentd Filebeat Kibana 1.3 基本流程 二、…

【鸿蒙学习笔记】@Link装饰器:父子双向同步

官方文档&#xff1a;Link装饰器&#xff1a;父子双向同步 目录标题 [Q&A] Link装饰器作用 [Q&A] Link装饰器特点样例&#xff1a;简单类型样例&#xff1a;数组类型样例&#xff1a;Map类型样例&#xff1a;Set类型样例&#xff1a;联合类型 [Q&A] Link装饰器作用…

android新闻app(二)

新闻详细页&#xff1a; 历史浏览记录SQList&#xff1a; 分类&#xff1a; 历史浏览记录主体UI和详细&#xff1a; 侧边栏&#xff1a; 参考&#xff1a;浩宇开发

SSM贫困生申请管理系统-计算机毕业设计源码84308

摘要 随着教育信息化的不断推进&#xff0c;越来越多的高校开始借助信息技术手段提升贫困生申请管理的效率与准确性。为此&#xff0c;我们设计并实现了SSM贫困生申请管理系统&#xff0c;旨在通过信息化手段优化贫困生申请流程&#xff0c;提高管理效率&#xff0c;为贫困生提…

IDEA越用越卡?教你轻松解决IDEA内存占用过高问题

大家好&#xff0c;我是瑶山&#xff0c;最近IDEA越用越卡了&#xff0c;刚刚内存卡爆&#xff0c;带着整个电脑也卡的飞起&#xff0c;只能重启了电脑。 虽然重启后又恢复到了流畅&#xff0c;但是问题还是如鲠在喉&#xff0c;痛定思痛&#xff0c;还是决定处理下&#xff01…

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

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

《第一行代码》小结

文章目录 一. Android总览1. 系统架构2. 开发环境3. 在红米手机上运行4. 项目资源详解4.1 整体结构4.2 res文件4.3 build.gradle文件 二. Activity0. 常用方法小结1. 创建一个Activity 一. Android总览 1. 系统架构 应用层&#xff1a;所有安装在手机上的应用程序 应用框架层&…

恢复出厂设置手机变成砖

上周&#xff0c;许多Google Pixel 6&#xff08;6、6a、6 Pro&#xff09;手机用户在恢复出厂设置后都面临着设备冻结的问题。 用户说他们在下载过程中遇到了丢失 tune2fs 文件的错误 。 这会导致屏幕显示以下消息&#xff1a;“Android 系统无法启动。您的数据可能会被损坏…

Python学习笔记30:进阶篇(十九)pygame的使用之显示与窗口管理

前言 基础模块的知识通过这么长时间的学习已经有所了解&#xff0c;更加深入的话需要通过完成各种项目&#xff0c;在这个过程中逐渐学习&#xff0c;成长。 我们的下一步目标是完成python crash course中的外星人入侵项目&#xff0c;这是一个2D游戏项目。在这之前&#xff…

[Labview] Excel读表 输出表单中选中的单元格内容

简而言之 循环外 是读取excel文件&#xff0c;并写入labview表格 循环内 会输出表格中被选中的单元格内容 属性节点&#xff1a;编辑位置 如果需要改写单元格内容并储存替换Excel&#xff0c;可见这篇&#xff1a;[Labview] 改写表格内容并储存覆盖Excelhttps://blog.csdn.ne…

tongweb 部署软航流版签一体化应用示例 提示跨域错误CORS ERROR

目录 问题现象与描述 解决办法 原理解析 什么是CORS 浏览器跨域请求限制 跨域问题解决方法 跨域请求流程 浏览器请求分类解析 http请求方法简介 问题现象与描述 重庆软航科技有限公司提供了一套针对针对word、excel等流式文件转换成PDF版式文件并进行版式文件在线签章…

【虚幻引擎】UE4初学者系列教程开发进阶实战篇——生存游戏案例

一、课程体系 1 学前必读 2 Character类相关基础 -人物移动控制 -动画蓝图 3 常见游戏机制基础 -碰撞器、触发器 -物体使用接口 -视角切换 4其他相关设计 -背包系统 -锻造系统 -物体破碎效果 -简易种植系统 -互动物体动画 5课程结语 二、UI部分 思维导图部分 实操部分 …

Matplotlib Artist Axes

在简介里介绍了很多了&#xff0c;这里补充一点 Axes包含一个属性patch&#xff0c;是Axes对应的方框&#xff0c;可以用来设置Axes的相关属性 ax fig.add_subplot() rect ax.patch # a Rectangle instance rect.set_facecolor(green) Axes有以下方法 Axes helper metho…

第15章 奇异值分解:习题解答及其案例

这一章初学建议看该视频学习&#xff0c;讲得歪瑞古德&#xff1a; 《统计学习方法》李航 第15章奇异值分解 1.矩阵的奇异值分解是指将 m n m \times n mn实矩阵 A A A表示为以下三个实矩阵乘积形式的运算 A U Σ V T A U \Sigma V ^ { T } AUΣVT 其中 U U U是 m m m阶正…

第9章 项目总结01:项目流程,每个模块的介绍

1 请介绍一下你的项目 学成在线项目是一个B2B2C的在线教育平台&#xff0c;本项目包括了用户端、机构端、运营端。 核心模块包括&#xff1a;内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。 下图是项目的功能模块图&#xff1a; 项目采用前后端分离的技…