专栏名称: 老刘说NLP
老刘,NLP开源爱好者与践行者。主页:https://liuhuanyong.github.io。老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
目录
相关文章推荐
艾邦高分子  ·  邀请函:3D打印与鞋业应用创新论坛(3月28 ... ·  16 小时前  
高分子科学前沿  ·  中科院福建物构所林悦/国防科大陈晨AM:塑料 ... ·  昨天  
重庆电力交易中心  ·  注册后连续12个月未进行实际交易售电公司名单 ... ·  2 天前  
重庆电力交易中心  ·  2025年年度零售交易总成交申报情况 ·  3 天前  
重庆电力交易中心  ·  2025年年度零售交易总成交申报情况 ·  2 天前  
51好读  ›  专栏  ›  老刘说NLP

用Agent做Text-SQL之MAG-SQL:兼看长文生成大模型LongWriter实现思路

老刘说NLP  · 公众号  ·  · 2024-08-17 10:29

正文

今天是2024年8月17日,星期六,北京,天气晴。

我们今天看三个事情。一个是回顾昨日大模型进展早报,一个是关于长文生成进展-LongWriter的工作介绍,最后一个是用Agent做text-SQL:MAG-SQL。

其中的几个思路都很有趣,也都是agent的思路,供大家一起参考。

一、回顾昨日大模型进展早报

社区早报,总结过去一日关键进展,围绕RAG、知识图谱、大模型、长文本的一些进展。

当前,转眼间社区早报已经实行6个月,近180天每日大模型、知识图谱、RAG等动向,信息量挺大,蛮有意义的。

我们来看下昨日大模型进展,主要包括:关于text2sql进展、关于RAG进展、关于长文生成进展、维基百科向量搜索、语音多模态项目生成、大模型微调教程等。

文字版本可见社区,欢迎加入社区,一同共享。

二、关于长文生成进展-LongWriter

尽管当前的LLMs能够处理长达100,000个token的输入,但它们在生成超过2,000个词的输出时存在困难。这一限制主要是由于现有监督式微调(Supervised Fine-Tuning,简称SFT)数据集中缺少长文本输出的例子。

因此,最近的供祖宗《LongWriter: Unleashing 10,000+ Word Generation from Long Context LLMs》(https://arxiv.org/abs/2408.07055),提出了一个名为AgentWrite的代理基础流水线,它能够将超长文本生成任务分解为多个子任务,使得现成的LLMs能够生成超过20,000个词的连贯输出。

LongWriter模型目的主要用于额生成长度超过10,000字的长文本,模型基于GLM-4和Meta-Llama-3.1训练而成,包括LongWriter-glm4-9b和LongWriter-llama3.1-8b。

调用方式:

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
tokenizer = AutoTokenizer.from_pretrained("THUDM/LongWriter-glm4-9b", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("THUDM/LongWriter-glm4-9b", torch_dtype=torch.bfloat16, trust_remote_code=True, device_map="auto")
model = model.eval()
query = "Write a 10000-word China travel guide"
response, history = model.chat(tokenizer, query, history=[], max_new_tokens=32768, temperature=0.5)
print(response)

1、具体实现

AgentWrite将超长生成任务分解为子任务,使现成的LLMs能够生成超过20,000字的连贯输出。

在数据集方面,构造了LongWriter-6k数据集:利用AgentWrite,作者创建了一个包含6,000个SFT数据的LongWriter-6k数据集,这些数据的输出长度在2k到32k个词之间。通过将这个数据集纳入模型训练,成功地将现有模型的输出长度扩展到超过10,000个词,同时保持了输出质量。

AgentWrite首先将长写作任务分解为多个子任务,每个子任务只要求模型写一个段落。然后,模型依次执行这些子任务,并将子任务的输出连接起来,

1)步骤 I: 计划(Plan

在这个阶段,AgentWrite 的目标是创建一个详细的写作计划。这个计划将概述整个文本的结构,并为每个段落指定主要内容和目标词数。

具体步骤如下:

  • 接收用户指令:首先,AgentWrite 接收用户的写作指令,该指令指明了写作任务的要求。
  • 生成写作大纲:接着,AgentWrite 使用 LLMs 的规划功能,根据用户指令生成一个写作大纲。这个大纲包括每个段落的主要点和词数要求。

2)步骤 II: 写作(Write)

在计划阶段完成后,AgentWrite 进入写作阶段,依次完成每个子任务,生成每个段落的内容。

具体步骤如下:

  1. 序列化生成:AgentWrite 按照计划中制定的顺序,逐个生成每个段落。这种序列化的方法有助于保持文本的连贯性。
  2. 上下文输入:为了确保每个段落都能够在已有内容的基础上连贯地生成,AgentWrite 在生成第 n 个段落时,会将之前生成的 n-1 个段落作为上下文输入提供给模型。
  3. 生成段落:使用 LLMs,根据写作计划和已有的段落内容,AgentWrite 生成下一个段落。这个过程会重复进行,直到所有子任务完成。
  4. 文本串联:一旦所有段落生成完毕,AgentWrite 将这些段落串联起来,形成最终的长篇文本输出。

2、评估数据

此外提出LongBench-Writer,用于评估超长生成能力:https://github.com/THUDM/LongWriter

地址:https://huggingface.co/datasets/THUDM/LongWriter-6k,https://huggingface.co/spaces/THUDM/LongWriter,https://github.com/THUDM/LongWriter.

三、用Agent做text-SQL:MAG-SQL

Text2sql是个很有趣的方向,如下一个具体的例子:

简单的还好说,但面向具有复杂数据库结构和困难问题的text2SQL比较难,因此可看看基于Agent生成方法:《MAG-SQL: Multi-Agent Generative Approach with Soft Schema Linking and Iterative Sub-SQL Refinement for Text-to-SQL》(https://arxiv.org/pdf/2408.07930)。

该工作提出了一个名为MAG-SQL的多智能体生成方法,结合了软模式链接(Soft Schema Linking)和迭代子SQL细化(Iterative Sub-SQL Refinement),用于文本到SQL(Text-to-SQL)任务。

其思想在于,通过实体和表格摘要选择数据库列,并采用目标条件分解法分解复杂问题。建立了一个包含子SQL生成器和子SQL精炼器的迭代生成模块,对每个生成步骤进行外部监督。

MAG-SQL由以下几个关键组件构成:

1、软模式链接器(Soft Schema Linker)

负责从大型数据库架构中选择相关的列,通过基于实体的方法和表格摘要来增强模式链接。

可以分为五个部分:

1) 模式表示(Schema Representation):将数据库中的表格信息序列化成列表,每个列表项是一个包含列信息的元组。

2) 表格摘要(Table Summarization):在直接基于每列的相关性选择有用列之前,让大型语言模型(LLM)先对每个表中的信息进行摘要,然后提示模型同时使用摘要和完整数据库架构进行列选择。

对应的prompt如下:

对应的输出结果如下:

3) 值检索(Value Retrieval):由于LLM不能直接浏览表,当自然语言问题中出现文本类型的值(如人名、地名等)时,LLM可能会选择错误的列。使用最长公共子串(LCS)算法从数据库中检索与问题相关的值,以增加选择正确列的可能性。

4) 基于实体的模式链接(Entity-based Schema Linking):由于SQL查询语句中的列和自然语言问题中的实体是一一映射的,提出了基于实体的模式链接以实现细粒度的列选择。

也可以使用ICL示例的方式进行:

使用链式思维方法提示LLM完成以下步骤:从自然语言问题中提取实体>基于摘要、数据库架构和提示分析相关性>对于每个实体,找到至少三个最相关的列(按相关性排序),并将此结果以JSON格式写出。

5) 软模式构建(Soft Schema Construction):预处理数据库架构,只保留有关有用列的信息,采用软列选择方法,标记所选列的额外信息。

2、目标条件分解器(Targets-Conditions Decomposer)

将复杂问题分解为一系列子问题,通过迭代地结合目标和条件。由于自然语言问题的复杂性日益增加,一步生成SQL查询不是一个好的选择。

因此,作者提出了目标条件分解方法,确保所有问题都根据相同的标准进行分解。每个子问题都是通过在前一个子问题上添加一个条件来获得的,而第一个问题由目标和第一个条件组成。

对应的prompt如下:

也可以看下具体的ICL:

3、子SQL生成器(Sub-SQL Generator)

基于前一个子问题和子SQL生成下一个子SQL,子SQL生成器基于前一个子问题和前一个子SQL预测当前子问题的子SQL。

例如,对应的prompt如下:

其中,对于next step的

设计目的是允许生成器一次只向先前的子SQL添加一个条件,这大大降低了推理的难度。

4、子SQL细化器(Sub-SQL Refiner)

根据LLMs(大型语言模型)的自我修正能力,对生成的子SQL进行校正,如果当前处理的子问题不是最后一个,那么细化器校正后的子SQL将返回给生成器,并用于生成下一个子SQL。

总结

本文主要回顾了昨日大模型进展早报,一个是关于长文生成进展-LongWriter的工作介绍,并从prompt的角度看了看用Agent做text-SQL:MAG-SQL的思路,很有趣。

方案很多,但更多的是集成思路。

参考文献

1、https://arxiv.org/abs/2408.07055

2、https://arxiv.org/pdf/2408.07930

关于我们

老刘,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。

对大模型&知识图谱&RAG&文档理解感兴趣,并对每日早报、老刘说NLP历史线上分享、心得交流等感兴趣的,欢迎加入社区,社区持续纳新。

加入会员方式:关注公众号,在后台菜单栏中点击会员社区->会员入群加入