为了账号安全,请及时绑定邮箱和手机立即绑定

Gemini 的长上下文窗口功能可以帮你提升代码库

开发人员经常需要处理陌生的代码库。在这个过程中可能会犯错,偶尔会犯错。

让我们看看生成式AI能为整个项目或应用做什么。我们能否导入所有的源代码,理解它们之间的关系并提供见解?

Gemini 中的 2 million 令牌的上下文窗口 带来了各种新的可能性。你可以把所有源代码打包成一个 单一提示。你会在提示里问些什么问题呢?

开始

让我们从一个简单直接的解决方案开始,这个方案可以轻松扩展到数千个源代码文件。比如,我们可以从代码库中提取所有文本文件,然后简单地把它们拼接在一起。

项目文件夹结构也能提供有意义的上下文,并使文件间的关系更加明确。你可能还会发现提前加入索引能提升性能。

让我们来看看摘要任务的提示可能是什么样的。

总结以下源代码的内容以及它的作用:

    概述以下源代码的内容和功能:  

    目录:  
    /README.md  
    /docs/开发指南.md  
    /src/adservice/Dockerfile  
    /src/adservice/src/main/java/hipstershop/AdService.java  
    /src/adservice/src/main/java/hipstershop/AdServiceClient.java  

    /README.md:  
    Online Boutique 是一个基于云的微服务展示应用。该应用是一个基于网络的电子商务应用,用户可以浏览商品,将它们加入购物车,并进行购买。  
    ...  

    /docs/开发指南.md:  
    本指南说明如何使用 skaffold 命令行工具本地构建和运行 Online Boutique 源代码。  
    ...

特别是在这个笔记本中,您可以找到用于将代码库打包的代码。该笔记本位于Google Cloud生成式AI的GitHub仓库的代码库部分。

笔记本使用了一个基于深度学习的库,名为Magika,用于检测内容类型。它在打包过程中会跳过二进制文件。它可以识别单一的内容类型,也可以识别内容类型组。下面是一个从笔记本中选择代码和文本的代码片段:

    import magika  

    m = magika.Magika()  

    def 提取代码(repo_dir):  
     # 遍历目录树(略)  

          file_type = m.identify_path(Path(file_path))  
          if file_type.output.group in ('文本', '代码'):  
              # 将文件内容添加到提示中(略)  

    return 代码索引, 代码内容

一个 get_code_prompt 辅助函数被提供用来将每个组件封装成一个提示。我们将在这里插入 extract_code 提取的索引和代码。我们将根据任务向该函数传递一个特定的问题。

    def get_code_prompt(question):  
       """生成与代码相关问题的回答提示."""  

       prompt = f"""  
       问题: {question}  

       上下文:  
       - 整个代码库如下提供。  
       - 以下是代码库中所有文件的索引:  
         \n\n{code_index}\n\n  
       - 然后将每个文件拼接在一起。您将找到所有需要的代码:  
         \n\n{code_text}\n\n  

       答案:  
     """  

       return prompt

你也可以找到例如c2pgpt-repository-loader,或repo2prompt等这样的开源工具,在打包时可能会很有用。

使用我们的提示

我们现在来尝试这些功能在常见的开发任务中的应用。我们将使用Online Boutique来进行演示。Online Boutique是GoogleCloudPlatform GitHub组织中最受欢迎的仓库之一,并且在无数演示中被广泛使用。它由11个使用多种编程语言编写的微服务构成。

对于每个任务,我们将提供提示中的问题,然后提供使用gemini-pro-1.5–001模型在Vertex AI上的Gemini(Gemini)回复。笔记本提供了使用数据情况,包括提示中的令牌数。每个在线精品店提示大约包含650,000个令牌,这符合模型的上下文窗口。除了为这篇博客文章更新链接使用绝对路径外,我们未对回复做任何其他自定义修改。

我们将展示3个任务,但还有很多其他工作可以做,从查找错误到绘制架构图。

新手开发者指南
好处

更快速地吸纳新开发人员加入项目,并降低外部贡献者的参与门槛。

问题

提供一份新手指南,帮助新开发者快速上手代码仓库。

截断的回应:部分内容省略

在线网店代码库入门指南

欢迎来到在线商店!这里有个指南可以帮助你浏览代码。你也可以贡献代码。

1. 了解这个应用:

  • 概念: 在线商店模拟了一个云原生的电子商务应用程序,展示了微服务架构的特点,并与多种 Google 云服务集成。
  • 架构: 该应用程序由 11 个微服务组成,每个微服务具有不同的职责,并且用不同的语言编写(Go、C#、Node.js、Python、Java)。它们通过 gRPC 进行通信。请参见 README 以获得每个服务的详细信息。
  • 关键目录:
    -
    protos**: 包含定义各服务间通信所需的数据结构和服务接口的 Protocol Buffer 定义(.proto 文件)。
    - src: 包含所有单独微服务的源代码,按服务名称组织。
    - kubernetes-manifests: 包含用于部署服务的 Kubernetes YAML 文件。
    - kustomize: 提供用于部署具有不同配置的在线商店的 Kustomize 配置(例如 Google Cloud 运维、Istio)。
    - terraform: 提供用于提供基础架构和部署应用程序的 Terraform 脚本。
    - helm-chart: 包含用于部署在线商店的实验性 Helm 图表。
    - docs: 包含开发、部署及其他相关信息的文档。

2. 搭建您的开发环境:

  • 先决条件: 确保已安装所需的工具,包括 Docker、kubectl、skaffold,以及其他可能需要的工具,例如 Terraform 或 Istio。
  • 本地部署: 在开发过程中,您可以使用 skaffold 在本地部署 Online Boutique。请参阅开发指南,其中提供了使用 Minikube、Kind 或 GKE 的说明。
  • Google Cloud Shell: 您可以通过预配置的 Google Cloud Shell 快速开始。请参阅 Cloud Shell 教程。
实现功能需求
好处:

通过添加新功能来改善用户体验。

问题:
实现以下功能需求, https://github.com/GoogleCloudPlatform/microservices-demo/issues/2205  
{issue_body}

issue_body 参数可以由一个预处理脚本填充,该脚本提取功能需求。此特定功能需求要求能够通过类似 --set frontend.service.type=NodePort 的参数在 Helm 图表部署中将前端服务类型设置为 NodePort。这样用户可以快速访问他们在本地环境中部署的应用程序的 Web 接口,而不需要配置负载均衡器或 ingress,从而简化测试和开发过程。

响应被截断了

    --- a/helm-chart/templates/frontend.yaml  
    +++ b/helm-chart/templates/frontend.yaml  
    @@ -89,6 +89,8 @@  
     ---  
     apiVersion: v1  
     kind: Service  
    +{{- if .Values.frontend.externalService }}  
    +{{- else }}  
     metadata:  
       name: {{ .Values.frontend.name }}  
       namespace: {{ .Release.Namespace }}  
    @@ -101,6 +103,7 @@  
       - name: http  
         port: 80  
         targetPort: 8080
更新记录生成工具
优势:

高亮显示提交之间的更改,这些更改可用于自动生成文档内容。

问题:

根据上面的 git diff 输出结果,总结重要的更改内容。

回复如下:

这次更新让 shoppingassistantservice 使用 Google API 密钥,而不是之前的 PostgreSQL 密码。

  • 它将 PostgreSQL 密码占位符替换为 Google API Key。
  • 它指导用户在 Google Cloud Console 的凭证页面创建 API 密钥,并启用生成语言 API。
  • 它更新了 Kustomize 文件,添加了 alloydbshopping-assistant 组件。
扩展到更大规模的代码库

如果你的应用超出了上下文窗口的限制,也有解决办法!

最简单的选项是从提示中排除特定路径或文件类型。这可能意味着排除对你任务帮助较小的大型路径或特定文件类型。这也可能意味着针对不同路径分别运行不同的组件。另一种选择,从宏观角度来看,可以删除或忽略超过一定深度的文件夹。

另外,你可以通过检索增强生成,或简称RAG,来解决一些问题。与其将所有代码放在提示里,你可以将代码库索引到向量存储中。当你提问时,可以搜索与任务最相关的文件并将其包含在提示中。你可以将这种方法视为应用相似度过滤器,而不是路径或文件类型过滤器。这个生成式AI笔记本演示了如何在你的代码库中实现RAG技术。

“小到大”是一种两步的分块策略,在这种策略中,文档(例如源代码文件)会被先总结,然后再转换成向量。在这个示例[notebook]里,提示开始时只包含最相似的摘要,如果有更多上下文需求,则会提供完整的文档。这种方法可以潜在地减少成本,并且可以处理在转换成向量过程中部分含义可能会丢失的复杂文档。

结论部分

今天,生成式AI让许多开发者编写代码更高效,自动生成代码行、函数甚至整个代码块。现在,借助 Gemini Code Assist,AI辅助开发可以在云端或您喜欢的IDE中实现。

在这篇博客文章中,我们探讨了如何通过直接在你的代码库中构建提示来解决各种新的定制问题。Gemini Pro的2M令牌的上下文窗口和高速性能使得这一切变得非常简单。

我要感谢Eric Dong在这些笔记本上的合作,以及Jason Davenport的审阅。你可以通过X / TwitterThreads与我保持联系,继续我们的交流!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消