【goframe】(2)实现上下文原理,在chatgpt中,经过折腾研究,要做好上下文需要把之前的信息都存储上

目录

  • 前言
    • 1,关于chatgpt api 接口
    • 2,增加上下文方法
    • 3,总结

前言


本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/129846766

未经博主允许不得转载。
博主CSDN地址是:https://blog.csdn.net/freewebsys
博主掘金地址是:https://juejin.cn/user/585379920479288
博主知乎地址是:https://www.zhihu.com/people/freewebsystem

1,关于chatgpt api 接口


上回已经研究明白使用 goframe做接口调用chatgtp的api。
但是不能保存上下文信息。
要是保存上下文信息需要保存之前存储的信息。
这个时候需要存储信息到mysql当中了。

只要设计好数据库表,就可使用工具生成一个Dao了。

2,增加上下文方法


只要把上次的内容再传递就可以了。

{max_tokens: 1000,model: 'gpt-3.5-turbo',temperature: 0.8,top_p: 1,presence_penalty: 1,messages: [{ role: 'user', content: '大众汽车介绍,', name: undefined },{role: 'assistant',content: '大众汽车是一家德国汽车制造商,成立于1937年。其总部位于沃尔夫斯堡,是全球最大的汽车制造商之一,旗下品牌包括大众、奥迪、保时捷、斯柯达等。大众汽车以高品质、稳定性和安全性著称,并在全球范围内销售汽车、商用车和摩托车等产品。',name: undefined},{ role: 'user', content: '再详细点', name: undefined },{role: 'assistant',content: '好的,以下是更详细的大众汽车介绍:\n' +'\n' +'大众汽车集团(Volkswagen Group)成立于1937年,总部位于德国沃尔夫斯堡,是一家全球领先的汽车制造商。旗下品牌包括大众、奥迪、保时捷、斯柯达、西雅特、兰博基尼、曼恩等,拥有全球超过100个生产工厂和销售网点。\n' +'\n' +'大众汽车以高品质、创新、环保和安全性能著称,并在全球范围内销售汽车、商用车和摩托车等产品。其主要产品系列包括小型车、紧凑型车、中型车、豪华车、SUV等,满足不同客户群体的需求。\n' +'\n' +'大众汽车一直致力于技术研发和创新,开发了一系列具有领先地位的技术和系统,如TSI引擎、DSG变速箱、模块化平台技术等。同时,大众汽车也积极推进电动汽车和智能出行领域的发展,投入大量资金和人力资源,为未来的可持续发展做出贡献。\n' +'\n' +'作为世界上最大的汽车制造商之一,大众汽车一直致力于社会责任和可持续发展,推行“向零排放”和“向零事故”等目标,为环保和交通安全做出贡献。',name: undefined},{ role: 'user', content: '加上销量', name: undefined }]
}

这样就可以保存对话session了。特别注意下,每次对会都有 parentMessageId 。
类似这样的id信息。记录父对话是杀。所以数据库表设计就是:

CREATE TABLE `user_session_message` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`user_id` bigint(20) DEFAULT NULL COMMENT '用户id',`session_id` varchar(255) NOT NULL COMMENT '对话id',`answer_message_id` varchar(255) DEFAULT NULL COMMENT '回答id',`parent_message_id` varchar(255) DEFAULT NULL COMMENT '父对话id',`role` varchar(200) NOT NULL COMMENT '角色',`content` text DEFAULT NULL COMMENT '内容',`create_time` datetime NOT NULL COMMENT '创建时间',`update_time` datetime NOT NULL COMMENT '更新时间',`del_flag` bigint(20) DEFAULT '0' COMMENT '删除标记0:正常,id:删除',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8 COMMENT='用户聊天信息表';

说明逻辑:
把相关信息都存储到数据库中,并且都是按照顺序父节点一个一个存储的。
在查询的只要找到父节点对应的 session_id 然后再按照 Id 倒叙查询出 6条信息即可。

这个必须是偶数条信息,然后再拼接上当前的信息。
要是删除的时候直接删除问题和回答。一对删除。

role: ‘user’ 代表用户的提问信息。
role: ‘assistant’ 代表chatgpt 回答的信息。

然后就而可以进行开发了。把信息存储上。
使用工具生成代码:

使用goframe 创建dao
配置好文件,hack/config.yaml :


# CLI tool, only in development environment.
# https://goframe.org/pages/viewpage.action?pageId=3673173
gfcli:gen:dao:- link:     "mysql:root:root@tcp(127.0.0.1:3306)/chatgpt"tables:   "user_session_message"jsonCase: "CamelLower"

然后创建数据库和表:

# 使用docker启动mysql服务:
docker run --name mysql -itd -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql:5.7# 创建数据库和表
create database chatgpt default character set utf8mb4 collate utf8mb4_unicode_ci;device_info, CREATE TABLE `user_session_message` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`user_id` bigint(20) DEFAULT NULL COMMENT '用户id',`session_id` varchar(255) NOT NULL COMMENT '对话id',`parent_message_id` varchar(255) DEFAULT NULL COMMENT '父对话id',`role` varchar(200) NOT NULL COMMENT '角色',`content` text DEFAULT NULL COMMENT '内容',`create_time` datetime NOT NULL COMMENT '创建时间',`update_time` datetime NOT NULL COMMENT '更新时间',`del_flag` bigint(20) DEFAULT '0' COMMENT '删除标记0:正常,id:删除',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8 COMMENT='用户聊天信息表';

使用goframe 生成dao类:

$ make dao
generated: internal/dao/user_session_message.go
generated: internal/dao/internal/user_session_message.go
generated: internal/model/do/user_session_message.go
generated: internal/model/entity/user_session_message.go
done!

然后就可以开发程序了。不讲究,直接在controller 里面调用dao的方法插入数据库即可。

## 这里使用了 gtime 时间:"github.com/gogf/gf/v2/os/gtime"var (m = dao.UserSessionMessage.Ctx(ctx))userMsg := entity.UserSessionMessage{SessionId: parentMsgId,ParentMessageId: parentMsgId,Content: prompt,Role: "user",CreateTime: gtime.Now(),UpdateTime: gtime.Now(),DelFlag: 0,}lastId, err := m.Data(userMsg).InsertAndGetId()if err == nil {g.Log().Printf(ctx, "########## insertId %d #######", lastId)}else{g.Log().Printf(ctx, "########## insert error %s #######", err)}resId, outStr := getChatResult(ctx, prompt, parentMsgId)assistantMsg := entity.UserSessionMessage{SessionId: parentMsgId,ParentMessageId: resId,Content: outStr,Role: "assistant",CreateTime: gtime.Now(),UpdateTime: gtime.Now(),DelFlag: 0,}assistantLastId, err := m.Data(assistantMsg).InsertAndGetId()if err == nil {g.Log().Printf(ctx, "########## insertId %d #######", assistantLastId)}else{g.Log().Printf(ctx, "########## insert error %s #######", err)}

3,总结


chatgpt开发对话上下文,一定要把数据都存储上。
使用比较原始的方法,直接在controller 上面编写dao 方法。
可以把上下文信息都保存起来,这样在查询的时候非常的方便。

本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/129846766

本文链接:https://my.lmcjl.com/post/4613.html

展开阅读全文

4 评论

留下您的评论.