首页 > 其他分享 >【RAG系列】基于代码仓库的RAG问答,为仓库构建知识图谱

【RAG系列】基于代码仓库的RAG问答,为仓库构建知识图谱

时间:2024-10-23 19:18:26浏览次数:10  
标签:RAG 仓库 图谱 代码 time timezone 源代码 local

目录

前言

一、为什么要在代码仓库上构建知识图谱

二、如何在代码仓库上构建知识图谱

简单的知识图谱

更高级的知识图谱

总结

Reference


前言

今天介绍的场景是基于代码仓库的RAG问答,RAG有效的关键在于能够根据用户查询检索到相关的文档,这中间涉及到 索引构建 和 文档检索 两个环节,本文就针对这两个环节来介绍为什么要在代码仓库上构建知识图谱,以及如何构建和应用知识图谱。


一、为什么要在代码仓库上构建知识图谱

LLM对代码具有很多的理解能力,将具体的代码片段复制给LLM然后结合prompt工程,LLM通常可以很好地处理各类代码任务(编辑/生成/问答等)。如果将场景拉回到仓库问答中,整个仓库代码太过庞大,都放入LLM中显然是不现实的,因此通常会借助RAG工程对整个仓库的代码进行分割索引,在这里只介绍RAG的索引步骤。

用一个例子简单介绍现有的code切割方式,这是一个简单的 Python 代码库,其中“requirements.txt”定义了依赖项,“README.md”描述了项目,“src/”目录包含代码库的源代码。该应用程序在不同时区之间转换时间,代码库结构如下:

TimeUtils/
├── src/
│   ├── time_app.py
│   └── time_utils.py
├── requirements.txt
└── README.md

在 time_utils.py 文件中,我们有:

from datetime import datetime
import pytz

def get_current_utc_time():
    """Returns the current UTC time as a formatted string."""
    utc_now = datetime.now(pytz.utc)
    return utc_now.strftime("%Y-%m-%d %H:%M:%S")

def convert_time_to_timezone(timezone_str):
    """Converts the current UTC time to a specified timezone."""
    try:
        local_zone = pytz.timezone(timezone_str)
        local_time = datetime.now(local_zone)
        return local_time.strftime("%Y-%m-%d %H:%M:%S")
    except pytz.exceptions.UnknownTimeZoneError:
        return "Invalid timezone."

如果简单地将源代码视为文本,我们可以使用文本分割器(例如LangChain中的CharacterTextSplitter)根据字符分割文本。它会将源代码分为:

############################ Chunk 1 ############################
from datetime import datetime
import pytz

def get_current_utc_time():
    """Returns the current UTC time as a formatted string."""
    utc_now = datetime
############################ Chunk 2############################
                      .now(pytz.utc)
    return utc_now.strftime("%Y-%m-%d %H:%M:%S")

def convert_time_to_timezone(timezone_str):
    """Converts the current UTC time to a specified timezone."""
    try:
        local_zone = pytz.timezone(timezone_str)
        local_time = date

############################ Chunk 3############################
                         time.now(local_zone)
        return local_time.strftime("%Y-%m-%d %H:%M:%S")
    except pytz.exceptions.UnknownTimeZoneError:
        return "Invalid timezone."

这样的分割方式显然破坏了函数的完整性,这给后面的RAG检索造成了困难,如果我们询问“convert_time_to_timezone 函数的作用是什么? ”。它很难正确回答问题,因为“convert_time_to_timezone”函数被分为两个块,很难同时被检索并且组合到一起。

当然,也有专门针对源代码设计的分割器,比如LlamaIndex中的CodeSplitter。它们使用第三方工具基于源代码生成抽象语法树(AST)。 AST 是表示程序的树形数据结构。下面是来自维基百科的一个例子:

while b ≠ 0:
    if a > b:
        a := a - b
    else:
        b := b - a
return a

AST 可以识别每个源代码组件(类、函数……)的确切位置边界。使用CodeSplitter,我们就可以获得以下chunk:

############################ Chunk 1 ############################
from datetime import datetime
import pytz

############################ Chunk 2 ############################
def get_current_utc_time():
    """Returns the current UTC time as a formatted string."""
    utc_now = datetime.now(pytz.utc)
    return utc_now.strftime("%Y-%m-%d %H:%M:%S")

############################ Chunk 3 ############################
def convert_time_to_timezone(timezone_str):
    """Converts the current UTC time to a specified timezone."""
    try:
        local_zone = pytz.timezone(timezone_str)
        local_time = datetime.now(local_zone)
        return local_time.strftime("%Y-%m-%d %H:%M:%S")
    except pytz.exceptions.UnknownTimeZoneError:
        return "Invalid timezone."

现在,如果询问“convert_time_to_timezone 函数的作用是什么?”,应该能够被正确检索并回答。

(注:以上是维基百科的例子,但实际使用发现和langchain的CharacterTextSplitter差不多,感兴趣的可以尝试一下。)

然而,即使将源代码拆分为结构有意义的块,也面临着丢失chunk内部和chunk之间关系的信息的挑战。源代码与自然语言有着根本的不同——它具有特定的结构并且是可执行的,代码库中的文件具有固有的结构并且它们之间存在依赖关系。用这种碎片化方式处理源代码的 RAG 系统将难以应对诸如“time_utils.py 文件中定义了多少个函数?”,或 “列出使用变量 local_zone 的所有文件”之类的查询。这些问题的答案不一定位于单个块、函数、类或文件中。为了有效地回答此类查询,必须具备对整个代码库进行推理的能力。这正是在代码库上构建知识图变得无价的地方。

二、如何在代码仓库上构建知识图谱

在代码库上构建图在软件工程领域并不是一个新概念。有很多工作对源代码进行静态分析和动态分析来构建图,用于机器代码优化或漏洞检测。

简单的知识图谱

在这里,我们展示如何在代码库上构建一个简单的知识图,以允许LLM对整个代码库进行推理。在示例图中,使用蓝色节点表示文件/目录,使用绿色节点表示 AST 节点。在文件节点之间,父目录和子文件之间有 HAS_FILE 边;在文件节点和 AST 节点之间,源代码文件和根 AST 节点之间有 HAS_AST 边;在 AST 节点之间,父 AST 节点和子 AST 节点之间有 HAS_PARENT 边:

然后将这个图存储在Neo4J等图数据库中,而之前的问题:“time_utils.py文件中定义了多少个函数? ”,或 “列出使用变量 local_zone 的所有文件”可以用能够生成以下答案的 LLM 来回答:

Generated Cypher:
MATCH (f:file {filename: 'time_util.py'})-[:HAS_AST]->(root:ast)
MATCH (root)-[:PARENT_OF*]->(func:ast {type: 'function_definition'})
RETURN count(func) AS NumberOfFunctions
Full Context:
[{'NumberOfFunctions': 2}]

{'input': 'How many functions are defined in the time_utils.py file?',
 'output': 'There are 2 functions defined in the time_utils.py file.'}
Generated Cypher:
MATCH (f:file)-[:HAS_AST]->(root:ast)
MATCH (root)-[:PARENT_OF*]->(func:ast{{type: 'identifier', text: 'local_zone'}})
RETURN f
Full Conext:
[{'f': { 'filename': 'time_utils.py' }}]

{'input': 'List all files where the variable local_zone is used.',
 'output': 'The variable local_zone is used in the time_utils.py file'}

通过这种方式,LLM 根据用户查询生成 Cypher 查询,并使用结果进行响应。这些查询可以由 LLM 使用 LangChain GraphCypherQAChain 生成。此外,如果你在知识图上构建一个RAG Agent,可以提示它多次查询图数据库,然后将多个Cypher 查询链接起来,解决更复杂的问题。

更高级的知识图谱

知识图可以使用静态分析中使用的其他类型的图来进一步扩展,例如数据流图或控制流图。更有意思的是图能够动态合并运行时数据(或来自动态分析),例如测试的覆盖率,合并这些动态信息将使LLM有更大的潜力解决更困难的问题。


总结

本文回答了为什么在代码仓库中构建知识图谱,以及如何构建知识图谱。

具体涉及到代码的RAG索引构建、知识图谱的构建和使用场景。知识图谱无论是作为RAG工程的一部分,还是作为Agent的一个工具都是值得深入探索的。

更多关于代码仓库的内容可谷歌学术搜索:“repository level coding” or “repository level code llm” 

Reference

[1] Allamanis, Miltiadis, Marc Brockschmidt, and Mahmoud Khademi. “Learning to represent programs with graphs.” arXiv preprint arXiv:1711.00740 (2017).

[2] Yasunaga, Michihiro, and Percy Liang. “Graph-based, self-supervised program repair from diagnostic feedback.” International Conference on Machine Learning. PMLR, 2020.

[3] Chen, Zimin, et al. “PLUR: A unifying, graph-based view of program learning, understanding, and repair.” Advances in Neural Information Processing Systems 34 (2021): 23089–23101.

[4] Wang, Xin, et al. “CODE-MVP: Learning to represent source code from multiple views with contrastive pre-training.” arXiv preprint arXiv:2205.02029 (2022).

[5] Lou, Yiling, et al. “Boosting coverage-based fault localization via graph-based representation learning.” Proceedings of the 29th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering. 2021.

[6] Luo, Qinyu, et al. “RepoAgent: An LLM-Powered Open-Source Framework for Repository-level Code Documentation Generation.” arXiv preprint arXiv:2402.16667 (2024).

[7] Bairi, Ramakrishna, et al. “Codeplan: Repository-level coding using llms and planning.” arXiv preprint arXiv:2309.12499 (2023).

[8] Phan, Huy N., et al. “RepoHyper: Better Context Retrieval Is All You Need for Repository-Level Code Completion.” arXiv preprint arXiv:2403.06095 (2024).

标签:RAG,仓库,图谱,代码,time,timezone,源代码,local
From: https://blog.csdn.net/m0_68116052/article/details/143188043

相关文章

  • 高效实现仓库与财务系统数据集成
    仓库旺店通同步金蝶:实现高效数据集成在企业信息化管理中,数据的准确性和时效性至关重要。本文将分享一个实际案例,展示如何通过数据集成平台,实现旺店通·企业奇门的数据无缝对接到金蝶云星空系统。本次集成方案名为“仓库旺店通同步金蝶”,旨在确保仓库管理数据能够快速、准确地传递......
  • gitlab新建仓库上传代码
    gitlab新建仓库(1-4条):https://blog.csdn.net/dongjing991/article/details/136210782本地文件上传gitlab:https://docs.pingcode.com/ask/ask-ask/135576.html 具体内容:1、新建仓库在GitLab上创建新仓库:登录到GitLab账户。点击页面顶部的“+”按钮,选择“Newproject”。填......
  • 一文读懂RAG和LLM微调,教你结合业务场景落地LLM应用
    随着大家对大型语言模型(LLM)的兴趣激增,许多开发者也在构建基于LLM的应用。当直接使用Prompt驱动的LLM表现不如预期时,问题就出现了:如何提高LLM应用的可用性。这时我们需要权衡:是选择检索增强生成(Retrieval-AugmentedGeneration缩写RAG)还是模型微调来改善结果?01在深入探......
  • RAFT:一种适应特定领域RAG的大模型训练新方法!
    对大量文本数据的语料库进行大型语言模型(LLMs)的预训练已经成为一种标准范式。当将这些LLMs用于许多下游应用时,通常还会通过基于RAG的提示或微调,将新知识(例如,时效性新闻或私有领域知识)额外融入预训练模型中。然而,模型获取这些新知识的最优方法论仍然是一个开放的问题。在此背......
  • 计算机毕业设计Python+大模型知识图谱中华古诗词可视化 古诗词智能问答系统 古诗词数
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!开发技术:前端:vue.jsechartsD3.js后端:Flask/Django机器学习/深度学习:LSTM情感分析模型、PyTorch、T......
  • 计算机毕业设计Spark+大模型动漫推荐系统 动漫视频推荐系统 漫画分析可视化大屏 漫画
    《Spark+大模型动漫推荐系统》开题报告与任务书一、引言随着互联网技术的飞速发展,动漫产业的数据量急剧增长。用户面临着海量动漫作品的选择难题,如何从这些数据中高效地提取有价值的信息,为用户推荐符合其喜好的动漫作品,成为当前动漫产业亟需解决的问题。基于Spark的大数据处......
  • 计算机毕业设计Python+Spark知识图谱课程推荐系统 课程用户画像系统 课程大数据 课程
    《Python+Spark知识图谱课程推荐系统》开题报告一、研究背景与意义随着互联网技术的快速发展,在线教育平台已成为人们获取知识、提升技能的重要途径。然而,面对海量的课程资源,用户往往难以快速找到符合自己兴趣和需求的课程。传统的课程推荐系统大多基于简单的规则或统计方法,难......
  • java计算机毕业设计仓库管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在现代商业运营中,仓库管理的重要性日益凸显。随着企业规模的不断扩大和业务量的增加,传统的仓库管理方式面临着诸多挑战。例如,商品种类和数量繁多......
  • AI大模型时代下运维开发探索第二篇:基于大模型(LLM)的数据仓库
    在SREWorks社区聚集了很多进行运维数仓建设的同学,大家都会遇到类似的挑战和问题:数仓中存储大量数据消耗成本,但很多存储的数据却并没有消费。进数仓的ETL学习成本高、管理成本高,相关同学配合度低,以及上游结构改动后ETL却迟迟无人调整。数仓中数据的时效性、准确性问题,导致很......
  • LocalStorage和SessionStorage存储
    认识Storage◼WebStorage主要提供了一种机制,可以让浏览器提供一种比cookie更直观的key、value存储方式:cookie:服务器返回自动返回一个cooki,浏览器将cookie存储到本地,浏览器再发送请求自动把cooki传递过去localStorage:本地存储,提供的是一种永久性的存储方法,在关闭掉网页......