今天是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 进入写作阶段,依次完成每个子任务,生成每个段落的内容。
具体步骤如下:
序列化生成 :AgentWrite 按照计划中制定的顺序,逐个生成每个段落。这种序列化的方法有助于保持文本的连贯性。上下文输入 :为了确保每个段落都能够在已有内容的基础上连贯地生成,AgentWrite 在生成第 n 个段落时,会将之前生成的 n-1 个段落作为上下文输入提供给模型。生成段落 :使用 LLMs,根据写作计划和已有的段落内容,AgentWrite 生成下一个段落。这个过程会重复进行,直到所有子任务完成。文本串联 :一旦所有段落生成完毕,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历史线上分享、心得交流等感兴趣的,欢迎加入社区,社区持续纳新。
加入会员方式:关注公众号,在后台菜单栏中点击会员社区->会员入群加入