AI / MLLLM

Claude 3 (Opus)で公開しているライブラリの説明文を作らせてみた(複数ファイル編)

以前の1ファイルのライブラリの実験に続き、今回は複数ファイルで構成されたライブラリを使用して、使い方やドキュメントの生成などの実験をおこないました。”aws-api-responsebuilder”はAWS Lambda関数でAPIGatewayのレスポンスを構築するための便利なライブラリで、インストールから使い方まで詳細に解説されています。フルエントインターフェースを活用し、型安全性が確保されています。README.mdの生成に利用することも可能です。

広告ここから
広告ここまで

以前1ファイルで提供されているライブラリのソースコードを使って、readmeなどのドキュメント生成や使い方について回答できるRAGを作るための実験を行いました。

https://wp-kyoto.net/building-product-usage-generator-with-llm

今回は複数ファイルで構成されているライブラリで試します。

対象とするリポジトリ

  • https://github.com/wpkyoto/aws-api-responsebuilder
  • ファイル数が3つと少なく、コード量も多くないライブラリ
  • 自分で作ったものなので、挙動や使い方はだいたい把握している
  • ドキュメント周りの整備ができていないので、あわよくば生成物をそのまま使いたい

進め方

進め方自体は前回の記事とほぼ同じです。ファイル数が増えているので、そこだけ少し工夫を入れてみました。

  • 3ファイルのコードを、手動でコピー&ペーストする形でClaudeに渡す
  • 各ファイルの内容を説明するテキストを生成させる
  • その内容を踏まえて、使い方を紹介するテキストを生成させる

このOSSはnpmで"aws-api-responsebuilder"として公開されています。このライブラリの使い方を詳細に説明してください。

生成結果

Claudeで生成を行ったところ、次のようなテキストが生成できました。

"aws-api-responsebuilder"は、AWS Lambda関数でAPIGatewayのレスポンスを構築するためのユーティリティライブラリです。以下に、このライブラリの使い方を詳細に説明します。

1. インストール:
   - npmを使用してライブラリをインストールします。
     ```
     npm install aws-api-responsebuilder
     ```

2. インポート:
   - ライブラリをインポートします。
     ```typescript
     import { ResponseBuilder } from 'aws-api-responsebuilder';
     ```
   - または、デフォルトインポートを使用することもできます。
     ```typescript
     import ResponseBuilderModule from 'aws-api-responsebuilder';
     const { ResponseBuilder } = ResponseBuilderModule;
     ```

3. レスポンスの構築:
   - `ResponseBuilder`オブジェクトを使用してレスポンスを構築します。
   - ステータスコードを設定するには、`setStatusCode()`メソッドを使用します。
     ```typescript
     ResponseBuilder.setStatusCode(200);
     ```
   - ヘッダーを設定するには、`updateHeader()`メソッドまたは`putHeaders()`メソッドを使用します。
     ```typescript
     ResponseBuilder.updateHeader('Content-Type', 'application/json');
     ResponseBuilder.putHeaders({
       'Cache-Control': 'no-cache',
       'Pragma': 'no-cache'
     });
     ```
   - ボディを設定するには、`setBody()`メソッドを使用します。
     ```typescript
     const body = { message: 'Success' };
     ResponseBuilder.setBody(body);
     ```
   - ボディを削除するには、`unsetBody()`メソッドを使用します。
     ```typescript
     ResponseBuilder.unsetBody();
     ```

4. レスポンスの取得:
   - 構築したレスポンスを取得するには、`getResponse()`メソッドを使用します。
     ```typescript
     const response = ResponseBuilder.getResponse();
     ```
   - 返される`response`オブジェクトは、`APIGatewayProxyResult`型になります。

5. レスポンスのカスタマイズ:
   - `ResponseBuilder`オブジェクトはデフォルトの設定を持っています。
   - デフォルトのステータスコードは500(Internal Server Error)です。
   - デフォルトのヘッダーには、CORSに関連するヘッダーが設定されています。
   - デフォルトのボディには、"Internal Server Error"というメッセージが設定されています。
   - これらのデフォルト設定は、`ResponseBuilder`のメソッドを呼び出すことでオーバーライドできます。

6. 型安全性:
   - TypeScriptを使用している場合、`ResponseBuilder`オブジェクトはジェネリック型パラメータをサポートしています。
   - `Body`型パラメータを使用して、レスポンスボディの型を指定できます。
   - `Headers`型パラメータを使用して、レスポンスヘッダーの型を指定できます。
   - これにより、型の安全性が確保され、コンパイル時にエラーを防ぐことができます。

以下は、"aws-api-responsebuilder"を使用した基本的な例です。

```typescript
import { ResponseBuilder } from 'aws-api-responsebuilder';

const response = ResponseBuilder
  .setStatusCode(200)
  .updateHeader('Content-Type', 'application/json')
  .setBody({ message: 'Success' })
  .getResponse();

console.log(response);
```

この例では、ステータスコードを200に設定し、Content-Typeヘッダーを'application/json'に設定し、ボディを`{ message: 'Success' }`に設定しています。最後に、`getResponse()`メソッドを呼び出して構築されたレスポンスを取得しています。

"aws-api-responsebuilder"は、AWS Lambda関数でAPIGatewayのレスポンスを構築する際に、シンプルで直感的なインターフェースを提供します。フルエントインターフェースを採用しているため、メソッドチェーンを使って読みやすいコードを書くことができます。また、型安全性も確保されているため、TypeScriptを使用する場合は型のミスマッチを防ぐことができます。

かなり細かい説明が生成できています。見出しなどのMarkdown構文を調整すれば、そのまreadme.mdにも使えそうな感じですね。ちなみに元々作成していたREADME.mdのサンプルコードはこちらでした。

import AWSAPIs from 'aws-api-responsebuilder'

const { ResponseBuilder } = AWSAPIs
ResponseBuilder.setStatusCode(400)
ResponseBuilder.setBody({
    message: `Invalid Request`,
    code: 'invalid_request'
})
console.log(ResponseBuilder.getResponse())

{ statusCode: 400,
  headers:
   { 'Access-Control-Allow-Origin': '*',
     'Access-Control-Allow-Credentials': true },
  body: '{"message":"Invalid Request","code":"invalid_request"}' }

実装方法のコードや、実行結果についてもそこまで間違いがあるようにも見えません。

コードの使い方について質問してみる

今回試している手法では、コードそのものはLLMに渡さずに実装内容などの説明だけを渡しています。この状態で実装内容やバグなどに関する相談をすると、どのような振る舞いになるかを試してみます。

    これはテストに使ったプロンプトです。

    以下にnpmで"aws-api-responsebuilder"として公開されているライブラリに含まれるコードの説明文を入力します。
    
    ## libs/ResponseBuilder.ts
    AWS Lambda関数でAPIGatewayプロキシ統合を使用する際に、レスポンスを構築するためのインターフェースとビルダークラスを定義しています。
    
    1. `APIGatewayResponseHeaders`インターフェース:
       - APIGatewayのレスポンスヘッダーを表現するインターフェースです。
       - ヘッダーのキーは文字列で、値は`boolean`、`number`、`string`のいずれかです。
    
    2. `ResponseBuilder`インターフェース:
       - レスポンスを構築するためのビルダーインターフェースを定義しています。
       - ジェネリック型パラメータ`Body`はレスポンスのボディの型を表し、デフォルトは`any`です。
       - ジェネリック型パラメータ`Headers`はレスポンスヘッダーの型を表し、デフォルトは`APIGatewayResponseHeaders`です。
    
       このインターフェースには以下のメソッドが含まれています:
       - `setStatusCode(code: number)`: レスポンスのステータスコードを設定します。
       - `updateHeader(key: string, value: string)`: 指定されたキーと値でレスポンスヘッダーを更新します。
       - `putHeaders(headers: Headers)`: レスポンスヘッダーを一括で設定します。
       - `setBody(body?: Body)`: レスポンスのボディを設定します。ボディが指定されない場合、空のボディが設定されます。
       - `unsetBody()`: レスポンスのボディを削除します。
       - `getResponse()`: 構築されたレスポンスを`APIGatewayProxyResult`型で返します。
    
       これらのメソッドは、フルエントインターフェースパターンに従っているため、メソッドチェーンを使って連続的に呼び出すことができます。
    
    このファイルは、AWS Lambda関数でAPIGatewayのレスポンスを柔軟かつ型安全に構築するためのユーティリティを提供しています。`ResponseBuilder`インターフェースを実装することで、レスポンスのステータスコード、ヘッダー、ボディを設定し、最終的な`APIGatewayProxyResult`を取得することができます。
    
    このインターフェースを使用することで、レスポンスの構築をより簡潔で読みやすいコードで行うことができ、また型安全性も確保されます。
    
    ## libs/ResponseFactory.ts
    このファイルは、前のファイルで定義された`ResponseBuilder`インターフェースを実装する`ResponseFactory`クラスを提供しています。`ResponseFactory`は、AWS Lambda関数でAPIGatewayのレスポンスを構築するためのファクトリークラスです。
    
    1. `ResponseFactory`クラス:
       - `init<Body, Headers>()`静的メソッドを提供します。このメソッドは、`ResponseBuilder`インターフェースを実装したオブジェクトを返します。
       - ジェネリック型パラメータ`Body`はレスポンスのボディの型を表し、デフォルトは`any`です。
       - ジェネリック型パラメータ`Headers`はレスポンスヘッダーの型を表し、デフォルトは`APIGatewayResponseHeaders`です。
    
    2. `init<Body, Headers>()`メソッド:
       - `APIGatewayProxyResult`型の`response`オブジェクトを初期化します。
       - デフォルトのステータスコードは500(Internal Server Error)です。
       - デフォルトのヘッダーとして、`Access-Control-Allow-Origin`と`Access-Control-Allow-Credentials`を設定します。
       - デフォルトのボディには、`message`プロパティに"Internal Server Error"を設定します。
    
       このメソッドは、`ResponseBuilder`インターフェースを実装したオブジェクトを返します。オブジェクトには以下のメソッドが含まれています:
       - `setStatusCode(code: number)`: レスポンスのステータスコードを設定します。
       - `updateHeader(key: string, value: string)`: 指定されたキーと値でレスポンスヘッダーを更新します。ヘッダーが存在しない場合は新しいヘッダーを作成します。
       - `putHeaders(headers: Headers)`: レスポンスヘッダーを一括で設定します。
       - `setBody(body?: Body)`: レスポンスのボディを設定します。ボディが文字列以外の場合はJSONに変換されます。ボディが指定されない場合は`unsetBody()`メソッドが呼び出されます。
       - `unsetBody()`: レスポンスのボディを削除します。
       - `getResponse()`: 構築されたレスポンスを`APIGatewayProxyResult`型で返します。
    
    このファイルは、`ResponseBuilder`インターフェースの実装を提供し、AWS Lambda関数でAPIGatewayのレスポンスを簡単に構築するためのファクトリークラスを提供しています。`ResponseFactory.init()`メソッドを呼び出すことで、`ResponseBuilder`オブジェクトを取得し、フルエントインターフェースを使ってレスポンスのプロパティを設定することができます。
    
    最終的に`getResponse()`メソッドを呼び出すことで、構築されたレスポンスを`APIGatewayProxyResult`型で取得できます。
    
    このファクトリークラスを使用することで、レスポンスの構築をより簡潔で読みやすいコードで行うことができ、また型安全性も確保されます。
    
    ## lib/index.ts (エントリーポイント)
    このファイルは、前のファイルで定義された`ResponseBuilder`インターフェースを実装する`ResponseFactory`クラスを提供しています。`ResponseFactory`は、AWS Lambda関数でAPIGatewayのレスポンスを構築するためのファクトリークラスです。
    
    1. `ResponseFactory`クラス:
       - `init<Body, Headers>()`静的メソッドを提供します。このメソッドは、`ResponseBuilder`インターフェースを実装したオブジェクトを返します。
       - ジェネリック型パラメータ`Body`はレスポンスのボディの型を表し、デフォルトは`any`です。
       - ジェネリック型パラメータ`Headers`はレスポンスヘッダーの型を表し、デフォルトは`APIGatewayResponseHeaders`です。
    
    2. `init<Body, Headers>()`メソッド:
       - `APIGatewayProxyResult`型の`response`オブジェクトを初期化します。
       - デフォルトのステータスコードは500(Internal Server Error)です。
       - デフォルトのヘッダーとして、`Access-Control-Allow-Origin`と`Access-Control-Allow-Credentials`を設定します。
       - デフォルトのボディには、`message`プロパティに"Internal Server Error"を設定します。
    
       このメソッドは、`ResponseBuilder`インターフェースを実装したオブジェクトを返します。オブジェクトには以下のメソッドが含まれています:
       - `setStatusCode(code: number)`: レスポンスのステータスコードを設定します。
       - `updateHeader(key: string, value: string)`: 指定されたキーと値でレスポンスヘッダーを更新します。ヘッダーが存在しない場合は新しいヘッダーを作成します。
       - `putHeaders(headers: Headers)`: レスポンスヘッダーを一括で設定します。
       - `setBody(body?: Body)`: レスポンスのボディを設定します。ボディが文字列以外の場合はJSONに変換されます。ボディが指定されない場合は`unsetBody()`メソッドが呼び出されます。
       - `unsetBody()`: レスポンスのボディを削除します。
       - `getResponse()`: 構築されたレスポンスを`APIGatewayProxyResult`型で返します。
    
    このファイルは、`ResponseBuilder`インターフェースの実装を提供し、AWS Lambda関数でAPIGatewayのレスポンスを簡単に構築するためのファクトリークラスを提供しています。`ResponseFactory.init()`メソッドを呼び出すことで、`ResponseBuilder`オブジェクトを取得し、フルエントインターフェースを使ってレスポンスのプロパティを設定することができます。
    
    最終的に`getResponse()`メソッドを呼び出すことで、構築されたレスポンスを`APIGatewayProxyResult`型で取得できます。
    
    このファクトリークラスを使用することで、レスポンスの構築をより簡潔で読みやすいコードで行うことができ、また型安全性も確保されます。
    
    ==
    このライブラリについて紹介するreadme.mdを生成してください。
    

    生成結果

    こちらの生成結果についても、おおよそ期待したテキストが生成されていました。

    # AWS API Response Builder
    
    AWS API Response Builderは、AWS Lambda関数でAPIGatewayプロキシ統合を使用する際に、レスポンスを簡単かつ型安全に構築するためのライブラリです。
    
    ## 特徴
    
    - レスポンスのステータスコード、ヘッダー、ボディを柔軟に設定できます。
    - フルエントインターフェースを採用しているため、メソッドチェーンを使って読みやすいコードを書くことができます。
    - ジェネリック型パラメータを使用しているため、レスポンスのボディとヘッダーの型を指定できます。
    - デフォルトのレスポンスとしてInternal Server Errorを返すため、エラーハンドリングが容易です。
    - CORSのための`Access-Control-Allow-Origin`と`Access-Control-Allow-Credentials`ヘッダーがデフォルトで設定されます。
    
    ## インストール
    
    npmを使ってライブラリをインストールします。
    
    ```bash
    npm install aws-api-responsebuilder
    ```
    
    ## 使用方法
    
    ```typescript
    import { ResponseFactory } from 'aws-api-responsebuilder';
    
    // レスポンスを構築する
    const response = ResponseFactory.init<MyResponseBody, MyResponseHeaders>()
      .setStatusCode(200)
      .updateHeader('Content-Type', 'application/json')
      .setBody({ message: 'Success' })
      .getResponse();
    
    // AWS Lambda関数のハンドラーで使用する
    export const handler: APIGatewayProxyHandler = async (event, context) => {
      // レスポンスを返す
      return response;
    };
    ```
    
    ## APIリファレンス
    
    ### ResponseFactory.init<Body, Headers>()
    
    `ResponseBuilder`オブジェクトを初期化します。
    
    - `Body`: レスポンスのボディの型を指定します。デフォルトは`any`です。
    - `Headers`: レスポンスヘッダーの型を指定します。デフォルトは`APIGatewayResponseHeaders`です。
    
    ### ResponseBuilder メソッド
    
    - `setStatusCode(code: number)`: レスポンスのステータスコードを設定します。
    - `updateHeader(key: string, value: string)`: 指定されたキーと値でレスポンスヘッダーを更新します。ヘッダーが存在しない場合は新しいヘッダーを作成します。
    - `putHeaders(headers: Headers)`: レスポンスヘッダーを一括で設定します。
    - `setBody(body?: Body)`: レスポンスのボディを設定します。ボディが文字列以外の場合はJSONに変換されます。ボディが指定されない場合は`unsetBody()`メソッドが呼び出されます。
    - `unsetBody()`: レスポンスのボディを削除します。
    - `getResponse()`: 構築されたレスポンスを`APIGatewayProxyResult`型で返します。
    
    ## ライセンス
    
    このライブラリはMITライセンスの下で公開されています。
    
    ## 貢献
    
    バグ報告や機能リクエストは、GitHubのIssueトラッカーを使用してください。プルリクエストも歓迎します。
    
    ## サポート
    
    ご質問やご意見は、GitHubのIssueトラッカーまでお願いします。

    ここまで試してみて

    1ファイルだったときと同じく、複数ファイルで構成されているライブラリについても、「ファイルごとの説明文章」を生成してembeddingする方法をとることで、ある程度製品の解説や技術サポートなどに使えるRAGがつくれそうです。

    コードを適切な形でドキュメント化する必要がありますので、このあたりはAWS Step FunctionsやGitHub APIなどを組み合わせたパイプライン構築を行う流れになると思われます。

    もう1ケース試したいパターンがありますので、そちらの結果を見てから、実装方法の検討を始めようかと思います。

    ブックマークや限定記事(予定)など

    WP Kyotoサポーター募集中

    WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
    月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

    14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

    広告ここから
    広告ここまで

    Related Category posts