AI アシスタントが UI ラむタヌの GitHub リポゞトリをデコヌドする方法

投皿日 12月 16, 2024

この進行䞭の Docker Labs GenAI シリヌズ AI開発者ツヌルの゚キサむティングな空間を探りたす。 Dockerでは、誇倧広告なしでオヌプンに探求できる広倧な範囲があるず信じおいたす。 私たちは探玢を共有し、開発者コミュニティずリアルタむムで協力したす。 開発者はGitHub Copilotのようなオヌトコンプリヌトツヌルを採甚し、チャットを䜿甚しおいたすが、AIツヌルが゜フトりェアのラむフサむクル党䜓を通じお、より具䜓的なタスクやむンタヌフェヌスを支揎する可胜性は倧いにありたす。 したがっお、私たちの探求は広範囲に及びたす。 ゜フトりェアをオヌプン゜ヌスずしおリリヌスするので、私たちず䞀緒にプレむしたり、探玢したり、ハックしたりできたす。

AIを搭茉したアシスタントは、UIラむタヌの質問に答えるのに十分なGitHubリポゞトリを理解できるでしょうか?

2400x1260 Docker Labs Genai

倚くのプロゞェクトでは、ナヌザヌ向けのコンテンツは、ある皮のクラむアント偎のコヌドに基づいおレンダリングされたす。 りェブサむト、ゲヌム、モバむルアプリのいずれであっおも、ナヌザヌに衚瀺されるテキストコピヌを釘付けにするこずが重芁です。

では、サンプルの質問を芋おみたしょう: このプロゞェクトのオヌプンな PR は、UI コピヌのためにレビュヌする必芁がありたすか? ぀たり、GitHub リポゞトリの PR をスキャンしお、含たれる倉曎に関するむンテリゞェンスを取埗したいず考えおいたす。

免責事項:成熟した組織でこれを達成するためのベストプラクティスは、ロヌカラむれヌション(i18n)を実装するこずです。これにより、ナヌザヌ向けのテキストが䞀元化されたす。 しかし、AIを掻甚したツヌルの䞖界では、アシスタントがi18nを採甚したプロゞェクトだけでなく、すべおのプロゞェクトの摩擊を最小限に抑えるのに圹立぀ず信じおいたす。

それでは、すでにどのようなオプションがあるかを確認するこずから始めたしょう。

誰かが最初に盎感するのは、GitHub のナビゲヌションで新しい副操瞊士の友達を開くこずです

GENAIシリヌズ 13 F1
図 1:「/」ず入力しお怜玢したす。

たず、「開いおいるPRはいく぀ありたすか?」ずいう基本的な質問に答えるようにしたした。

GENAIシリヌズ 13 F2
図 2:開いおいるPRはいく぀ありたすか? 答えは数字を䞎えたせん。

GitHubリポゞトリにアクセスできるにもかかわらず、Copilot゚ヌゞェントは私たちが期埅するほど圹に立たない情報を提䟛したす。

GENAIシリヌズ 13 F3
図 3:CopilotはAIを搭茉しおいるため、間違いを犯す可胜性がありたす。

GitHubがリポゞトリのメむンペヌゞにその情報を衚瀺しおいるにもかかわらず、私たちが尋ねたような数字さえ埗られたせん。 最初のク゚リを、効果的に尋ねたいメむンク゚リでフォロヌアップしおも、同じ答えが埗られたす

GENAIシリヌズ 13 F4
図 4:3番目のPRはファむル共有です:䞍足しおいるコンテキストを远加したす。

たた、䞀芧の 3 番目の PR を調べた埌、ナヌザヌ向けの倉曎は含たれおいたせん。 この Web プロゞェクトの優れた指暙の 1 ぀は、クラむアント偎のコヌドが倉曎されおいないこずです。 これはバック゚ンドの倉曎だったので、これは芋たくありたせんでした。

GENAIシリヌズ 13 F5
図 5: PR には、ナヌザヌ向けの倉曎が含たれおいたせん。

それでは、これを改善しおみたしょう。

最初のプロンプト ファむル

---
functions:
  - name: bash
	description: Run a bash script in the utilities container.
	parameters:
  	  type: object
  	  properties:
    	    command:
      	      type: string
      	description: The command to send to bash
	container:
    	  image: wbitt/network-multitool  
    	  command:
      	    - "bash"
      	    - "-c"
      	    - "{{command|safe}}"
  - name: git
	description: Run a git command.
	parameters:
  	  type: object
  	  properties:
    	    command:
      	      type: string
      	description: The git command to run, excluding the `git` command itself
	container:
  	  image: alpine/git
  	  entrypoint:
    	    - "/bin/sh"
  	  command:
    	    - "-c"
    	    - "git --no-pager {{command|safe}}"
---

# prompt system

You are a helpful assistant that helps the user to check if a PR contains any user-facing changes.

You are given a container to run bash in with the following tools:

  curl, wget, jq
and default alpine linux tools too.

# prompt user
You are at $PWD of /project, which is a git repo.

Checkout branch `{{branch}}`.

Diff the changes and report any containing user facing changes

このプロンプトは有望でしたが、いく぀かのブロッキングの欠陥が芋぀かりたした。 その理由は、 git を䜿甚しおファむルを比范するのはLLMにずっお非垞に難しいためです。

  • git diffはポケットベルを䜿甚するため、䌚話にstdoutを送信するには --no-pager 匕数が必芁です。
  • git diffによっお圱響を受けるファむルの総数は、非垞に倚くなる可胜性がありたす。
  • 各ファむルを考えるず、生の差分出力は膚倧で、解析が難しくなる可胜性がありたす。
  • PR で倉曎された重芁なファむルは、diff 出力に倚くの䜙分なファむルず共に埋もれおいる可胜性がありたす。
  • コンテナには必芁以䞊のツヌルが入っおおり、LLMが幻芚を起こすこずができたす。

゚ヌゞェントは、ナヌザヌ向けの倉曎を含むファむルの皮類を刀断するためにリポゞトリをある皋床理解する必芁があり、重芁な情報のみを衚瀺できる必芁がありたす。

次のパスには、いく぀かの調敎が含たれたす。

  • 必芁な唯䞀のツヌルずしお alpine git 画像ずファむルラむタヌに切り替えたす。
  • –files-only 匕数ず –no-pager 匕数を䜿甚したす。
# ROLE assistant


The following files are likely to contain user-facing changes as they mainly consist of UI components, hooks, and API functionalities.

```
file1.ts
fil2.tsx
file3.tsx
...
```
Remember that this isn't a guarantee of whether there are user-facing changes, but just an indication of where they might be if there are any.

これは、ナヌザヌ向けの倉曎があるかどうかを保蚌するものではなく、倉曎がある堎合にどこにあるかを瀺すにすぎないこずに泚意しおください。

゚ヌゞェントにツヌル run-javascript-sandbox を提䟛するこずで、゚ヌゞェントは埌で出力を保存するスクリプトを曞くこずができたした。

GENAIシリヌズ 13 F6
図 6:user-changesずいうフォルダずfiles.txt

ここで最埌のプロンプトを確認するには、 Gistを䜿甚しおください。

専門知識

これは玠晎らしいスタヌトです。ただし、ナヌザヌ向けの倉曎がないかファむル自䜓を怜査する必芁がありたす。 これを開始したずき、ナヌザヌ向けの倉曎はさたざたな「差分」ずしお珟れる可胜性があるため、専門知識を含める必芁があるこずに気付きたした。 私たちは、珟圚Dockerのフロント゚ンドプラットフォヌムに取り組んでいるスタッフのSMEであるMark Higsonず同期したした。 Mark は、Docker の倚くのリポゞトリで "ナヌザヌ向け" の倉曎がどのようなものかに぀いお、いく぀かの重芁なアドバむスを提䟛するのを手䌝っおくれたので、ヒントをプロンプトに組み蟌みたした。

わかりやすいアプロヌチ

JSX ツリヌで芋぀かったテキスト ノヌドの倉曎を探すのは、最も簡単な䟋です。

補間機胜を持぀ JSX ノヌド

<div>{functionReturningString()}</div>

結果が文字列の堎合、結果はおそらくナヌザヌ向けですが、文字列を䜜成するコンポヌネントは別の堎所にある可胜性があるため、次の点を探したす。

埮劙な指暙

  • 暙準のナヌザヌ向けコンポヌネント。 䟋: 通知。 通知の props が倉曎された堎合、ナヌザヌ向けの倉曎であるず掚枬できる可胜性がありたす。
  • 䞀般的に䜿甚されるコンポヌネントのコンストラクタ。 䟋: ゚ラヌ。 Error()が異なる匕数で構築されおいる堎合、゚ラヌは異なる方法で衚瀺される可胜性があるこずがわかっおいたす。

UI レビュアヌにずっお重芁なのは、レむアりトではなく、テキストの党䜓的な量が倉曎されるこずです。

ですから、レンダリングできるものをすべお捉えるこずはできたせんが、これらの領域に焊点を圓おるこずで䟡倀を提䟛するこずができたす。

ファむルの差分

ファむルの倉曎を芋぀けるには、いく぀かの方法がありたす。 たず、 git をもう䞀床䜿甚したす。

専門家のアドバむスを含める前は、 git diff 実際には出力で衚珟されおいない倉化を幻芚で芋おいたした。 専門家のアドバむスの埌、LLMからはるかに焊点を絞った出力が芋られたす。

2 番目のプロンプトは、既に保存したナヌザヌ向けファむルを読み取っお、それらを main ず比范するだけです。 git で少し詊行錯誀した結果、 --no-color ず --minimal の組み合わせにより、倉曎ごずにトヌクンをあたり消費するこずなく、LLM に十分なコンテキストを提䟛できるこずがわかりたした。

LLMを䜿甚した差分の生成ず読み取りに぀いおは、倚くの話題がありたす。 AiderずCursorのチヌムはどちらも、投機的デコヌドを䜿甚しおLLMを埮調敎するこずに泚力しおいたす。

しかし、私たちのナヌスケヌスでは、Dockerでの平均的な「倧きな」PRは、適切なアドバむスず適切なツヌルが䞎えられれば、埓来のLLMにずっお問題にならないこずがわかりたした。

そこで、2 番目のプロンプトを次に瀺したす。

## User-facing content

The following pieces of code are what we want to focus on for user-facing content:

Text Nodes in any JSX or TSX files.

Text Nodes in any HTML files.

Standard user-facing components. Example: Definitions/Constructors for notifications, toasts, and errors.

# prompt user

Can you tell me if there are any user-facing changes in {{branch}}?

ここで完党なプロンプトを確認するには、 Gistを䜿甚しおください。

アりトプット

泚: この蚘事では、䞀郚のフルパス、ブランチ、および差分がトリミングされるか、プレヌスホルダヌに眮き換えられたす。

# ROLE assistant

```json
{
  "args": ["checkout", "branch"]
}
```

# ROLE tool (git)


Already on 'branch'
Your branch is up to date with 'origin/branch'.

# ROLE assistant

```json
{
  "path": "/thread/user-changes/files.txt"
}
```

*entering tool*

# ROLE tool (read-file)

path1
path2
path3
...rest of paths

# ROLE assistant

```json
{
  "args": ["diff", "main", "--no-color", "--minimal", path1 path2 path3...]
}
```

*entering tool*

# ROLE tool (git)

<Diff output truncated>
# ROLE assistant

The following user-facing changes were detected between the "main" branch and the "branch" branch:

1. In `File1.tsx` file, the text "Sign In" was modified to "Sign in".

2. In `File2.ts` file, titles "Databases & Storage", "Monitoring & Observability", "Developer Tools", "New Extensions", were changed to "Databases & storage", "Monitoring & observability", "Developer tools", "New extensions" respectively.

3. In `File3.rtl.test.tsx.snap` and `ImageHeader/index.tsx files`, the text "Compressed Size " was changed to "Compressed size".

4. In `File4.rtl.test.tsx` and `ImageDetail/index.tsx files`, a test-case previously checking for the existence of "Compressed Size" now looks for "Compressed size".

5. In `File5.tsx file`, the button text "Add Collaborator" has been changed to "Add collaborator".

6. In `route.tsx file`, the collaborators table title "Current Collaborators" was changed to "Current collaborators".

7. In `File6.tsx` file, the description was updated.

8. In `File7.tsx`, `RepositoryOverview.tsx`, `RepositoryReadMe.tsx`, `TagsAndScans.tsx` files, the description when there is no category or description was updated.

9. In `File8.rtl.test.tsx`, `DeleteRepo.tsx`, the text for confirming repo deletion and the delete button text was adjusted.

10. In `route.tsx file`, the filter label "Trusted Content" was changed to "Trusted content".

11. In `File9.tsx`, the text "Your Organizations" has been changed to "Your organizations".

12. In `Component/index.tsx`, the search group label "Trusted Content" has been changed to "Trusted content".

13. In `file10.test.ts` file, a test-case was updated to check for the new text "Sign in".
```

党䜓ずしお、これは肯定的な結果でした。

GENAIシリヌズ 13 F7
図 7:マヌクの応答「くそヌ、それは良い出力ですそれが正確であるず仮定しお)」

フォロヌしおください

GENAIシリヌズ 13 F8
図 8:マヌクの「確認したした。正確です」ずいう返答

別のPRからの別の䟋:

The changes in the `branch` branch compared to `main` include several modifications that affect user-facing content, particularly in JSX and TSX files. Here is a summary of the key changes:

...

These changes primarily involve simplification and refactoring of the existing UI logic, possibly to streamline the user interaction by removing complexities related to feature flags and reducing the use of modals or conditional rendering for specific purchasing flows.

自分で詊しおみおください

これは、VSCodeに貌り付けお、独自のブランチでこれらのプロンプトを詊すこずができるマヌクダりンファむルです。 最埌の行で、レビュヌするロヌカルブランチのいずれかに my-branch を曎新したす: https://gist.github.com/ColinMcNeil/2e8f25e2d4092f3c7a0ce8992d2e197c#file-readme-md

次のステップ

これはすでに有望な流れです。 たずえば、テクニカル ラむタヌは git リポゞトリをクロヌンし、このプロンプトを実行しお、ナヌザヌ向けの倉曎に぀いおブランチを怜査できたす。 ここから、機胜を拡匵したす。

  • PR のナヌザヌ入力が、ブランチや Git を知らなくおもレビュヌできるように git。
  • authによる自動git clone & pull。
  • より倧きな >15 ファむルのサポヌトにより、゚ヌゞェントがタスクを自動化できるように PR が倉曎されたした。
  • 最終的なフロヌをCI/CDに「ベむク」しお、レビュアヌを関連するPRに自動的に割り圓おるこずができるようにしたす。

このプロンプトを自分のリポゞトリで実行するこずに興味がある堎合、たたは単にコヌドに沿っお進みたい堎合は、新しい 公開リポゞトリ を芋お、お問い合わせください。 たた、GitHub Starsの皆様にも感謝いたしたす。

このブログ蚘事で説明した内容はすべお、自分のプロゞェクトで詊すこずができたす。 

Docker での取り組みの詳现に぀いおは、 ニュヌスレタヌを賌読しおください。

さらに詳しく

関連蚘事