利用ChatGLM3构建Prompt实现Text2SQL

在这里插入图片描述

之前使用ChatGLM3的自定义工具实现了查询MySQL数据库,但感觉功能还是比较受限。
https://blog.csdn.net/weixin_44455388/article/details/135270879?spm=1001.2014.3001.5501

前言

将自然语言文本(Text)转换成结构化查询语言 SQL,帮助用户快速生成想要查询的 SQL 语句;或者是用户输入一段话,然后系统完成一系列自动化查询和报表展示的操作,过自然语言描述完成复杂数据库的查询工作,得到想要的结果。

Text2SQL的构建

我们在 Text2SQL 上面的应用主要包括两个阶段,第一阶段是利用 LLM 理解你的请求,通过请求去生成结构化的 SQL;下一个阶段是在生成的 SQL 上自动化的查询数据库,返回结果,然后利用 LLM 对结果生成总结,提供分析。

第一阶段:SQL脚本构建

利用 LLM大模型理解文本信息,生成 SQL。因为考虑到数据的安全性,我们考虑使用ChatGLM生成SQL语句,从测试结果看,ChatGLM和GPT 对比,还是有比较大的差距,所以无法直接使用。

(1)构建数据信息表的 schema,利用 LLM 生成 embedding

这里我们根据用户描述的 text,让预训练的 chatglm2-6b 生成 embedding,通过 embedding 检索的方式,选出 top1 数据表,这个过程属于先验过滤阶段。
数据表的 schema 设计非常重要,需要描述清楚这个表它的主体信息以及表中重要字段和字段含义。

以下是我们设计的schema:
–tableName表示表名
–info表示该表的描述信息
–fields表示表字段信息,包括英文字段名、中文字段名和字段类型

[
	{
   
		"tableName":"prompt_history",
		"info":"问答历史会话记录表,包括会话编号id、会用编号id、会话历史记录、会话时间。",
		"fields":{
   
			"session_id":"会话编号,String",
			"user_id":"用户编号,String",
			"history":"会话历史,String",
			"create_time":"会话时间,datetime"
		}
	},
	{
   
		"tableName":"common_prompt",
		"info":"常用prompt提示词表,包括提示词id、提示词标题、提示词内容。",
		"fields":{
   
			"id":"提示词id,int",
			"title":"提示词标题,String",
			"content":"提示词内容,String"
		}
	}
]

开发代码,将以上表信息进行向量化,存储到向量数据库:

public void addTable2Milvus(MultipartFile file) {
   
    List<String> sqls = new ArrayList<>();
    StringBuilder sb=new StringBuilder();
    try (InputStream inputStream = file.getInputStream()) {
   
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inpu
  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于ChatGPT的微调,你可以使用ChatGPT的相关代码库,如Hugging Face的Transformers库来进行微调。下面是一个示例的微调代码: ```python from transformers import GPT2LMHeadModel, GPT2Tokenizer # 加载预训练的GPT-2模型和分词器 model = GPT2LMHeadModel.from_pretrained('gpt2') tokenizer = GPT2Tokenizer.from_pretrained('gpt2') # 准备训练数据 train_data = ["对话1", "对话2", "对话3", ...] # 使用分词器将对话转换为输入序列 train_tokenized = [tokenizer.encode(dialogue) for dialogue in train_data] # 将输入序列转换为模型能够处理的张量 train_tensor = [torch.tensor(dialogue) for dialogue in train_tokenized] # 开始微调 model.train() optimizer = torch.optim.Adam(model.parameters(), lr=1e-5) for epoch in range(num_epochs): total_loss = 0 # 遍历训练数据 for dialogue in train_tensor: optimizer.zero_grad() # 输入序列的前几个token作为context,最后一个token作为回答 input_context = dialogue[:-1] target_token = dialogue[-1] # 使用模型生成回答 output = model(input_ids=input_context.unsqueeze(0)) # 计算损失(交叉熵损失) loss = F.cross_entropy(output.logits[0, -1], target_token.unsqueeze(0)) # 反向传播和参数更新 loss.backward() optimizer.step() total_loss += loss.item() # 计算平均损失 avg_loss = total_loss / len(train_tensor) print(f"Epoch {epoch+1} / {num_epochs}, Average Loss: {avg_loss}") ``` 以上是一个简单的微调示例,你可以根据自己的需求进行修改和优化。在微调过程中,你可以尝试不同的参数和训练数据来获得更好的结果。希望对你有帮助!如果你有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值