blog-post

在 GitHub 上的向量搜索

引言

GitHub 的搜索功能有时会遇到困难,尤其是当你试图通过直接提问来搜索时。这种方法往往会导致无关的结果,这可能令人沮丧。这个问题在搜索问题或拉取请求时更为明显,因为细节确实很重要。

让我们看一个例子:

GitHub 搜索与 Manticore 语义搜索对比

GitHub 的搜索有一些限制,但搜索技术的世界正在快速改善。语义搜索理解单词背后的上下文和含义,而不仅仅是单词本身,正在变得越来越流行。虽然 GitHub 还没有添加这个功能,但它确实可以帮助改善搜索的质量和相关性。

考虑到这一点,我们构建了一个 项目 ,使用 语义搜索 来帮助开发者更轻松地在他们的仓库中找到东西。我们使用 Manticore Search ,它支持向量搜索,提供一个可定制的 语义搜索 选项,以满足不同的需求。这展示了这项新技术的实用性和强大之处。

顺便提一下, Manticore Search 是一个强大的开源搜索引擎,经过时间的考验,其根源可以追溯到 2001 年。最初被称为 Sphinx,它作为 MySQL 和 PostgreSQL 数据库的全文搜索解决方案。该项目在 2017 年被分叉并重生为 Manticore Search,继续作为一个独立的、完全开源的搜索引擎不断发展。

什么是语义搜索?

语义搜索 是一种超越简单关键词匹配的搜索技术。它试图理解单词的含义和上下文,以提高搜索准确性,考虑用户的意图和术语的上下文含义。

好处

  • 上下文理解: 它解释查询的上下文,以提供精确的结果。
  • 提高准确性: 通过理解用户意图,减少无关结果。
  • 增强用户体验: 通过快速提供相关信息,节省时间和精力。

GitHub 上传统搜索的问题

当你在 GitHub 上使用简单关键词搜索时,往往得不到你真正想要的结果。假设你输入“bug fix”来寻找一些帮助。搜索可能会显示确切提到“bug fix”的页面,但可能会错过相关主题,如“错误解决”或“问题解决”。

这种搜索方式可能会导致大量无用的结果。由于这些搜索无法捕捉我们谈话的细微差别,你可能会感到相当沮丧。开发者最终会浪费太多时间在这些无关结果上,这可能会拖慢他们的项目进度,减少他们的工作效率。

不过,关键词搜索仍然有其存在的价值。对于快速、具体的搜索,当你确切知道自己需要什么时,比如寻找特定的错误代码,它们可以非常快速且直接。

我们在 GitHub 上寻找 "integration bugfix" 时,在同一仓库中没有找到任何结果:

GitHub 上的集成错误修复

而在 Manticore 语义搜索中对 integration bugfix 的相同搜索则给出了我们更可能满意的结果:

Manticore 语义搜索中的集成错误修复

我们制作了一个 GitHub 上语义搜索可能的原型。查看我们由 Manticore 向量搜索驱动的 GitHub 问题搜索演示 。它允许你以理解上下文的方式搜索 GitHub 问题、PR 和评论。这在你记不清问题的确切措辞但知道其上下文时尤其有用。你还可以在 这里 添加自己的仓库,并按照 GitHub 上的说明本地运行该项目。

让我们看看这种方法如何提高搜索结果的相关性和准确性。

成功案例:将向量搜索添加到 Manticore GitHub 演示中

当我们将向量搜索集成到我们的 GitHub 问题搜索演示 中时,展示了 Manticore Search 的能力,结果令人印象深刻。传统的关键词搜索在已知特定术语且匹配这些术语的准确性至关重要的查询中非常有效。然而,语义搜索的加入通过允许我们更精确地定位用户所寻找的内容,尤其是在查询的意图或含义与使用的特定单词同样重要的上下文中,补充了这一点。

使用来自 Hugging Face 的预训练模型,我们将文本转换为高维向量。这些向量理解单词背后的含义,使我们能够进行更准确的搜索。

这里有一些例子说明它如何改善 Manticore Search repository 中的搜索质量:

示例:更轻松地查找开放的错误

Memory Leak Example

想象一下,你是一名开发者,正在寻找与特定错误相关的问题。传统的“内存泄漏”搜索可能会错过标题为**“限制内存使用”“索引超出内存”**的问题。使用向量搜索,搜索引擎知道这些术语是相似的。这意味着你可以获得所有相关结果,而无需猜测所有可能的关键词。

示例:在打开新请求之前检查功能请求是否存在

User Authentication Example

想想用户在搜索与“用户认证”相关的功能请求。关键词搜索可能只显示确切短语的问题,但语义搜索理解相关术语,如**“登录系统”“访问被拒绝”“会话级用户变量”**。这样,就不会错过任何有价值的反馈。

示例:更轻松的协作

API Rate Limits Example

在项目不同部分工作的贡献者可以从语义搜索中受益匪浅。例如,搜索**“API速率限制”会带出与“节流”“250个结果”限制和“速率限制”**相关的讨论。这帮助团队成员连接相关问题,即使他们使用不同的术语。

示例:安全审计

SQL Injection Example

安全审计需要彻底,通常需要搜索不同的安全漏洞。使用传统关键词方法搜索**“SQL注入”可能会错过“数据库渗透”“SQL漏洞”**下的问题。语义搜索确保找到所有相关的安全问题,帮助进行更全面的安全审计。

如何在GitHub上使用Manticore Search开始语义搜索

为了在我们的GitHub演示项目中实现语义搜索,我们遵循了以下步骤:

  • 设置Manticore:我们通过 安装Manticore Search 以及实现向量搜索功能的 Columnar库 将Manticore Search集成到我们的项目中。

  • 创建数据库结构:我们在Manticore Search中设置了一个实时表,以存储GitHub问题及其语义表示。这些表示,也称为嵌入,作为数字数组(也称为向量)存储。该表包括问题文本、唯一标识符和捕获文本语义含义的向量字段。

    这是我们使用的模式示例:

    CREATE TABLE issues (
    	id BIGINT,
    	body TEXT,
    	vector FLOAT_VECTOR knn_type='hnsw' knn_dims='4' hnsw_similarity='l2'
    );
    

    在这个设置中,body保存问题的文本,id是唯一标识符,vectorbody的文本嵌入。

    你可能会问:什么是文本嵌入?

    文本嵌入是一种将单词或短语转换为数字的方法,这些数字显示它们的含义以及它们之间的关系。可以把它看作是一种将文本转换为计算机可以理解的格式的方法。这些数字表示帮助机器更好地分析文本,使比较不同文本和找到相似之处变得更容易。

    在我们的示例中,向量是一系列数字,捕获了正文字段的主要思想。这使我们能够做一些事情,比如查找相似问题或分组相关主题,即使它们使用不同的词来描述相同的想法。

    我们使用了来自 Sentence Transformers 的AI模型。如果你想要一个简单的入门方法,我们建议查看HuggingFace的 文本嵌入API服务 。它让你运行自己的API并创建量身定制的嵌入。

  • 插入数据:用向量数据填充你的表。

    让我们看看插入语句如何与我们刚才讨论的模式一起工作。这将给我们一个清晰的图景,了解数据是如何添加到我们的数据库结构中的。

    INSERT INTO issues VALUES (
      1,
      'Hello World',
      (0.653448, 0.192478, 0.017971, 0.339821)
    ), (
      2,
      'This is a bug',
      (-0.148894, 0.748278, 0.091892, -0.095406)
    );
    
  • 查询数据:使用基于向量的查询检索上下文相关信息。

    要使用向量查询获取文档,我们遵循以下步骤:

    1. 获取搜索查询。
    2. 为查询生成一个文本嵌入
    3. 在查询中使用生成的向量,如下所示:
    SELECT id, body
    FROM issues
    WHERE knn ( vector, 10, (0.286569, -0.031816, 0.066684, 0.032926) );
    

    请注意,10是参数K,表示在结果集中保留的最近邻(最接近的向量)数量。默认情况下,结果按向量距离排序,最接近的结果首先出现。

这就是结束!通过几个步骤,我们使用文本嵌入和Manticore Search的向量搜索功能构建了一个语义搜索。就是这么简单!🙌

关键词搜索与语义搜索

在提升GitHub上的代码搜索时,语义搜索提供了一些明显的优势:

  • 更好的搜索结果:语义搜索理解查询背后的含义,使你能够找到相关代码,即使它与使用的确切关键词不匹配。
  • 上下文感知的代码探索:它可以更智能地浏览大型代码库,帮助你理解不同代码片段之间的关系。
  • 高效的故障排除:通过理解上下文,语义搜索可以快速呈现相关问题、解决方案和代码片段,帮助更快地解决错误。
  • 更容易发现相关的实现和想法:它可以根据代码的意图识别相似的实现或建议替代方法,而不仅仅是根据其措辞。

然而,考虑到语义搜索与传统关键词搜索的局限性是很重要的:

  • 计算复杂性:运行语义搜索可能需要显著的处理能力,并且可能比关键词搜索花费更长的时间,尤其是在大型代码库中。
  • 误解的潜在可能性:AI可能并不总是正确理解查询的上下文或意图,从而导致结果不够相关。
  • 缺乏精确控制:当搜索引擎解释含义而不是匹配关键词时,开发者可能会发现更难找到确切的短语或特定的代码片段。
  • 依赖于训练数据:语义搜索结果的质量与AI模型的训练数据密切相关,这意味着它可能并不总是与最新的代码模式或术语完美对齐。

考虑到这些因素,GitHub搜索的未来可能在于一种混合方法。通过结合语义搜索和关键词搜索的优势,GitHub可以为开发者提供更强大的工具:

  • 用户界面选项:允许用户根据其即时需求在语义搜索和关键词搜索之间切换。
  • 混合搜索算法:将语义搜索的深刻理解与关键词匹配的精确性结合,以提供最相关的结果。
  • 上下文切换:根据查询类型和用户行为自动选择最佳搜索方法,确保最佳的结果。

将这两种方法纳入GitHub的搜索能力将帮助开发者更快、更高效地找到正确的代码,平衡语义搜索的细致理解与关键词搜索的可靠性和速度。

GitHub搜索的未来:更智能的语义搜索

GitHub的传统基于关键词的搜索将朝着更智能、更直观的方法演变:语义搜索。这项颠覆性技术将彻底改变开发者与代码库的互动方式,提高生产力,使开发过程更加顺畅,尤其是在搜索拉取请求、问题和评论时。

语义搜索对于拉取请求、问题和评论提供了几个关键优势:

  1. 上下文感知结果:与依赖于精确关键词匹配的传统搜索不同,语义搜索理解查询背后的上下文和意图。这意味着即使它们没有使用您搜索的确切词语,您也更有可能找到相关的拉取请求、问题和评论。
  2. 自然语言处理:您可以使用日常语言进行搜索,而无需记住特定的语法或关键词。这使得找到所需内容变得更容易。
  3. 改进的相关性排名:语义搜索可以根据结果与查询的含义匹配的紧密程度来优先排序,从而在浏览大量拉取请求、问题或评论时节省时间。
  4. 对同义词和相关概念的理解:搜索引擎可以识别相关术语和概念,扩大相关结果的范围,而无需进行多次搜索。
  5. 增强的协作:通过更容易找到相关讨论和贡献,语义搜索可以改善团队协作和项目内的知识共享。
  6. 历史背景:语义搜索有潜力理解问题和拉取请求中讨论的演变,提供更全面的结果,包括相关的历史背景。
  7. 跨代码库的洞察:高级语义搜索可能提供跨多个代码库的洞察,帮助开发者发现其他项目中的相关讨论或解决方案。

得益于Manticore Search等先进数据库,语义搜索的实现变得更加可行。凭借其内置的向量搜索能力,Manticore Search正在为像GitHub这样的平台采用这项尖端技术铺平道路。

虽然GitHub尚未完全整合语义搜索,但开发者可以通过我们的 演示项目 体验其强大功能。这个开源项目展示了在类似GitHub的环境中语义搜索的潜力。

安装Manticore Search

安装Manticore Search