Generative AI World Cup 2024 参加記録とREADME自動生成プログラム

# はじめに
8月31日から10月31日の間に行われたDatabricksさん主催のハッカソン、[Generative AI World Cup 2024](https://hackathon.stackup.dev/web/events/generative-ai-world-cup-2024-so-you-think-you-can-hack) に実質ソロで参加してきました。そこで作成したものと副産物のREADME自動生成プログラムについて紹介します。
コンペについて興味がない方も、README自動生成プログラムは役に立ちそうなので見ていってください。

# Generative AI World Cup 2024 概要

公式の文章から提出物のテーマについて引用しました。このテーマに沿いつつGenAIとdatabricksのサービスをしていればOKっぽかったです。

> テーマ1：現実世界の問題を解決するGenAIアプリを作ろう！AI初心者でもPythonのプロでも、AIを使ったソリューションを作るデータ組織の参加者を歓迎します。

# 提出アプリ紹介
早速ですが、提出アプリの紹介です。
gmailに届いた会議招集メールの本文と添付ファイルを読み込み、会議開始日までのタスクを生成するアプリを作成しました。下図はタスク生成までのプロセスの概略図で、ロボットマークのところでLLM (DBRX) の使用をしています。

工夫点は、

- google driveから添付ファイルを引っ張ってきて要約 -> タスク生成プロンプトへ入力
- userからのfeedbackを要約して、タスク生成プロンプトを自動で改善

となっています。WEBアプリとして提出できなかったのですが、限られた時間でよく頑張れたなぁと思います。

![Databricks_demo_video_slide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631672/813cbc9c-f28c-40f7-8299-48845ac0c485.png)

# README自動生成プログラム
提出アプリ作成にあたって、READMEの試作を自動生成するコードを作成したので紹介します。
流れは、全pythonファイルを一つのファイルへ集約して、LLMに入力、README生成となっています。小規模のプログラムであれば、問題なく動くと思うので適当に書き換えて使用して下さい。

``` readme_generator.py
import os
import google.generativeai as genai
from dotenv import load_dotenv

load_dotenv()


def export_all_py_files(all_code_output_path="output.txt"):
    """
    現在のフォルダ以下の .py ファイルの中身を all_code_output_path に書き出す関数
    このファイルは除外
    """
    script_name = os.path.basename(__file__)

    with open(all_code_output_path, mode="w", encoding="utf-8") as out_f:
        for root, dirs, files in os.walk("."):
            for filename in files:
                # 今回は拡張子が .py のファイルを参照
                if filename.endswith(".py") and filename != script_name:
                    full_path = os.path.join(root, filename)

                    # ファイル名をコードの先頭に記載
                    out_f.write(f"--- {filename} ---\n")

                    with open(full_path, mode="r", encoding="utf-8") as py_f:
                        content = py_f.read()
                        out_f.write(content)

                    out_f.write("\n\n")


def generate_readme_from_output(
    all_code_input_path: str = "output.txt", readme_output_path: str = "README.md"
):
    """
    all_code_input_path で指定されたファイルをもとに、README.md を自動生成する関数
    """
    # API KEYとmodel nameは適宜書き換え
    genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
    model = genai.GenerativeModel("gemini-2.0-flash-exp")

    # 全コードが書きだされたファイル読み込み
    with open(all_code_input_path, "r", encoding="utf-8") as f:
        code_content = f.read()

    prompt = f"""# 指示文
    Pythonファイルのソースコードをもとに、プロジェクトの README に含めるべき情報をまとめて、
    README.md のドラフトを出力してください。必要に応じて使い方や実行例なども作成してください。

    # 注意点
    - markdownで書いて下さい

    # ソースコード
    {code_content}
    """

    # README生成
    response = model.generate_content(prompt)
    generated_readme = response.text

    with open(readme_output_path, "w", encoding="utf-8") as f:
        f.write(generated_readme)


if __name__ == "__main__":
    export_all_py_files()
    generate_readme_from_output()
```
## 実行例
下記githubレポジトリをcloneして動作確認してみました。

https://github.com/carpedm20/emoji

生成結果は下記URL
[emojiのソースコードから生成したREADME](https://gist.github.com/hondotanuki/65706c70a7ea80745acf1215ad0ed49f)

うまく生成できてそうですね。手を加えれば、READMEが一瞬で作れそうです