今天是2024年10月26日,星期六,北京,天气晴。
本文主要讲两个工作,一个是回顾下昨日大模型进展,还是可以看到,很多应用端的多模态大模型、一些总结性的报告陆续还在推进;此外,一个是知识图谱与RAG结合用于代码生成,核心在于知识图谱的构建。
供大家一起参考并思考。
一、老刘说NLP20241025大模型进展早报
我们先来看看昨日进展早报,主要跟进开源进展以及一些前沿性的论文思路。
可以看看文字版,【老刘说NLP20241025大模型进展早报】,跟新每日进展,欢迎加入。
1、关于具身智能进展,具身智能入门指南: https://github.com/TianxingChen/Embodied-AI-Guide
2、关于大模型用于数据工程,DataExpert 数据工程资料库: https://github.com/DataExpert-io/llm-driven-data-engineering
3、大模型开源进展,Meta发布适用于移动设备的量化Llama 3.2 1B和3B模型,https://ai.meta.com/blog/meta-llama-quantized-lightweight-models/,https://huggingface.co/meta-llama
4、多模态进展,https://github.com/THUDM/GLM-4-Voice,多模态端到端,直接理解和生成中英文语音。看了下demo,效果还不错;
GLM-4-Voice由三个部分组成:
其一,GLM-4-Voice-Tokenizer: 通过在 Whisper 的 Encoder 部分增加 Vector Quantization 并在 ASR 数据上有监督训练,将连续的语音输入转化为离散的 token。每秒音频平均只需要用 12.5 个离散 token 表示。
其二,GLM-4-Voice-Decoder: 基于 CosyVoice 的 Flow Matching 模型结构训练的支持流式推理的语音解码器,将离散化的语音 token 转化为连续的语音输出。
其三,GLM-4-Voice-9B: 在 GLM-4-9B 的基础上进行语音模态的预训练和对齐,从而能够理解和生成离散化的语音 token。
5、关于知识图谱和RAG结合进展,CONTEXT-AUGMENTED CODE GENERATION USING PROGRAMMING KNOWLEDGE GRAPHS,一种利用编程知识图(Programming Knowledge Graph, PKG)来增强代码生成的新框架,用于代码生成。https://arxiv.org/pdf/2410.18251;
6、RAG进展,SmartRAG,SMARTRAG: JOINTLY LEARN RAG-RELATED TASKS FROM THE ENVIRONMENT FEEDBACK,决定何时检索、检索什么以及如何利用检索到的信息生成答案,所有这些功能都由策略网络和检索器完成,通过强化学习联合优化。https://arxiv.org/pdf/2410.18141,这个之前有提高,如何进行联合优化,而不是分步骤,所以,这个工作可以读读;
7、关于文档处理进展,微软刚在huggingface发布了一个通用屏幕解析工具OmniParser huggingface.co/microsoft/OmniParser,omniparser-for-pure-vision-based-gui-agent,https://huggingface.co/microsoft/0mniParserc,https://arxiv.org/pdf/2408.00203Bl OmniParser能够将用户界面(UI)截图转换为结构化格式,以提升基于大型语言模型(LLM)的UI代理。该工具包含两个训练数据集:一个是可交互图标检测数据集,另一个是图标描述数据集。此外,还提供了YOLOv8和BLIP-2模型的微调版本;
8、关于竞赛方案进展,AIOps RAG竞赛优秀方案EasyRAG解读:兼看SimRAG:自适应检索增强微调思路,https://mp.weixin.qq.com/s/gQYceXigXHn5iSKAjBtJfw
二、知识图谱与RAG结合用于代码生成
关于知识图谱和RAG结合进展,《CONTEXT-AUGMENTED CODE GENERATION USING PROGRAMMING KNOWLEDGE GRAPHS》(https://arxiv.org/pdf/2410.18251),提出一种基于编程知识图(PKG)的框架,通过语义表示和检索代码来提高代码生成的准确性。该方法包括树剪枝技术以减少不相关上下文,并通过重排序机制选择非RAG解决方案以减少幻觉。
核心还是说,怎么事先把代码转为图谱形式,然后再进行检索RAG。其中:
PKG生成阶段,从给定的数据集中生成PKG,包含文本和代码内容。使用FunctionAnalyzer工具提取问题和答案样本,并生成上下文流图(CFG),从中识别代码块。
检索阶段,从PKG中检索相关信息,采用两种代码检索方法:块级检索和函数级检索。块级检索关注具体的代码块,而函数级检索关注整个函数。
最后,通过AST分析和语义相似性检查对检索到的解决方案进行重排序,选择最相关的解决方案。
可以看三个问题:
1、编程知识图(PKG)的生成过程
首先,编程数据集选择,从包含文本和代码内容的数据集中生成PKG。例如,使用PythonAlpaca数据集,该数据集包含143,000个通用Python问答对。
其次,进行函数提取,使用FunctionAnalyzer工具从数据集的输出部分提取Python函数。
接着,做代码块提取,将每个代码块表示为节点,对应于特定的Python构造(如if、for、with或try块)。FunctionAnalyzer负责提取每个函数的上下文流图(CFG),并识别代码块作为单独的节点。每个函数由三种类型的节点组成:‘函数名’、‘函数实现’和‘提取的代码块’。节点之间的关系被捕捉为结构边。
然后,增强PKG,使用FunctionEnhancer模块丰富函数实现的表示。该模块利用填充中间(FIM)目标,在实现的各个位置生成解释。
接着,编码PKG,对图中的每个节点进行编码,以便进行语义搜索。选择了VoyageCode2模型作为嵌入模型。
最后,Neo4j图谱生成:定义所有节点及其对应的嵌入和关系,构建Neo4j向量图,以实现高效的图索引和语义搜索功能。
2、代码生成过程中的树修剪实现过程
树修剪的主要作用是减少不相关的上下文,确保只有最有用的信息传递给生成模型。通过移除无关的分支,可以避免在生成代码时引入噪声和不必要的复杂性,从而提高生成代码的准确性和质量。
首先,节点建模,将选定的最佳节点建模为有向无环图(DAG),其中每个节点代表一个代码块或子函数,边表示子依赖关系;
其次,分支移除,移除与查询无关的分支。具体来说,计算查询嵌入与修剪后图嵌入之间的余弦相似度,选择最佳修剪版本;
最后,查询增强,在识别出最相关的修剪版本后,将修剪后的图内容(即npruned)与原始查询q结合,生成增强后的查询qaugmented;
3、代码生成中的重排序机制
重排序机制在代码生成中的作用是通过结合多种方法的输出(如RAG和非RAG方法),并对生成的解决方案进行重新排序,从而选择最稳健和有效的解决方案。
具体实现步骤如下:
AST分析:首先,将解决方案候选者通过AST(抽象语法树)分析,过滤掉那些有语法错误的方案;
运行时检查:执行剩余的候选方案,消除包含运行时问题(如未定义变量)的方案;
语义相似性检查:通过比较剩余候选方案的嵌入与查询嵌入,进行语义相似性检查,返回相似度最高的解决方案;
最后,再生成环节,通过设置prompt,提示大模型做生成:
总结
本文主要讲了两个工作,一个是回顾下昨日大模型进展,还是可以看到,很多应用端的多模态大模型陆续还在推进;此外,一个是知识图谱与RAG结合用于代码生成,核心在于知识图谱的构建,也是一个思路。
参考文献
1、https://arxiv.org/pdf/2410.18251
关于我们
老刘,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
对大模型&知识图谱&RAG&文档理解感兴趣,并对每日早报、老刘说NLP历史线上分享、心得交流等感兴趣的,欢迎加入社区,社区持续纳新。
加入会员方式:关注公众号,在后台菜单栏中点击会员社区->会员入群加入