开发个人Ollama-Chat--5 模型管理 (二)

开发个人Ollama-Chat–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/bicheng/45544.shtml

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

相关文章

mmaction2的GPU环境配置记录RTX3090,cuda12.2,ubuntu22.04版本

1、配置镜像源 最重要的一个步骤,先看下镜像源地址,如果镜像源有问题,所有的包安装都会有问题 镜像源地址获取地址:选择对应的ubuntu版本号,将里面的镜像源地址复制出来,更新到服务器 ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirro…

牛客小白月赛98

骰子魔术 jackle 会拿出一枚骰子,骰子的表面分别写上了从 1∽5001\backsim 5001∽500 的数字,朋友会随便说一个 1∽5001\backsim 5001∽500 之间的点数,jackle 都能保证百分之百的掷出这个点数。 当然 jackle 有备而来,他准备了 …

LeetCode分发糖果(贪心思路分析)

题目描述 贪心思路 思路及解法 我们可以将「相邻的孩子中&#xff0c;评分高的孩子必须获得更多的糖果」这句话拆分为两个规则&#xff0c;分别处理。 左规则&#xff1a;当 ratings[i−1]<ratings[i] 时&#xff0c;i 号学生的糖果数量将比 i−1 号孩子的糖果数量多。 …

实现win10多用户同时远程连接登陆(详细实验步骤版)

目录 目的环境实验步骤&#xff08;在需要被远程的win10上&#xff09;1. 开启远程桌面服务2. 编辑组策略实现多用户登录3. 安装RDPWrap实现多用户同时登录 测试 目的 默认情况下&#xff0c;win10 专业版只支持本地或远程只能同时存在一个连接。windows server支持多连接。 比…

【unity笔记】十、Obi绳索插件使用

一. 创建绳索 1.1 新建蓝图 在Assets中右键选择创建->Obi->Rope Blueprint&#xff0c;其属性如图所示 1.2 Obi solver 在场景下创建一个obi solver对象&#xff0c;在该对象下再创建Obi Rope对象。 随后将蓝图拖到Obi Rope对象下的Obi Rope组件&#xff0c;即可看到…

MES系统与其他系统的集成:提升制造业智能化的关键路径

在当今高度竞争的制造业环境中&#xff0c;企业对于生产效率、质量控制、资源优化以及快速响应市场变化的需求日益迫切。制造执行系统&#xff08;MES&#xff09;作为连接企业计划层与车间控制层的重要桥梁&#xff0c;其在提升生产透明度和优化生产流程方面发挥着不可替代的作…

【SQL】如何用SQL写透视表

【背景】 报表中有一大需求是透视表,目前有很多分析类应用也搭载了此类功能,那么我们能不能直接用SQL做透视表呢? 【分析】 BI类软件将透视表功能做在了前端,但是数据本身还是存储在数据库中,所以必然有方法可以用SQL直接实现透视表。 【心法】 透视表是任意选取一个…

2024最新6月泛二级域名秒收泛目录(二级域名泛站群)

5月免费版本无后台 无更新功能不自动引蜘蛛 2024年5月最新泛程序&#xff0c;秒收秒排&#xff01;&#xff08;泛型程序&#xff09; - 虚良SEO博客 新曾功能&#xff1a; 后台管理 蜘蛛统计 域名添加 一键强引蜘蛛 蜘蛛统计 识别真假蜘蛛 全自动引蜘蛛 域名要求 …

Vue3-15 表单的绑定

在Vue 3中&#xff0c;表单输入绑定是实现动态数据双向绑定的重要部分&#xff0c;它让开发者可以轻松地管理和响应用户输入。本文将详细介绍如何在Vue 3中利用v-model指令以及一些特定修饰符来处理不同类型的表单输入。 响应式表单数据 首先&#xff0c;我们定义了一个响应式…

Linux /etc/profile 详解

概述 Linux是一个多用户的操作系统。每个用户登录系统后&#xff0c;都会有一个专用的运行环境。通常每个用户默认的环境都是相同的&#xff0c;这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制&#xff0c;其方法就是修改相应的系统环境变量&…

如何检测代理IP是否有效?检查因素与方法全解

代理IP是一种网络代理技术&#xff0c;它是通过中间服务器来转发网络请求的IP地址。当我们使用代理IP时&#xff0c;我们的真实IP地址会被隐藏起来&#xff0c;而代理服务器的IP地址会被用作我们的身份标识。使用代理IP的步骤如下&#xff1a; 1.选择合适的代理服务器 考虑服务…

【JavaEE】网络原理——传输层协议

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;上一篇文章&#xff1a;【JavaEE】网络编程—…

CDGA|数据治理:标准化处理与确保数据可溯源性

在当今信息爆炸的时代&#xff0c;数据已成为企业决策、科学研究和政府管理的核心要素。然而&#xff0c;随着数据量的不断增加和来源的多样化&#xff0c;数据治理成为了一个亟待解决的问题。特别是在处理复杂数据时&#xff0c;标准化处理和确保数据的可溯源性显得尤为重要。…

ERROR: No matching distribution found for matplotlib

1.问题&#xff1a;安装matplotlib报错&#xff0c;如下图所示&#xff1a; 2.通过换源&#xff0c;输入以下命令&#xff1a;python -m pip install matplotlib -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com&#xff0c;但是还是无效 3.在pycharm中升级…

【java算法专场】滑动窗口(上)

目录 滑动窗口 基本概念 长度最小的子数组 算法分析 算法步骤 示例 算法代码 无重复字符的最长子串 算法分析 算法步骤 示例 算法代码 最大连续1的个数 III 算法分析 算法步骤 示例 算法代码 将 x 减到 0 的最小操作数 算法分析 算法步骤 示例 算法代码 滑动…

location匹配的优先级和重定向

nginx的重定向&#xff08;rewrite&#xff09; location 匹配 location匹配的就是后面的uri /wordpress 192.168.233.10/wordpress location匹配的分类和优先级 1.精确匹配 location / 对字符串进行完全匹配&#xff0c;必须完全符合 2.正则匹配 ^-前缀级别&#xff…

[Vulnhub] Stapler wp-videos+ftp+smb+bash_history权限提升+SUID权限提升+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.106TCP:21,22,53,80,123,137,138,139,666,3306, Using Nmap for scanning: $ nmap -p- 192.168.8.106 --min-rate 1000 -sC -sV The results are as follows: PORT STATE SERVICE VERSION 20/tcp closed ftp-data…

Java常用的三种注解

1、 基本注解 一、注解的概念 1、注解也叫元数据&#xff0c;是JDK1.5版本开始引入的一个特性&#xff0c;用于对代码进行说明&#xff0c;可以对包、类、接口、字段、方法参数、局部变量等进行注解。注解的形式是“单词”。 在不改变原有逻辑的情况下&#xff0c;使用注解在源…

白化(Whitening)的原理是什么?

**白化&#xff08;Whitening&#xff09;**是数据预处理中的一个重要步骤&#xff0c;其目的是将原始数据的各个维度之间的线性相关性去除&#xff0c;并使得每个维度的方差都为1。通过白化&#xff0c;可以简化后续的数据处理步骤&#xff0c;如独立成分分析&#xff08;ICA&…

【简历】兰州某大学一本硕士:面试通过率基本是为0

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一个一本硕士的Java简历&#xff0c;那这个简历因为学校本身&#xff0c;它是一个一本的硕士&#xff0c;我们一般认为这一本硕士&a…