action-perfect-get-on-go

command module
v1.0.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 9, 2025 License: MIT Imports: 1 Imported by: 0

README

🤖 Action Perfect Get On Go

Language Go Version GitHub tag (latest by date)

🌟 概要: 完璧な情報取得とAI構造化

Action Perfect Get On Go は、複数のウェブページから本文を並列で高速に取得し、その結合されたテキストを LLM(大規模言語モデル) のマルチステップ処理によって情報欠落なく重複排除、重要な情報を保持したまま、情報密度の高い簡潔な文章に論理的に構造化する、高い保守性と堅牢性を備えたコマンドラインツールです。

このツールは、初期の並列処理での負荷や一時的なネットワークエラーに耐えるための堅牢なリトライ・遅延メカニズムを備えており、明確に分離されたDIパイプライン設計により、高い保守性を実現しています。


🛠️ 主な機能と堅牢性

  1. 堅牢なWebスクレイピングと並列数制御:
    • 複数のURLからの本文抽出をGoルーチンで同時に実行します。(最大並列数はCLIオプションで制御されます。デフォルトは10)
    • 並列処理にはセマフォ機構を採用し、実行スロットの上限を厳密に管理することで、対象サーバーへの過負荷を防止し、アプリケーションのリソース消費を最適化します。
    • 個々のGoroutineは、依存性注入されたカスタムHTTPクライアントのタイムアウトとリトライロジックによって堅牢に制御されます。
    • 並列処理後の固定遅延(initialScrapeDelay)と、抽出失敗時の固定遅延(retryScrapeDelay)後の順次リトライ(1回)ロジックにより、サーバー負荷を軽減しつつ取得成功率を最大化します。
  2. LLMマルチステップ処理 (MapReduce型):
    • 巨大な結合テキストをセグメントに分割。
    • 各セグメントを並列でLLM処理し、中間要約(Map)を作成。
    • 中間要約を統合し、最終的な重複排除と論理構造化を実行します。この際、各主要セクション(##)の直後に、そのセクションの情報を構成した参照元URLリストを付与し、情報源の透明性を確保します。
  3. AI駆動のデータクリーンアップと構造化: 結合されたテキストから重複コンテンツやノイズ(フッター、ナビゲーションなど)を排除し、情報構造を再構築します。処理指示は日本語で行われます。(内部で go-ai-client を利用)
  4. 柔軟な設定: 各フェーズでタイムアウトを設定可能にし、LLM APIキーを環境変数またはCLIオプションで柔軟に設定できます。
  5. 内部設計の最適化:
    • DIベースの明確なパイプライン構造: アプリケーションの処理フロー全体を、「URL生成」「コンテンツ取得」「AIクリーンアップ・出力」の3つの独立したステージに分割し、依存性注入 (DI) によって結合するパイプライン設計を採用。これにより、各ステージのモック化、テスト容易性、および保守性を最大限に高めています。
    • プロンプト定義を外部ファイル(.md)に分離し、Goのembedパッケージでバイナリに組み込むことで、デプロイの堅牢性を確保。
    • LLMプロンプトの生成にビルダーパターンを採用し、テンプレートのパースコストを削減するため再利用可能なインスタンスとして管理しています。
    • CLIオプションを構造体に集約することで、グローバル変数への依存を減らし、コードの堅牢性を高めています。I/O処理は log/slog による構造化ロギングに移行し、ファイル書き込み時のディレクトリ自動作成と堅牢なファイル上書きロジックを追加しました。

✨ 技術スタック

要素 技術 / ライブラリ 役割
言語 Go (Golang) ツールの開発言語。並列処理と堅牢な実行環境を提供します。
CLI Cobra コマンドライン引数とオプションの解析に使用します。
Web抽出 github.com/shouni/go-web-exact 任意のウェブページからメインの本文コンテンツを正確に抽出します。
AI通信 github.com/shouni/go-ai-client LLM(Gemini)への通信を管理し、自動リトライ機能を提供します。
プロンプト text/template, embed プロンプトを外部ファイル化し、テンプレートパースのコストを抑えた効率的なプロンプト生成ロジックを実現します。
並列処理 sync.WaitGroup / Goルーチン 複数のURLへのアクセスを同時に高速で実行します。
設計パターン 依存性注入 (DI) / パイプライン スクラップロジックの依存性を外部から注入し、処理フロー全体を構造化することで、モック化と保守性を向上させています。

🛠️ 事前準備と設定

1. ビルド
# リポジトリをクローン
git clone git@github.com:your-repo-path/action-perfect-get-on-go.git
cd action-perfect-get-on-go

# 依存関係をダウンロード
go mod tidy

# 実行ファイルを bin/ ディレクトリに生成
go build -o bin/llm_cleaner ./cmd

実行ファイルは ./bin/llm_cleaner に生成されます。

2. LLM API キーの設定 (必須)

LLM(Gemini)を利用するためには、APIキーが必要です。設定は以下のどちらかの方法で行います。

  • 推奨: コマンド実行時に -k または --api-key フラグで直接指定する。
  • 代替: 環境変数 GEMINI_API_KEY を設定する。

注意: コマンドラインフラグでキーを指定した場合、環境変数の設定よりも常に優先されます。

# 例: 環境変数に設定する場合
export GEMINI_API_KEY="YOUR_GEMINI_API_KEY" 

🚀 使い方 (Usage)

本ツールは、処理対象のURLを記載したファイルを読み込む形式のみをサポートします。

実行コマンド形式とオプション
オプション フラグ 説明 デフォルト値
--api-key -k Gemini APIキーを直接指定します(推奨)。 なし
--url-file -f 処理対象のURLリストを記載したファイルパスを指定します。ファイル内ではURLを改行区切りで記述します。 (必須) なし
--llm-timeout -t LLM処理全体のタイムアウト時間。 5m0s (5分)
--scraper-timeout -s Webスクレイピング(HTTPアクセス)のタイムアウト時間。 15s (15秒)
--parallel -p Webスクレイピングの最大同時並列リクエスト数。 10
1. URLファイル (urls.txt の例) の作成

ファイル内に、1行に1つずつ処理したいURLを記述します。

# ファイル名: urls.txt
https://example.com/page-a
https://example.com/page-b
https://example.com/page-c/specification
2. 実行コマンド形式

処理を実行するには、必ず run サブコマンドと --url-file または -f フラグを使用して有効なファイルパスを指定する必要があります。URLを直接引数として渡す形式はサポートされていません。

# 最小実行形式 (環境変数にAPIキーが設定されている場合)
./bin/llm_cleaner run -f ./urls.txt

# 推奨実行形式 (APIキーとカスタムタイムアウト、並列数を指定)
./bin/llm_cleaner run -k "YOUR_API_KEY" -f ./urls.txt -s 30s -t 3m -p 5

# 並列数をデフォルトの10のまま実行する場合
./bin/llm_cleaner run -k "YOUR_API_KEY" -f ./urls.txt
🗃️ 処理の流れ

本ツールは、DIで注入された3つのパイプラインステージを順に実行します。

  1. [Pipeline Stage 1: URL生成]: コマンドライン引数で渡されたURLリストファイルを読み込み、処理対象のURLを抽出します。
  2. [Pipeline Stage 2: コンテンツ取得]:
    • 並列抽出: 抽出されたURLへのアクセスが最大並列数の上限(デフォルト: 10)に従い同時に開始されます。
    • 遅延: 並列抽出完了後、サーバー負荷軽減のため固定時間(initialScrapeDelay)待機します。
    • リトライ: 抽出に失敗したURLがある場合、固定時間(retryScrapeDelay)待機した後、順次1回だけリトライされます。
    • 最終的に成功したすべての本文が結合され、次のステージに渡されます。
  3. [Pipeline Stage 3: AIクリーンアップ・出力]:
    • 結合と分割: 結合テキストがLLMのトークン制限に応じて複数のチャンクに分割されます。
    • Mapフェーズ: 各チャンクが並列でLLMに送られ、中間要約が作成されます。
    • Reduceフェーズ: すべての中間要約が統合され、最終的な重複排除と構造化が実行されます。この際、統合に用いられた各ソースURLが、関連する主要セクション(##)の直下にリストとして挿入されます。
    • 出力: LLMが構造化した最終的なテキスト(Markdown形式)が標準出力に出力されます。最終出力は、セクションごとの情報源URLリストを伴います。

📜 ライセンス (License)

このプロジェクトは MIT License の下で公開されています。

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
internal

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL