AI アシスタントがプロジェクトの Git フックの構成にどのように役立つか

この進行中の Docker Labs GenAI シリーズ では、AI 開発者ツールのエキサイティングな分野を探ります。 Dockerでは、誇大広告なしでオープンに探求する広大な範囲があると信じています。 私たちは、探索を共有し、開発者コミュニティとリアルタイムで協力します。 開発者はGitHub Copilotのようなオートコンプリートツールを採用し、チャットを使用していますが、AIツールは、ソフトウェアのライフサイクル全体を通じて、より具体的なタスクやインターフェースを支援する大きな可能性を秘めています。 したがって、私たちの探求は広範囲に及びます。 オープンソースとしてリリースするので、あなたも私たちと一緒にプレイしたり、探索したり、ハックしたりできます。

AI アシスタントは、プロジェクトの Git フックの設定に役立ちますか? 

Git フックを使用すると、コミット メッセージの作成や更新をコミットする前のチェックの実行など、反復的なタスク中の手動作業を節約できます。 ただし、構成が難しく、プロジェクトに依存する場合もあります。 ジェネレーティブAIはGitフックの設定と使用を容易にすることができますか?

2400x1260 Docker Labs Genai

簡単なプロンプト

大まかに言うと、基本的なプロンプトは単純です。

How do I set up git hooks?

これには実際のプロジェクトに関する詳細は含まれていませんが、多くの基礎モデルからの応答は依然として有用です。 ChatGPT でこのプロンプトを実行すると、応答に.git/hooksの使用方法に関する詳細が含まれていることがわかります フォルダー、フックスクリプトの作成に関するヒント、さらには次に学ぶ必要がある実用的な次のステップ。 しかし、アドバイスは一般的なものです。 プロジェクトによって根拠付けられていない。

プロジェクトのコンテキスト

プロジェクト自体がアシスタントにとって重要な情報源です。 まず、プロジェクト内のソースコードの種類に関する情報を提供しましょう。 幸いなことに、プロジェクトコンテキストを抽出するための既存のツールはたくさんあり、これらのツールは多くの場合、Dockerコンテナですでに利用可能です。 

たとえば、次の イメージ は、任意の Git リポジトリを分析し、使用されている言語の一覧を返します。 この新しいコンテキストでプロンプトを更新しましょう。

How do I set up git hooks?

{{# linguist }}
This project contains code from the language {{ language }} so if you have any 
recommendations pertaining to {{ language }}, please include them.
{{/linguist}}

この例では、 口ひげテンプレート を使用して、「言語学者」分析の出力をこのプロンプトにバインドします。

LLMを搭載したアシスタントからの応答は劇的に変化します。 LLM は、どのような種類のファイルが変更されるかについての具体的なアドバイスを武器に、サンプル スクリプトを生成し、このプロジェクトで開発されたコードの種類に役立つ可能性のある特定のツールについて提案します。 レスポンスからコードを切り取って貼り付け、自分でフックを設定することもできます。 

パターンは非常に単純です。 プロジェクトを分析するツールはすでにあるので、これらをローカルにプラグインして、LLMにより多くのコンテキストを与えて、より良い提案をしましょう(図 1)。

llm のプロジェクト コンテキストを提供するツールの追加を示すフロー チャートの図。 このプロセスには、プロジェクト、ツール(go-linguist)、Dockerデスクトップ、プロンプトテンプレート、llmが含まれます。
図 1: LLM のコンテキストを提供するツールの追加。

ノウハウ

また、ジェネレーティブAIは、AIアシスタントがさらに有用になるために活用できる知識を専門家が提供できる新しい機会を提供します。 たとえば、 pre-commit は、Git フックの実装に使用される一連のツールを整理するのに役立つことを学びました。 

この学習を表すために、次のプロンプトを追加します。

When configuring git hooks, our organization uses a tool called
[pre-commit](https://github.com/pre-commit/pre-commit).

また、すべてのプロジェクトで役立つ基本構成もあります。 また、アシスタントのナレッジベースにも追加します。

If a user wants to configure git hooks, use this template which will need to be written to pre-commit-config.yaml 
in the root of the user's project.

Start with the following code block:

```yaml
repos:
    - repo: http://github.com/pre-commit/pre-commit-hooks
      rev: v2.3.0
      hooks:
          - id: check-yaml
          - id: trailing-whitespace
          - id: check-merge-conflict
    - repo https://github.com/jorisroovers/gitlint
      rev: main
      hooks:
          - id: gitlint
    - repo: local
      hooks:
```

最後に、特定のプロジェクトに役立つ新しいツールについて学習しながら、この情報について説明します。 たとえば、専門家として、Golangを使用するチームに、Gitフック構成に特定のリンティングツールを含めることを提案したい場合があります。

If we detect `Go` in the project, add the following hook to the hooks entry in the `local` repo entry.

```yaml
id: golangcli-lint
name: golang cli
entry: golangci/golangci-lint
files "\\.go$"
```

これらの追加により、アシスタントからの応答が正確になります。 アシスタントがフックスクリプトを記述し、プロジェクト固有でプロジェクトに直接コピーする準備ができている完全なYAML設定ファイルを作成できることがわかりました。 

やや意外なことに、アシスタントは、プロンプトで明示的に言及されていないが、他のツールで確立されたのと同じ構文を使用するツールを推奨することもできます。 これらの例を使用すると、LLM はアシスタントの機能を他のツールに拡張できるように見えます。 例をガイダンスとして使用すると、LLM は新しいツールを提案しますが、提案されたフレームワークと構文を使用して構成します。

最も重要なことは、アシスタントからの応答が開発者にとって実行可能になり、開発者の時間を節約できるだけでなく、応答を単純なエージェントに渡してアクションを自動的に実行できるほど具体的であることです。

ツールの追加

この例では、本当に必要なツールはファイルライターだけです。プロンプトの変更点は、先に進んで設定を書き込むための命令を1つ追加することです。

Write the final yaml content to our project at the path pre-commit-config.yaml.  Write both the `pre-commit` and `commit-message` scripts to `git/hooks` and make them executable.

プロンプトの他に、この時点でスキップしている別の重要なステップがあります。 アシスタントは、コンテンツをファイルに書き込むことができることを通知する必要があります。 ただし、これは実際には登録手順にすぎません。 

重要なことは、エージェントがタスクを実行するために必要なツールを提供できることです。 そうすることで、LLMからの応答は移行を経ます。 テキスト出力の代わりに、LLMはエージェントへの指示で応答します。 OpenAI 関数呼び出しを使用している場合は、次のような要求が表示されます.json ファイル。 もちろん、私たちが読むことを意図したものではありません。 これは、プロジェクトを更新する方法を知っているエージェントへの指示です。

{
  "id": "call_4LCo0CQqCHCGGZea3qlaTg5h",
  "type": "function",
  "function": {
    "name": "write_file",
    "arguments": "{\n  \"path\": \"pre-commit-config.yaml\",\n  \"content\": \"repos:\\n    - repo: http://github.com/pre-commi
t/pre-commit-hooks\\n      rev: v2.3.0\\n      hooks:\\n          - id: check-yaml\\n          - id: trailing-whitespace\\n          - id
: check-merge-conflict\\n    - repo https://github.com/jorisroovers/gitlint\\n      rev: main\\n      hooks:\\n          - id: gitlint\\n
    - repo: local\\n      hooks:\\n          - id: markdownlint\\n            name: markdown linter\\n            entry: markdownlint/mar
kdownlint\\n            files: \\\"\\\\.md$\\\"\\n          - id: python-black\\n            name: python black formatter\\n            e
ntry: black\\n            files: \\\"\\\\.py$\\\"\"\n}"
    }
}

ファイルライター関数のより洗練されたバージョンは、エディターのクイックフィックスやヒントなどのネイティブIDEの概念を使用して、推奨されるファイル変更を開発者に提示できるエディターエージェントと通信する場合があります。 言い換えれば、ツールは、ジェネレーティブAIが開発者のいる場所に会うのに役立ちます。 そして、質問に対する答え:

How do I set up git hooks?

は「見せてあげよう」となる。

ツールエンジンとしてのDocker

前のセクションで説明したツールはすべて Docker コンテナーとして提供されています。 この作業の目標の1つは、アシスタントがDockerのみの環境からブートストラップできることを確認することでした。 Dockerは、LLMが苦労しているシステム/環境のギャップの多くを平準化するために重要であったため、ここで重要です。 

単純なローカルアシスタントをアクティブにすることの大きな障壁は、これらのツールを実行するための安全で信頼性の高い環境を管理する複雑さであることがわかりました。 したがって、私たちは、公的登録簿から怠惰に引き出すことができるツールのみを使用するように自分自身を制約しています。

AIアシスタントがツールの利用方法を変えるためには、ツールの配布と知識の配布の両方が重要な要素であると考えています。 上記の例では、ツールによってLLMの応答が、実行不可能で曖昧なものから、ハイパープロジェクトに焦点を当てた実行可能なものにどのように変換されるかがわかります。 違いはツールです。

この作業を進めるには、このプロジェクトの GitHub リポジトリを確認してください

さらに詳しく