1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AI × Python】自然文からプロジェクトを自動生成して実行できる「vibecoding」を作った話

Last updated at Posted at 2026-01-12

前書き

こちらの続き 
一旦完成。
最初は指示文を作ってもらって、Github Copilotに渡していたが、いまいち思った通りの修正にならなかった。
なので、AIと相談しながら試行錯誤する方が楽だった。
以下生成AIの成果物。

この記事では、
自然文 → Structured Task → コード生成 → プロジェクト化 → 実行
という一連の流れを自動化する「vibecoding」という仕組みを構築した過程をまとめます。

  • Python(FastAPI)
  • Next.js(UI)
  • Ollama(LLM)
  • Qwen2.5-Coder

を使って、自然文から実行可能な Python プロジェクトを生成する仕組みを作りました。


🎯 目標

  • 自然文を解析して Structured Task を生成
  • LLM に 3 セクション形式でコード生成させる
  • 生成物をフォルダ単位で管理
  • UI からフォルダを指定して実行できる
  • 実行時に自動で generated.py を検出して実行

🧩 全体アーキテクチャ

Next.js UI
   ↓ /parse
FastAPI → Structured Task 生成
   ↓ /generate
Ollama → コード生成(3セクション)
   ↓ 保存
generated/<uuid>/generated.py
generated/<uuid>/requirements.txt
generated/<uuid>/README.md
   ↓ /run
FastAPI → generated.py を実行

🧠 1. Structured Task の生成 (/parse)

自然文を受け取り、
LLM に「タスクの構造化」をさせる。

const res = await fetch("/parse", {
  method: "POST",
  body: JSON.stringify({ text }),
});

🧠 2. コード生成 (/generate)

LLM に対して 3 セクション形式で出力させる。

  • === ENVIRONMENT SETUP ===
  • === REQUIREMENTS ===
  • === PYTHON CODE ===

この形式にすることで、
後段の処理が安定する。


📁 3. 生成物をフォルダ単位で保存

generated/<uuid>/
  generated.py
  requirements.txt
  README.md

code_generator.py の保存処理:

def save_generated_files(sections, base_dir):
    base_dir.mkdir(parents=True, exist_ok=True)
    (base_dir / "generated.py").write_text(sections["python_code"])
    (base_dir / "requirements.txt").write_text(sections["requirements"])
    (base_dir / "README.md").write_text(make_readme(sections))

🧹 4. LLM 出力の揺れを吸収する split_sections()

LLM が Markdown を混ぜても壊れないように、
正規表現で 3 セクションを抽出する。

pattern = re.compile(
    r"=== ENVIRONMENT SETUP ===\s*(.*?)\s*=== REQUIREMENTS ===\s*(.*?)\s*=== PYTHON CODE ===\s*(.*)",
    re.DOTALL
)

さらに ``` を除去するフィルタも追加。


▶ 5. /run をフォルダ対応にする

フォルダが渡されたら generated.py を自動検出して実行。

if path.is_dir():
    entry = path / "generated.py"
    path = entry

🖥 6. UI 側でフォルダパスを渡す

python_file からフォルダパスを抽出:

const getFolderPath = (pythonFilePath: string) =>
  pythonFilePath.replace(/\\generated\.py$/, "").replace(/\/generated\.py$/, "");

実行ボタン:

const folderPath = getFolderPath(generateResult.files.python_file);

await fetch("/run", {
  method: "POST",
  body: JSON.stringify({ file_path: folderPath }),
});

🎉 できあがったもの

  • 自然文からプロジェクトを生成
  • 生成物はフォルダ単位で管理
  • UI からワンクリックで実行
  • LLM の揺れにも強い
  • 拡張性の高い構造

🚀 今後の拡張予定

  • requirements.txt の自動インストール
  • README.md のコマンド自動実行
  • zip ダウンロード機能
  • 実行ログのリアルタイムストリーム
  • Dockerfile 生成

✨ まとめ

今回の vibecoding の構築で、

  • LLM の出力を安定させる方法
  • プロジェクト生成のベストプラクティス
  • UI とバックエンドの連携
  • フォルダ単位の実行フロー

が一通り揃いました。

AI を使ったコード生成の実践例として、
かなり応用の効く構成になっています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?