利用 Elasticsearch 作为向量数据库扣问有关你的 GitHub 存储库的问题 ...

打印 上一主题 下一主题

主题 1008|帖子 1008|积分 3024

作者:来自 Elastic Fram Souza

本博客介绍了利用 RAG 和 Elasticsearch 实现语义代码查询的 GitHub Assistant,提供对 GitHub 存储库的洞察,并可扩展到 PR 反馈、问题处理和生产准备情况审查。

该项目允许你直接与 GitHub 存储库交互并利用语义搜索来了解代码库。你将学习如何扣问有关存储库代码的具体问题并收到有意义的上下文感知相应。你可以在此处关注 GitHub 代码。

重要考虑因素:



  • 数据质量:输出的好坏取决于输入 —— 确保数据干净且布局良好。
  • 数据块大小:得当的数据分块对于实现最佳性能至关重要。
  • 性能评估:定期评估基于 RAG 的应用步伐的性能。

组件



  • Elasticsearch:用作向量数据库,可高效存储和检索嵌入。
  • LlamaIndex:由 LLM 提供支持的应用步伐构建框架。
  • OpenAI:用于 LLM 和生成嵌入。

架构




数据摄入 - ingestion

该过程首先将 GitHub 存储库克隆到本地 /tmp 目录。然后利用 SimpleDirectoryReader 加载克隆的存储库进行索引,根据文件类型将文档拆分为块,利用 CodeSplitter 处理代码文件,利用 JSON、Markdown 和 SentenceSplitter 处理其他格式,请参阅:
  1. def parse_documents():
  2.     owner = os.getenv('GITHUB_OWNER')
  3.     repo = os.getenv('GITHUB_REPO')
  4.     branch = os.getenv('GITHUB_BRANCH')
  5.     base_path = os.getenv('BASE_PATH', "/tmp")  
  6.     if not owner or not repo:
  7.         raise ValueError("GITHUB_OWNER and GITHUB_REPO environment variables must be set.")
  8.     local_repo_path = clone_repository(owner, repo, branch, base_path)
  9.     nodes = []
  10.     file_summary = []
  11.     ts_parser = get_parser('typescript')
  12.     py_parser = get_parser('python')
  13.     go_parser = get_parser('go')
  14.     js_parser = get_parser('javascript')
  15.     bash_parser = get_parser('bash')
  16.     yaml_parser = get_parser('yaml')
  17.     parsers_and_extensions = [
  18.         (SentenceSplitter(), [".md"]),
  19.         (CodeSplitter(language='python', parser=py_parser), [".py", ".ipynb"]),
  20.         (CodeSplitter(language='typescript', parser=ts_parser), [".ts"]),
  21.         (CodeSplitter(language='go', parser=go_parser), [".go"]),
  22.         (CodeSplitter(language='javascript', parser=js_parser), [".js"]),
  23.         (CodeSplitter(language='bash', parser=bash_parser), [".bash", ",sh"]),
  24.         (CodeSplitter(language='yaml', parser=yaml_parser), [".yaml", ".yml"]),
  25.         (JSONNodeParser(), [".json"]),
  26.     ]
  27.     for parser, extensions in parsers_and_extensions:
  28.         matching_files = []
  29.         for ext in extensions:
  30.             matching_files.extend(glob.glob(f"{local_repo_path}/**/*{ext}", recursive=True))
  31.         if len(matching_files) > 0:
  32.             file_summary.append(f"Found {len(matching_files)} {', '.join(extensions)} files in the repository.")
  33.             loader = SimpleDirectoryReader(input_dir=local_repo_path, required_exts=extensions, recursive=True)
  34.             docs = loader.load_data()
  35.             parsed_nodes = parser.get_nodes_from_documents(docs)
  36.             print_docs_and_nodes(docs, parsed_nodes)
  37.             nodes.extend(parsed_nodes)
  38.         else:
  39.             file_summary.append(f"No {', '.join(extensions)} files found in the repository.")
  40.     collect_and_print_file_summary(file_summary)
  41.     print("\n")
  42.     return nodes
复制代码
如果你想在此代码中添加更多支持语言,只需将新的解析器和扩展添加到 parsers_and_extensions 列表中即可。解析节点后,利用 text-embedding-3-large 模子生成嵌入并存储在 Elasticsearch 中。嵌入模子利用 Setting 包声明,它是一个全局变量:
  1. Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-large")
复制代码
然后,它会在主函数中作为 Ingest Pipeline 的一部分利用。由于它是一个全局变量,因此在摄取过程中无需再次调用它:
  1.     nodes = parse_documents()
  2.     es_vector_store = get_es_vector_store()
  3.     try:
  4.         pipeline = IngestionPipeline(
  5.             vector_store=es_vector_store,
  6.         )
  7.         pipeline.run(documents=nodes, show_progress=True)
复制代码
上面的代码块首先将文档解析为较小的块(节点),然后初始化与 Elasticsearch 的连接。利用指定的 Elasticsearch 向量存储创建 IngestionPipeline,并执行管道以处理节点并将其嵌入存储在 Elasticsearch 中,同时显示处理过程中的进度。此时,我们应该在 Elasticsearch 中索引你的数据,并生成和存储嵌入。以下是文档在 ESS 中的一个例子:
  1.         "_source": {
  2.           "content": """Changelog
  3. All notable changes to this project will be documented in this file.
  4. **For detailed release notes, please refer to the [GitHub
  5. releases](https://github.com/elastic/synthetics/releases) page.**""",
  6.           "metadata": {
  7.             "file_path": "/tmp/elastic/synthetics/CHANGELOG.md",
  8.             "file_name": "CHANGELOG.md",
  9.             "file_size": 23162,
  10.             "creation_date": "2024-10-08",
  11.             "last_modified_date": "2024-10-08",
  12.             "_node_content": """{"id_": "2918efbb-b1aa-4afa-a505-d584e62d0d87", "embedding": null, "metadata": {"file_path": "/tmp/elastic/synthetics/CHANGELOG.md", "file_name": "CHANGELOG.md", "file_size": 23162, "creation_date": "2024-10-08", "last_modified_date": "2024-10-08"}, "excluded_embed_metadata_keys": ["file_name", "file_type", "file_size", "creation_date", "last_modified_date", "last_accessed_date"], "excluded_llm_metadata_keys": ["file_name", "file_type", "file_size", "creation_date", "last_modified_date", "last_accessed_date"], "relationships": {"1": {"node_id": "b0574471-c909-4fc8-ab82-2165c45ba72a", "node_type": "4", "metadata": {"file_path": "/tmp/elastic/synthetics/CHANGELOG.md", "file_name": "CHANGELOG.md", "file_size": 23162, "creation_date": "2024-10-08", "last_modified_date": "2024-10-08"}, "hash": "58b8f33fdb38603530f1d06333a6d84614d21bb305a2aee4cb74f174fd5037aa", "class_name": "RelatedNodeInfo"}}, "text": "", "mimetype": "text/plain", "start_char_idx": 0, "end_char_idx": 204, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n", "class_name": "TextNode"}""",
  13.             "_node_type": "TextNode",
  14.             "document_id": "b0574471-c909-4fc8-ab82-2165c45ba72a",
  15.             "doc_id": "b0574471-c909-4fc8-ab82-2165c45ba72a",
  16.             "ref_doc_id": "b0574471-c909-4fc8-ab82-2165c45ba72a"
  17.           },
  18.           "embeddings": []
  19.         }
  20.      }
复制代码

查询 - query

一旦数据被索引,你就可以查询 Elasticsearch 索引以扣问有关代码库的问题。query.py 脚本允许你与索引数据进行交互并扣问有关代码库的问题。它从用户那里检索查询输入,利用与 index.py 中利用的相同 OpenAIEmbedding 模子创建嵌入,并利用从 Elasticsearch 向量存储加载的 VectorStoreIndex 设置查询引擎。查询引擎利用相似性搜索,根据查询与存储的嵌入的相似性检索前 3 个最相干的文档。利用 response_mode="tree_summarize" 以树状格式汇总结果,你可以在下面看到代码片段:
  1.     query = input("Please enter your query: ")
  2.     openai_llm = OpenAI(model="gpt-4o")
  3.     es_vector_store = get_es_vector_store()
  4.     index = VectorStoreIndex.from_vector_store(es_vector_store)
  5.     try:
  6.         query_engine = index.as_query_engine(
  7.             llm=openai_llm,
  8.             similarity_top_k=3,
  9.             streaming=False,
  10.             response_mode="tree_summarize"
  11.         )
  12.         bundle = QueryBundle(query, embedding=embed_model.get_query_embedding(query))
  13.         result = query_engine.query(bundle)
  14.         return result.response
复制代码

安装


1. 克隆存储库:

  1. git clone https://github.com/framsouza/github-assistant.git
  2. cd github-assistant
复制代码

2. 安装所需的库:

  1. pip install -r requirements.txt
复制代码

3. 设置情况变量:

利用你的 Elasticsearch 根据和目标 GitHub 存储库详细信息(比方 GITHUB_TOKEN、GITHUB_OWNER、GITHUB_REPO、GITHUB_BRANCH、ELASTIC_CLOUD_ID、ELASTIC_USER、ELASTIC_PASSWORD、ELASTIC_INDEX)更新 .env 文件。
以下是 .env 文件的一个示例:
  1. GITHUB_TOKEN=""
  2. GITHUB_OWNER=""
  3. GITHUB_REPO=""
  4. GITHUB_BRANCH=""
  5. ELASTIC_CLOUD_ID=""
  6. ELASTIC_USER=""
  7. ELASTIC_PASSWORD=""
  8. ELASTIC_INDEX=""
  9. OPENAI_API_KEY=""
复制代码

利用方法


1. 通过运行以下命令索引你的数据并创建嵌入:

  1. python index.py
复制代码

2. 通过运行以下命令扣问有关代码库的问题:

  1. python query.py
复制代码

例子
  1. python query.py                                    
  2. Please enter your query: Give me a detailed list of the external dependencies being used in this repository
  3. Based on the provided context, the following is a list of third-party dependencies used in the given Elastic Cloud on K8s project:
  4. 1. dario.cat/mergo (BSD-3-Clause, v1.0.0)
  5. 2. Masterminds/sprig (MIT, v3.2.3)
  6. 3. Masterminds/semver (MIT, v4.0.0)
  7. 4. go-spew (ISC, v1.1.2-0.20180830191138-d8f796af33cc)
  8. 5. elastic/go-ucfg (Apache-2.0, v0.8.8)
  9. 6. ghodss/yaml (MIT, v1.0.0)
  10. 7. go-logr/logr (Apache-2.0, v1.4.1)
  11. 8. go-test/deep (MIT, v1.1.0)
  12. 9. gobuffalo/flect (MIT, v1.0.2)
  13. 10. google/go-cmp (BSD-3-Clause, v0.6.0)
  14. ...
  15. This list includes both direct and indirect dependencies as identified in the context.None
复制代码

你大概想问的问题


  • Give me a detailed description of what are the main functionalities implemented in the code? - 请详细描述一下代码中实现的重要功能是什么?
  • How does the code handle errors and exceptions? - 代码如何处理错误和非常?
  • Could you evaluate the test coverage of this codebase and also provide detailed insights into potential enhancements to improve test coverage significantly? - 你能否评估此代码库的测试覆盖率,并提供有关潜伏加强功能的详细看法,以显着提高测试覆盖率?

评估

evaluation.py 代码处理文档,根据内容生成评估问题,然后利用 LLM 评估相应的相干性(相应是否与问题相干)和老实度(相应是否老实于源内容)。以下是有关如何利用代码的分步指南:
  1. python evaluation.py --num_documents 5 --skip_documents 2 --num_questions 3 --skip_questions 1 --process_last_questions
复制代码
你可以在不利用任何参数的情况下运行代码,但上面的示例演示了如何利用参数。以下是每个参数的作用的详细说明:

文档处理:



  • --num_documents 5:脚本将总共处理 5 个文档。
  • --skip_documents 2:将跳过前 2 个文档,脚本将从第 3 个文档开始处理。因此,它将处理文档 3、4、5、6 和 7。

问题生成:

加载文档后,脚本将根据这些文档的内容生成问题列表。


  • --num_questions 3:在生成的问题中,仅处理 3 个问题。
  • --skip_questions 1:脚本将跳过列表中的第一个问题,并从第二个问题开始处理问题。
  • --process_last_questions:脚本将跳过第一个问题后处理前 3 个问题,而是处理列表中的后 3 个问题。
  1. Number of documents loaded: 5
  2. \All available questions generated:
  3. 0. What is the purpose of chunking monitors in the updated push command as mentioned in the changelog?
  4. 1. How does the changelog describe the improvement made to the performance of the push command?
  5. 2. What new feature is added to the synthetics project when it is created via the `init` command?
  6. 3. According to the changelog, what is the file size of the CHANGELOG.md document?
  7. 4. On what date was the CHANGELOG.md file last modified?
  8. 5. What is the significance of the example lightweight monitor yaml file mentioned in the changelog?
  9. 6. How might the changes described in the changelog impact the workflow of users creating or updating monitors?
  10. 7. What is the file path where the CHANGELOG.md document is located?
  11. 8. Can you identify the issue numbers associated with the changes mentioned in the changelog?
  12. 9. What is the creation date of the CHANGELOG.md file as per the context information?
  13. 10. What type of file is the document described in the context information?
  14. 11. On what date was the CHANGELOG.md file last modified?
  15. 12. What is the file size of the CHANGELOG.md document?
  16. 13. Identify one of the bug fixes mentioned in the CHANGELOG.md file.
  17. 14. What command is referenced in the context of creating new synthetics projects?
  18. 15. How does the CHANGELOG.md file address the issue of varying NDJSON chunked response sizes?
  19. 16. What is the significance of the number #680 in the context of the document?
  20. 17. What problem is addressed by skipping the addition of empty values for locations?
  21. 18. How many bug fixes are explicitly mentioned in the provided context?
  22. 19. What is the file path of the CHANGELOG.md document?
  23. 20. What is the file path of the document being referenced in the context information?
  24. ...
  25. Generated questions:
  26. 1. What command is referenced in relation to the bug fix in the CHANGELOG.md?
  27. 2. On what date was the CHANGELOG.md file created?
  28. 3. What is the primary purpose of the document based on the context provided?
  29. Total number of questions generated: 3
  30. Processing Question 1 of 3:
  31. Evaluation Result:
  32. +---------------------------------------------------+-------------------------------------------------+----------------------------------------------------+----------------------+----------------------+-------------------+------------------+------------------+
  33. | Query                                             | Response                                        | Source                                             | Relevancy Response   | Relevancy Feedback   |   Relevancy Score | Faith Response   | Faith Feedback   |
  34. +===================================================+=================================================+====================================================+======================+======================+===================+==================+==================+
  35. | What command is referenced in relation to the bug | The `init` command is referenced in relation to | Bug Fixes                                          | Pass                 | YES                  |                 1 | Pass             | YES              |
  36. | fix in the CHANGELOG.md?                          | the bug fix in the CHANGELOG.md.                |                                                    |                      |                      |                   |                  |                  |
  37. |                                                   |                                                 |                                                    |                      |                      |                   |                  |                  |
  38. |                                                   |                                                 | - Pick the correct loader when bundling TypeScript |                      |                      |                   |                  |                  |
  39. |                                                   |                                                 | or JavaScript journey files                        |                      |                      |                   |                  |                  |
  40. |                                                   |                                                 |                                                    |                      |                      |                   |                  |                  |
  41. |                                                   |                                                 |   during push command #626                         |                      |                      |                   |                  |                  |
  42. +---------------------------------------------------+-------------------------------------------------+----------------------------------------------------+----------------------+----------------------+-------------------+------------------+------------------+
  43. Processing Question 2 of 3:
  44. Evaluation Result:
  45. +-------------------------------------------------+------------------------------------------------+------------------------------+----------------------+----------------------+-------------------+------------------+------------------+
  46. | Query                                           | Response                                       | Source                       | Relevancy Response   | Relevancy Feedback   |   Relevancy Score | Faith Response   | Faith Feedback   |
  47. +=================================================+================================================+==============================+======================+======================+===================+==================+==================+
  48. | On what date was the CHANGELOG.md file created? | The date mentioned in the CHANGELOG.md file is | v1.0.0-beta-38 (20222-11-02) | Pass                 | YES                  |                 1 | Pass             | YES              |
  49. |                                                 | November 2, 2022.                              |                              |                      |                      |                   |                  |                  |
  50. +-------------------------------------------------+------------------------------------------------+------------------------------+----------------------+----------------------+-------------------+------------------+------------------+
  51. Processing Question 3 of 3:
  52. Evaluation Result:
  53. +---------------------------------------------------+---------------------------------------------------+------------------------------+----------------------+----------------------+-------------------+------------------+------------------+
  54. | Query                                             | Response                                          | Source                       | Relevancy Response   | Relevancy Feedback   |   Relevancy Score | Faith Response   | Faith Feedback   |
  55. +===================================================+===================================================+==============================+======================+======================+===================+==================+==================+
  56. | What is the primary purpose of the document based | The primary purpose of the document is to provide | v1.0.0-beta-38 (20222-11-02) | Pass                 | YES                  |                 1 | Pass             | YES              |
  57. | on the context provided?                          | a changelog detailing the features and            |                              |                      |                      |                   |                  |                  |
  58. |                                                   | improvements made in version 1.0.0-beta-38 of a   |                              |                      |                      |                   |                  |                  |
  59. |                                                   | software project. It highlights specific          |                              |                      |                      |                   |                  |                  |
  60. |                                                   | enhancements such as improved validation for      |                              |                      |                      |                   |                  |                  |
  61. |                                                   | monitor schedules and an enhanced push command    |                              |                      |                      |                   |                  |                  |
  62. |                                                   | experience.                                       |                              |                      |                      |                   |                  |                  |
  63. +---------------------------------------------------+---------------------------------------------------+------------------------------+----------------------+----------------------+-------------------+------------------+------------------+
  64. (clean_env) (base) framsouza@Frams-MacBook-Pro-2 git-assistant %
  65. +-------------------------------------------------+------------------------------------------------+------------------------------+----------------------+----------------------+-------------------+------------------+------------------+------+------------------+
  66. Processing Question 3 of 3:
  67. Evaluation Result:
  68. +---------------------------------------------------+---------------------------------------------------+------------------------------+----------------------+----------------------+-------------------+------------------+------------------+-----------+------------------+
  69. | Query                                             | Response                                          | Source                       | Relevancy Response   | Relevancy Feedback   |   Relevancy Score | Faith Response   | Faith Feedback   |Response   | Faith Feedback   |
  70. +===================================================+===================================================+==============================+======================+======================+===================+==================+==================+===========+==================+
  71. | What is the primary purpose of the document based | The primary purpose of the document is to provide | v1.0.0-beta-38 (20222-11-02) | Pass                 | YES                  |                 1 | Pass             | YES              |           | YES              |
  72. | on the context provided?                          | a changelog detailing the features and            |                              |                      |                      |                   |                  |                  |           |                  |
  73. |                                                   | improvements made in version 1.0.0-beta-38 of a   |                              |                      |                      |                   |                  |                  |           |                  |
  74. |                                                   | software project. It highlights specific          |                              |                      |                      |                   |                  |                  |           |                  |
  75. |                                                   | enhancements such as improved validation for      |                              |                      |                      |                   |                  |                  |           |                  |
  76. |                                                   | monitor schedules and an enhanced push command    |                              |                      |                      |                   |                  |                  |           |                  |
  77. |                                                   | experience.                                       |                              |                      |                      |                   |                  |                  |           |                  |
  78. +---------------------------------------------------+---------------------------------------------------+------------------------------+----------------------+----------------------+-------------------+------------------+------------------+-----------+------------------+
复制代码

现在怎么办?

以下是你可以利用此代码的几种方法:


  • 通过扣问有关代码的问题(比方定位函数或了解代码各部分的工作原理)深入了解特定的 GitHub 存储库。
  • 构建一个多代理 RAG 系统,该系统可提取 GitHub PR 和问题,从而实现对问题的自动相应和对 PR 的反馈。
  • 将你的日志和指标与 Elasticsearch 中的 GitHub 代码相联合,利用 RAG 创建生产停当审查,帮助评估服务的成熟度。
祝你 RAG 舒畅!

准备好自己尝试一下了吗?开始免费试用。
Elasticsearch 集成了 LangChain、Cohere 等工具。加入我们的 Beyond RAG Basics 网络研讨会,构建你的下一个 GenAI 应用步伐!

原文:Ask questions about your GitHub repository with Elasticsearch as a vector database - Search Labs

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表