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 上语义搜索可能样子的原型。查看我们的 GitHub 问题搜索演示 ,它由 Manticore 向量搜索提供支持。它允许你以理解上下文的方式搜索 GitHub 问题、PR 和评论。这在你记不起问题的确切措辞但知道其上下文时尤其有用。你也可以在 这里 添加你自己的存储库,并通过按照 GitHub 上的说明在本地运行该项目。

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

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

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

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

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

示例:更容易找到未解决的bug

Memory Leak Example

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

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

User Authentication Example

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

示例:更容易的协作

API Rate Limits Example

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

示例:安全审计

SQL Injection Example

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

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

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

  • 设置Manticore:我们通过 安装Manticore Search 以及实现向量搜索功能的 Columnar library 将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的文本嵌入。

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

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

    在我们的例子中,向量是一系列数字,捕获了body字段中文本的主要思想。这使我们能够做诸如查找相似问题或将相关主题进行分组,即使它们使用不同的词来描述相同的思想。

    我们使用了来自 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上的代码搜索时,语义搜索提供了一些明显的优势:

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

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

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

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

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

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

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

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

语义搜索在拉取请求、问题和评论中提供了几个主要优势:

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

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

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

安装Manticore Search

安装Manticore Search