# Vector Search On GitHub

This article presents a prototype that enhances GitHub's search functionality using semantic search technology with Manticore Search's Vector Search. It highlights the limitations of traditional keyword searches and introduces vector search as a more effective method that understands context and meaning, rather than just matching keywords. The piece outlines the setup and benefits of using vector search to navigate GitHub repositories more efficiently, showcasing examples of improved search accuracy and relevance.

## 介绍

GitHub 的搜索功能有时会遇到困难，尤其是在您尝试通过直接提问的方式进行搜索时。这种方法通常会导致不相关的结果，这可能会让人感到沮丧。在搜索问题或拉取请求时，这种问题更为明显，因为细节非常重要。

让我们看一个例子：

![GitHub 搜索 vs Manticore 语义搜索 on GitHub](./github-semantic-search/github-vs-manticore-semantic-search.png)

GitHub 的搜索功能有一些限制，但搜索技术领域正在迅速进步。语义搜索，它理解词语背后的上下文和含义，而不仅仅是词语本身，正变得越来越流行。尽管 GitHub 尚未添加此功能，但它确实可以帮助使搜索更加准确和相关。

考虑到这一点，我们构建了一个 [项目](https://github.manticoresearch.com)，该项目使用 **语义搜索** 来帮助开发人员更轻松地在他们的仓库中找到所需内容。我们使用 [Manticore Search](https://manticoresearch.com)，它支持向量搜索，以提供一个可定制的 **语义搜索** 选项，以满足不同的需求。这展示了这项新技术的有用性和强大之处。

顺便说一下，[Manticore Search](https://manticoresearch.com) 是一个功能强大的开源搜索引擎，经受住了时间的考验，其历史可以追溯到 2001 年。最初名为 Sphinx，它曾作为 MySQL 和 PostgreSQL 数据库的全文搜索解决方案。该项目在 2017 年被分叉并重生为 **Manticore Search**，继续作为独立的、完全开源的搜索引擎发展。

## 什么是语义搜索？

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

### 优势

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

## **GitHub 上传统搜索的问题**

当您在 GitHub 上使用简单关键词进行搜索时，通常无法找到您真正想要的内容。例如，您输入 "bug fix" 来寻找一些帮助。搜索可能会显示包含 "bug fix" 的页面，但可能会错过相关主题，如 "error resolution" 或 "problem solving"。

这种类型的搜索会导致大量无用的结果。由于这些搜索无法捕捉我们说话的细微差别，您可能会感到相当沮丧。开发人员最终会浪费太多时间浏览这些不相关的结果，这可能会减慢他们的项目进度并减少他们的工作量。

尽管如此，关键词搜索仍然有其用武之地。对于快速、具体的搜索，当您确切知道需要什么时，比如查找特定的错误代码，它们可以非常快速且直接。

在这里，我们正在搜索 ["integration bugfix" on GitHub](https://github.com/search?q=repo%3Amanticoresoftware%2Fmanticoresearch+integration+bugfix&type=issues)，并在同一个仓库中找不到任何结果：

![GitHub 上的 Integration Bug Fix](./github-semantic-search/integration-bugfix-github.png)


而在 Manticore 语义搜索中搜索 [integration bugfix](https://github.manticoresearch.com/manticoresoftware/manticoresearch?query=integration%20bugfix;search=semantic-search;filters[index]=issues) 给我们提供了更可能令人满意的结果：

![Manticore 语义搜索上的 Integration Bug Fix](./github-semantic-search/integration-bugfix-manticore.png)

我们已经制作了一个原型，展示了 GitHub 上语义搜索可能的样子。查看我们的 [GitHub 问题搜索演示](https://github.manticoresearch.com/manticoresoftware/manticoresearch?;search=semantic-search)，该演示由 Manticore 向量搜索提供支持。它允许您以理解上下文的方式搜索 GitHub 问题、PR 和评论。这在您无法记住问题的确切词语但知道其上下文时特别有用。您也可以在这里 [添加自己的仓库](https://github.manticoresearch.com/)，并按照 [GitHub 上的说明](https://github.com/manticoresoftware/manticore-github-issue-search#demo-github-search-with-manticore-search) 在本地运行该项目。

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

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

当我们将向量搜索集成到我们的 [GitHub 问题搜索演示](https://github.manticoresearch.com/) 中时，该演示展示了 Manticore Search 的功能，结果令人印象深刻。传统关键词搜索在查询中已知特定术语且匹配这些术语的准确性至关重要的情况下非常有效。然而，语义搜索的添加通过允许我们更精确地确定用户正在寻找的内容来补充这一点，特别是在查询的意图或含义与使用的具体词语一样重要的上下文中。

使用来自 [Hugging Face](https://huggingface.co/) 的预训练模型，我们将文本转换为高维向量。这些向量理解词语背后的含义，使我们能够进行更准确的搜索。

以下是一些示例，说明它如何提高在 [Manticore Search 仓库](https://github.manticoresearch.com/manticoresoftware/manticoresearch) 中的搜索质量：

### 示例：更容易找到开放的错误

![Memory Leak Example](./github-semantic-search/memory-leak-sample.png)

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

### 示例：在创建新功能请求前检查是否存在

![User Authentication Example](./github-semantic-search/user-authentication-sample.png)

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

### 示例：更轻松的协作

![API Rate Limits Example](./github-semantic-search/api-rate-limits-sample.png)

在项目不同部分工作的贡献者可以真正从语义搜索中受益。例如，搜索 **"API 速率限制"** 会带来关于 **"限流"**、**"250 个结果"** 限制和 **"速率限制"** 的相关讨论。这帮助团队成员即使使用不同术语也能连接相关问题。

### 示例：安全审计

![SQL Injection Example](./github-semantic-search/sql-injection-sample.png)

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

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

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

- **设置 Manticore**：我们通过 [安装 Manticore Search](https://manticoresearch.com/install/) 并结合 [Columnar 库](https://github.com/manticoresoftware/columnar/) 来实现向量搜索功能，将 Manticore Search 集成到我们的项目中。

- **创建数据库结构**：我们在 Manticore Search 中设置了一个实时表来存储 GitHub 问题及其语义表示。这些表示也称为嵌入，以数字数组（也称为向量）形式存储。表包含字段用于问题文本、唯一标识符和捕获文本语义含义的向量。

    以下是使用的模式示例：

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

    在此设置中，`body` 存储问题的文本，`id` 是唯一标识符，`vector` 是 `body` 的文本嵌入。

    你可能会问：**什么是文本嵌入？**

    **文本嵌入** 是一种将单词或短语转换为数字的方法，这些数字显示其含义及其相互关系。可以将其视为一种将文本转换为计算机可以理解的格式的方法。这些数字表示帮助机器更好地分析文本，使比较不同文本和发现相似性变得更加容易。

    在我们的示例中，向量是一系列数字，这些数字捕捉了 `body` 字段中文本的主要思想。这使我们能够执行诸如查找类似问题或根据不同的词语描述相同想法来分组相关主题等操作。

    我们使用了来自 [Sentence Transformers](https://huggingface.co/sentence-transformers) 的 AI 模型。如果你想轻松入门，我们建议查看 HuggingFace 的 [文本嵌入 API 服务](https://github.com/huggingface/text-embeddings-inference)。它允许你运行自己的 API 并创建符合你需求的嵌入。

- **插入数据**：用向量数据填充你的表。

    让我们看看如何使用我们刚刚讨论的模式执行插入语句。这将给我们一个清晰的画面，了解数据是如何添加到我们的数据库结构中的。

    ```sql
    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. 使用生成的向量进行如下查询：


    ```sql
    SELECT id, body
    FROM issues
    WHERE knn ( vector, 10, (0.286569, -0.031816, 0.066684, 0.032926) );
    ```

    注意，`10` 是参数 K，表示在结果集中保留的最近邻（最接近的向量）数量。默认情况下，结果按向量距离排序，最接近的排在最前面。

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

## 关键字搜索 vs 语义搜索

在增强 GitHub 上的代码搜索时，**语义搜索** 提供了一些明显的优势：

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

然而，重要的是要考虑 **语义搜索** 相比传统的 **关键字搜索** 的局限性：

- **计算复杂性**：运行语义搜索可能需要大量的处理能力，并且可能比关键字搜索花费更长时间，尤其是在大型代码库中。
- **误解的可能性**：AI可能无法始终正确理解查询的上下文或意图，导致结果相关性降低。
- **缺乏精确控制**：当搜索引擎解释含义而不是匹配关键字时，开发人员可能更难找到确切的短语或特定的代码片段。
- **依赖训练数据**：语义搜索结果的质量与AI模型的训练数据密切相关，这意味着它可能无法始终与最新的代码模式或术语完全一致。

鉴于这些考虑，GitHub搜索的未来很可能采用混合方法。通过结合语义搜索和关键字搜索的优势，GitHub可以为开发人员提供更强大的工具：

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

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

## GitHub搜索的未来：借助语义搜索更智能

GitHub传统的基于关键字的搜索将向更智能、更直观的方法演进：语义搜索。这项变革性技术将彻底改变开发人员与代码库的交互方式，提高生产力，并使开发过程更加顺畅，尤其是在搜索拉取请求、问题和评论时。

**拉取请求、问题和评论的语义搜索**提供了几个关键优势：

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

由于像**Manticore Search**这样的先进数据库的出现，语义搜索的实现变得越来越可行。凭借其内置的**向量搜索**功能，Manticore Search正在为GitHub等平台采用这项前沿技术铺平道路。

尽管GitHub尚未完全集成语义搜索，但开发者可以通过我们的[演示项目](https://github.com/manticoresoftware/manticore-github-issue-search)体验其强大功能。这个开源项目展示了语义搜索在类似GitHub环境中的潜力。
