【goframe】(2)实现上下文原理,在chatgpt中,经过折腾研究,要做好上下文需要把之前的信息都存储上,再一起发送过去就可以了

前言


本文的原文连接是:
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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/freewebsys/article/details/129846766