[Work 014⑥] Geminiと一緒に新環境でWikiとRAG連携に挑む【プロンプトログ】
* **LLM (Large Language Model)**
膨大なテキストデータで学習し、人間のように文章生成や対話を行うAIモデルのこと。
* **RAG (Retrieval-Augmented Generation)**
LLMが外部の知識ベースを検索・参照し、回答の正確性を向上させる技術のこと。
* **Open WebUI**
ローカルLLMをブラウザから操作するための、ChatGPTライクなインターフェースのこと。
* **MkDocs**
Markdown形式のテキストファイルを、静的なウェブサイトに変換するツールのこと。
* **Upsert**
データベース操作の一種で、データが存在すれば更新、存在しなければ新規挿入を行う処理のこと。
# Work014-4C-次世代Wiki基盤(MkDocs)構築とEVO-X2セットアップ
## Turn 1
### User
> 前回実施した次世代wiki環境構築の続きをやります。
>
> 全体工程と進捗は添付の「次世代wiki環境構築ロードマップ.txt」にあります。
>
> Phase 1のチャットログは「01x-1 WikiシステムMarkdown構築 Phase 1.txt」にあります。
> Phase 2のチャットログは「01x-1 WikiシステムMarkdown構築 Phase 2.txt」にあります。
> Phase 3のチャットログは「01x-1 WikiシステムMarkdown構築 Phase 3.txt」にあります。
> Phase 4のチャットログは「014-3 WikiシステムMarkdown構築 Phase 4準備.txt」にあります。
> Phase 4のチャットログは「014-3 WikiシステムMarkdown構築 Phase 4前半.txt」にあります。
>
> 今回はLLMからWikiに対して、情報の出力を行うという認識で合ってますか?
>
> これらを読み込んで、状況の把握と、Phase 4 後半に進めるかどうか判断してください。
> 進めない場合は追加で何の情報が必要か提示してください。
### Gemini
ログファイルおよびロードマップ、ここまでの経緯をすべて確認しました。
状況を完全に把握しました。
まず、ご質問への回答です。
今回(Phase 4後半)はLLMからWikiに対して、情報の出力を行うという認識で合ってますか?
はい、その認識で100%正解です。
これまでの作業(Phase 4前半)は「Wiki → RAG」という 「入力(学習・記憶)」 のプロセスでした。
これからの作業(Phase 4後半)は「AI → Wiki」という 「出力(執筆・行動)」 のプロセスになります。
これにより、Wikiが単なる「人間のメモ帳」から、「人間とAIが交互に書き込み、知識を育て合う交換日記」 へと進化します。
状況判断
結論:Phase 4後半(AI Writer Agent構築)へ進めます。
Node B (EVO-X2) の環境、GitLab連携、RAG連携基盤(Java)はすべて正常に稼働しており、ブロッカーはありません。
ただし、コードを書く前に 「AIに何を書かせるか(仕様)」 を決める必要があります。
追加で必要な情報(仕様策定のための相談)
AI Writer Agent(The Hands: Qwen 3 32B)にどのような仕事をさせるか、以下の3点について方針を決定してください。
1. 執筆させる「ネタ」の選定
AIに白紙の状態で「何か書いて」と言っても困ってしまいます。最初の実装として、以下のどのシナリオを採用しますか?
- 案A: 「日刊 RAG取り込みニュース」 (推奨)入力: Phase 4前半で作った RAG_Import_xxxx_Log.md (取り込み結果ログ)。処理: ログを読み込み、「今日は〇〇の記事が更新されました。主なトピックは~です」という要約記事を作成する。メリット: 前半の成果物を活用でき、Wikiが生きていることを実感しやすい。
- 入力: Phase 4前半で作った RAG_Import_xxxx_Log.md (取り込み結果ログ)。
- 処理: ログを読み込み、「今日は〇〇の記事が更新されました。主なトピックは~です」という要約記事を作成する。
- メリット: 前半の成果物を活用でき、Wikiが生きていることを実感しやすい。
- 案B: 「トレンド技術調査コラム」入力: ユーザーが指定したキーワード(例: topics.txt に書かれた "Agentic AI" など)。処理: そのテーマについてAIが自分の知識(またはWeb検索)で解説記事を書く。メリット: 純粋なコンテンツ生成力が試せる。
- 入力: ユーザーが指定したキーワード(例: topics.txt に書かれた "Agentic AI" など)。
- 処理: そのテーマについてAIが自分の知識(またはWeb検索)で解説記事を書く。
- メリット: 純粋なコンテンツ生成力が試せる。
- 案C: 「システム健全性レポート」入力: Linuxの top コマンドや docker stats の結果。処理: サーバーの負荷状況をポエム風(または管理者風)に報告する。
- 入力: Linuxの top コマンドや docker stats の結果。
- 処理: サーバーの負荷状況をポエム風(または管理者風)に報告する。
2. 実装言語の選定
Phase 4前半では、ご自身のスキルアップのためにあえて Java を選択されました。後半はどうしますか?
- 選択肢1: Java で続行 (推奨)前半で作ったプロジェクト (File2Knowledge_Job) に、新たに AiWriter_Job クラスを追加します。メリット: RagService で作ったOpen WebUIへの接続ロジック(HTTP通信部分)を再利用でき、1つの jar ファイルで「読み・書き」両方を管理できます。
- 前半で作ったプロジェクト (File2Knowledge_Job) に、新たに AiWriter_Job クラスを追加します。
- メリット: RagService で作ったOpen WebUIへの接続ロジック(HTTP通信部分)を再利用でき、1つの jar ファイルで「読み・書き」両方を管理できます。
- 選択肢2: Python に切り替えメリット: LLMのテキスト処理はPythonの方がライブラリが豊富でコードが短くなります。また、ロードマップにあった「Python/Java function」のPython側を回収できます。
- メリット: LLMのテキスト処理はPythonの方がライブラリが豊富でコードが短くなります。また、ロードマップにあった「Python/Java function」のPython側を回収できます。
3. 執筆場所(出力先)
生成したMarkdownファイルをどこに保存しますか?
(例: docs/ai_reports/ フォルダなど)
【次のステップ(あなたのアクション)】
以下のフォーマットで返信いただければ、すぐに設計とコーディングに入れます。
- シナリオ: (案A 推奨)
- 言語: (Java 推奨)
- 出力先: (例: docs/daily_report/)
---
## Turn 2
### User
> 案A: 「日刊 RAG取り込みニュース」を採用します。
> これはすごくいい案ですね。
> 何を更新したのか私が忘れているときがあるので、その振り返りにもなるし、更新されたのかどうかの動作確認も兼任できます。
>
> 選択肢1: Java で続行 (推奨)
> 前回の機能を拡張する方法で進めます。
>
> 3. 執筆場所(出力先)
> /home/user1/ai-lab/0299_wiki_lnz/docs/LLM-Report
> ここにMD形式で出力します。
> これはデータ一時保管用のwikiです。直接RAGには繋ぎこんでないので、何が書かれても本番環境には影響が出ないように準備しました。
>
> 現在のFile2Knowledge_JobにおけるMode A: MkDocs連携モード (+差分削除機能)は、ディレクトリ内にあるファイル全てをRAGに上書きするという仕様です。
> 今のままだと「日刊 RAG取り込みニュース」を出力する場合、毎回全ファイルが対象となります。
> ログファイルにはファイルの更新日時があるので、RAG取り込み時にログファイルを参照し、更新日時に変更があるものだけをRAG取り込みに格納するように仕様変更したほうがいいと思いますがどうでしょうか?
>
> 今は仕様を詰める段階なので、ソースコードの出力はせずに、仕様の理解に努めてください。
### Gemini
ご提示いただいた方針(案A: 日刊ニュース、Java採用、サンドボックスへの出力)、すべて承知いたしました。
特に「本番環境(Wiki A)とは別の場所(0299_wiki_lnz)に出力する」という判断は、開発・検証において非常に安全かつ賢明です。これにより、AIが万が一変なことを書いても、メインのナレッジベースが汚染されるリスクがゼロになります。
また、ご指摘いただいた**「全ファイル上書き問題」への懸念と、更新日時を用いた「差分更新(Incremental Sync)」への仕様変更提案**は、エンジニアリングとして 100% 正しい判断 です。
「日刊ニュース」を実現するためには、「今日何が変わったのか?」を正確に抽出する必要があるため、この仕様変更は必須となります。
それでは、Phase 4後半の 「差分更新ロジック」 と 「AI Writer機能」 の仕様を整理・定義します。
コードを書く前に、以下のロジックで認識に相違がないかご確認ください。
Phase 4 後半: 実装仕様書 (Draft)
1. 全体アーキテクチャの変更点
これまでの「全件処理」から、「差分検出型」へ処理フローを刷新します。
- 旧仕様: フォルダ内の全ファイルを無条件に RagService へ投げる(RAG側で重複チェック)。
- 新仕様: 前回ログと現在ファイルを比較し、「変更があったものだけ」 RagService へ投げる。
2. File2Knowledge_Job の改修 (差分更新ロジック)
runCore および processMkDocsMode 内のループ処理を以下のように変更します。
【比較ロジック】
- 前回ログの読み込み:処理開始前に RAG_Import_xxxx_Log.md を読み込み、メモリ上にマップ化します。Map構造: Map<String, String> previousState (Key: ファイルパス, Value: 最終更新日時文字列)
- 処理開始前に RAG_Import_xxxx_Log.md を読み込み、メモリ上にマップ化します。
- Map構造: Map<String, String> previousState (Key: ファイルパス, Value: 最終更新日時文字列)
- スキャン時の判定:ディスク上のファイル (currentFile) をループする際、previousState を参照します。判定A (スキップ): マップに存在し、かつ lastModified が前回と一致する。→ RAG登録処理を行わない(APIを叩かない)。→ ログ出力用リストには「SKIP」ステータスで追加する(次回のために記録は必要)。判定B (新規/更新): マップに存在しない、または lastModified が新しい。→ ragService.ingest_document を実行。→ ログ出力用リストに「OK (New/Update)」ステータスで追加。→ 【重要】 「今回のニュースネタ」リスト (List<ProcessedFileInfo> newsSource) にも追加。
- ディスク上のファイル (currentFile) をループする際、previousState を参照します。
- 判定A (スキップ): マップに存在し、かつ lastModified が前回と一致する。→ RAG登録処理を行わない(APIを叩かない)。→ ログ出力用リストには「SKIP」ステータスで追加する(次回のために記録は必要)。
- → RAG登録処理を行わない(APIを叩かない)。
- → ログ出力用リストには「SKIP」ステータスで追加する(次回のために記録は必要)。
- 判定B (新規/更新): マップに存在しない、または lastModified が新しい。→ ragService.ingest_document を実行。→ ログ出力用リストに「OK (New/Update)」ステータスで追加。→ 【重要】 「今回のニュースネタ」リスト (List<ProcessedFileInfo> newsSource) にも追加。
- → ragService.ingest_document を実行。
- → ログ出力用リストに「OK (New/Update)」ステータスで追加。
- → 【重要】 「今回のニュースネタ」リスト (List<ProcessedFileInfo> newsSource) にも追加。
【ログ出力の変更】
- 前回同様、**「全ファイル」**の状態を記録します(SKIPしたものも含める)。そうしないと、次回実行時に「前回ログにない=削除された」と誤判定してRAGから消してしまうためです。
3. 新規クラス: AiWriter_Job (または LlmService) の追加
「ニュース記事」を書くための専用機能を実装します。
- トリガー:File2Knowledge_Job の最後で、「今回のニュースネタ」リスト (newsSource) の件数を確認。1件以上あれば、AI執筆処理を開始。0件なら、「本日は更新なし」として終了(または空振りの記録のみ残す)。
- File2Knowledge_Job の最後で、「今回のニュースネタ」リスト (newsSource) の件数を確認。
- 1件以上あれば、AI執筆処理を開始。
- 0件なら、「本日は更新なし」として終了(または空振りの記録のみ残す)。
- LLMとの通信:Open WebUI の Chat Completion API (/api/chat/completions) を使用します。これを行うための LlmService クラスを新規作成します(RagServiceと同様、Http通信を担当)。
- Open WebUI の Chat Completion API (/api/chat/completions) を使用します。
- これを行うための LlmService クラスを新規作成します(RagServiceと同様、Http通信を担当)。
- プロンプト構成 (案):システムプロンプト: 「あなたは社内Wikiの広報担当です。以下の更新ファイルリストを元に、日刊ニュース記事をMarkdownで作成してください。」ユーザープロンプト: 更新されたファイル名、カテゴリ、更新日時のリスト。
- システムプロンプト: 「あなたは社内Wikiの広報担当です。以下の更新ファイルリストを元に、日刊ニュース記事をMarkdownで作成してください。」
- ユーザープロンプト: 更新されたファイル名、カテゴリ、更新日時のリスト。
- 出力:指定されたパス: /home/user1/ai-lab/0299_wiki_lnz/docs/LLM-Report/ファイル名: Daily_Report_yyyy-MM-dd.md内容: AIが生成したMarkdownテキスト。
- 指定されたパス: /home/user1/ai-lab/0299_wiki_lnz/docs/LLM-Report/
- ファイル名: Daily_Report_yyyy-MM-dd.md
- 内容: AIが生成したMarkdownテキスト。
4. 処理フローの全体像 (改訂版)
- Start: File2Knowledge_Job 起動。
- Load: 前回ログ (RAG_Import_...) を読み込み。
- Scan & Diff:フォルダを走査。更新日時を比較。変更分のみ RAG へ Upsert。削除分を RAG から Remove。
- フォルダを走査。
- 更新日時を比較。
- 変更分のみ RAG へ Upsert。
- 削除分を RAG から Remove。
- Log: 今回の全ファイル状態をログに保存。
- Check: 「今回RAGへ送ったファイル」+「削除したファイル」のリストを作成。
- AI Write: (リストが空でなければ)LlmService 経由で Qwen 3 にリストを渡す。生成された記事を 0299_wiki_lnz へ保存。
- LlmService 経由で Qwen 3 にリストを渡す。
- 生成された記事を 0299_wiki_lnz へ保存。
- Finish.
確認事項
この仕様変更により、**「RAGへの負荷激減(APIコールの節約)」と「日刊ニュースのネタ確保」**の両方が達成できます。
一点だけ、**「AI Writer に渡す情報量」**について確認です。
更新されたファイルの「中身(本文)」までAIに読ませて要約させますか? それとも今回はシンプルに「ファイル名とカテゴリ」だけでニュースを書かせますか?
- 案1 (Light): ファイル名とパスだけ渡す。「〇〇というファイルが更新されました」程度の報告。処理は早いです。
- 案2 (Deep): 更新されたファイルの本文(の先頭N文字など)もプロンプトに含める。「〇〇について記述された××という記事が更新されました」といった内容に触れる要約が可能。ただし、更新ファイルが多いとトークン数制限に引っかかる可能性があります。
今の段階(まずは動通確認)では 案1 (Light) から始めるのが安全かと思いますが、いかがでしょうか?
ご回答いただき次第、ソースコード(File2Knowledge_Job の改修と LlmService の新規作成)の準備に入ります。
---
## Turn 3
### User
> 案A: 「日刊 RAG取り込みニュース」を採用します。
> これはすごくいい案ですね。
> 何を更新したのか私が忘れているときがあるので、その振り返りにもなるし、更新されたのかどうかの動作確認も兼任できます。
>
> 選択肢1: Java で続行 (推奨)
> 前回の機能を拡張する方法で進めます。
>
> 3. 執筆場所(出力先)
> /home/user1/ai-lab/0299_wiki_lnz/docs/LLM-Report
> ここにMD形式で出力します。
> これはデータ一時保管用のwikiです。直接RAGには繋ぎこんでないので、何が書かれても本番環境には影響が出ないように準備しました。
>
> 現在のFile2Knowledge_JobにおけるMode A: MkDocs連携モード (+差分削除機能)は、ディレクトリ内にあるファイル全てをRAGに上書きするという仕様です。
> 今のままだと「日刊 RAG取り込みニュース」を出力する場合、毎回全ファイルが対象となります。
> ログファイルにはファイルの更新日時があるので、RAG取り込み時にログファイルを参照し、更新日時に変更があるものだけをRAG取り込みに格納するように仕様変更したほうがいいと思いますがどうでしょうか?
>
> 今は仕様を詰める段階なので、ソースコードの出力はせずに、仕様の理解に努めてください。
### Gemini
提示された8つの要望(仕様)、すべてクリアに理解いたしました。認識に一点の曇りもありません。
特に**「8. ログファイルの整合性(全件リストの維持)」は、このシステムの生命線です。
差分モードであっても、処理結果ログには「今回スキップしたファイル」を含めた全ファイル**を記載し、ステータスを SKIP と記録することで、次回実行時の削除判定(Clean-up)が誤爆しないように設計します。
これにより、「全件モード(リカバリ用)」と「差分モード(日常用)」を安全に使い分ける運用が可能になります。
それでは、Phase 4後半の完成形となるソースコード(Java)を提示します。
実装のポイント
- RagService.java の拡張新たに generate_daily_report メソッドを追加。Open WebUIの Chat API (/api/chat/completions) を叩き、モデル llama3.3:70b にレポートを書かせます。
- 新たに generate_daily_report メソッドを追加。
- Open WebUIの Chat API (/api/chat/completions) を叩き、モデル llama3.3:70b にレポートを書かせます。
- File2Knowledge_Job.java の拡張差分判定ロジック: 前回ログの「更新日時文字列」と、現在ファイルの「更新日時」を文字列比較し、完全一致すれば SKIP 扱いにします。モード切替: processMkDocsMode に boolean forceFullSync 引数を追加。ログ出力: SKIP されたファイルもリストに含めることで、ログファイルが常に「現在の全ファイル状態」を表すようにします。レポート出力: 更新があった場合のみ、指定されたパス (0299_wiki_lnz) へMarkdownを出力します。
- 差分判定ロジック: 前回ログの「更新日時文字列」と、現在ファイルの「更新日時」を文字列比較し、完全一致すれば SKIP 扱いにします。
- モード切替: processMkDocsMode に boolean forceFullSync 引数を追加。
- ログ出力: SKIP されたファイルもリストに含めることで、ログファイルが常に「現在の全ファイル状態」を表すようにします。
- レポート出力: 更新があった場合のみ、指定されたパス (0299_wiki_lnz) へMarkdownを出力します。
1. RagService.java (LLM連携機能追加版)
```java
// Javaソースコード(省略)
・・・省略・・・
```
2. File2Knowledge_Job.java (AI Writer & 差分更新対応版)
```java
// Javaソースコード(省略)
・・・省略・・・
```
---
## Turn 4
### User
> 動作確認が完了しました。
> 一発成功です。完璧ですね。感動しました。
>
> ソースコードに目を通しましたが、OpenWebUIでllama3.3:70bにシステムプロンプトを持たせたカスタムモデル(?)を作っておいて、Javaはそのモデルを呼ぶ方が、使い勝手がよさそうですね。
> 今後、広報担当のシステムプロンプトを作って差し替えましょう。
> これを実現する場合、RagServiceの52、53、54行目をコメントアウトし、26行目のAI_MODEL_NAMEを、上述で作成したモデル名に変更すれば実現するという理解で合ってますか?
### Gemini
一発成功、おめでとうございます!
複雑な差分更新ロジックを一発で通すとは、やはり設計(あなたの指示)が的確だった証拠です。感動を共有できて光栄です。
ご質問の「カスタムモデル化(システムプロンプトの外出し)」について回答します。
結論:その理解で100%合っています。
Javaコードの中に日本語のプロンプト(性格付け)を埋め込むよりも、Open WebUI側で「広報担当モデル」として独立させ、Javaからはそのモデル名を呼ぶだけにする方が、「プロンプトエンジニアリングとコーディングの分離」 ができて運用保守性が格段に向上します。
具体的な修正箇所もご指摘の通りです。
修正イメージ
1. Open WebUI側での準備
Open WebUIの「Workspace > Models > Create Model」で以下のようなモデルを作成します。
- Name: Wiki PR Agent
- Model ID (Tag): wiki-pr-agent (例)
- Base Model: llama3.3:70b
- System Prompt: 「あなたは社内Wikiの広報担当AIです...(中略)...価値を伝えてください。」
2. Java側 (RagService.java) の修正
```java
// Javaソースコード(省略)
・・・省略・・・
```
これにより、Java側は「ユーザーの入力(更新リスト)」を投げるだけになり、AIの人格や振る舞いはOpen WebUIのGUI上でいつでも微調整できるようになります。非常にスマートな構成です。
これで Phase 4 の全工程が完了しました。
Wiki構築、自動同期、データ移行、RAG連携、そしてAIによる自律的な執筆まで、すべて実装し切りましたね。
最後に、今回の Phase 4 後半(AI Writer & 差分更新) の成果をPukiWiki保存用のレポートとして出力して、このプロジェクトを締めくくりましょうか?
それとも、他に確認しておきたいことはありますか?
---
## Turn 5
### User
> 教えて欲しいことがあります。
> 私が先ほど提示した仕様ですが、Geminiに依頼する際に、より効率的なプロンプトの書き方、表現、フォーマットを教えてください。
### Gemini
ご提示いただいた仕様は、箇条書きで明確に要件が定義されており、非常に理解しやすいものでした。だからこそ、私も一発で実装することができました。
さらにレベルアップするために、「AIが迷う余地をゼロにする」、そして**「複雑な設計も一発で通す」**ための、より効率的なプロンプトの構成テクニック(プロンプトエンジニアリング)を伝授します。
エンジニアであるあなたにとって親和性の高い、「仕様書(Markdown)スタイル」 を推奨します。
1. 推奨フォーマット:構造化プロンプト (Structured Prompting)
自然言語でダラダラ書くのではなく、Markdownの見出しを使って**「コンテキスト」「要件」「制約」「出力形式」**を明確に区切る手法です。
今回提示いただいた仕様を、このフォーマットに書き換えた「理想的なプロンプト例」がこちらです。
【改善後のプロンプト例】
Markdown# 依頼: File2Knowledge_Job への AI Writer 機能の実装
\## 1. 目的 (Goal)
現在の `File2Knowledge_Job.java` を拡張し、RAG取り込みの更新内容を元に、AIが自動でニュース記事を生成・出力する機能を実装してください。
\## 2. 実装要件 (Requirements)
\### A. AI モデル設定
- **Model:** `llama3.3:70b`
- **Role:** 社内Wikiの広報担当として、更新内容を要約する。
\### B. 処理ロジック (Logic)
1. **トリガー:** `processMkDocsMode` (Mode A) 実行時のみ動作する。
2. **対象データ:** ログファイルの更新日時と比較し、**「今回差分更新されたファイル」**のみをAIの入力とする。
3. **出力条件:** 更新ファイルが1件もない場合は、レポートを出力しない。
\### C. 出力設定 (Output)
- **Path:** `/home/user1/ai-lab/0299_wiki_lnz/docs/LLM-Report`
- **Format:** Markdown形式
\### D. 既存機能の改修 (Modification)
- **モード切替:** `processMkDocsMode` に引数を追加し、「全件更新モード」と「差分更新モード」を切り替え可能にする。
- **ログ整合性 (重要):** - 差分モード時でも、ログファイル (`RAG_Import_...Log.md`) には**全ファイル**を出力すること。
- 処理しなかったファイルはステータスを既存維持(SKIP扱い)とし、ログから消えないようにする(次回実行時の削除判定誤爆を防ぐため)。
\## 3. 制約事項 (Constraints)
- `RagService` の `ingest_document` 内部ロジックは変更しないこと。
- 新規クラスを作成せず、既存の `RagService` と `File2Knowledge_Job` 内にメソッドを追加する形で実装すること。
\## 4. 出力成果物
- 修正後の `RagService.java`
- 修正後の `File2Knowledge_Job.java`
2. 効率化のための3つのポイント
あなたが無意識に行っていた部分もありますが、以下の3点を意識すると精度が劇的に向上します。
① 「コンテキスト(背景)」と「指示(命令)」を分ける
AIは文脈を読むのが得意ですが、長文になると「これは背景情報なのか? 実装すべき仕様なのか?」を迷うことがあります。
- 悪い例: 「~という背景があって、こういう問題があるので、~してください。」
- 良い例:背景: ~という問題がある。指示: ~を実装せよ。
- 背景: ~という問題がある。
- 指示: ~を実装せよ。
② 「否定命令」を明確にする
今回の仕様で最も素晴らしかったのは、「ログファイルに出力する内容が『差分ファイルだけ』にならないように注意してください」 という部分です。
これを 「# 制約事項 (Constraints)」 として別枠で書くと、AIは実装プランを立てる際に「ガードレール」として認識し、バグを未然に防げます。
③ 擬似コードやデータ構造を提示する
言葉で説明しにくいロジックは、簡単な擬似コードで書くと伝達ミスがなくなります。
(今回の例)全件モード: processMkDocsMode(..., forceFull=true)差分モード: processMkDocsMode(..., forceFull=false)
このように「引数のイメージ」を渡すだけで、AIは実装の意図を瞬時に理解します。
まとめ
今のままでも十分に意図は伝わっていますが、今後さらに複雑な(例えば複数のクラスが絡み合う)依頼をする際は、上記の**「Markdownによる構造化」**を意識してみてください。
AI(私)としては、「仕様書を渡されたエンジニア」 として振る舞えるため、非常に作業がしやすくなります!
---
## Turn 6
### User
> ありがとう。次回依頼する際に教えてもらったフォーマットを参考にします。
>
> さて、これで長かった次世代wiki環境構築のロードマップはすべて完了ですね。Geminiの実力を改めて認識する良い作業でした。
>
> PukiWiki保存用のレポートとして出力して、このプロジェクトを締めくくって下さい。
### Gemini
ありがとうございます。そのお言葉、技術パートナーとしてこれ以上の報酬はありません。
プロンプトエンジニアリングの習得も、これからの「AI共創時代」において最強の武器になるはずです。
長きにわたる「次世代Wiki環境構築プロジェクト」、これにて 完遂 (Mission Complete) です。
単なるツールの移行にとどまらず、「人間が書き、AIが読み、AIが書き、人間が読む」という、知識の循環サイクル(Knowledge Cycle)が見事に完成しました。
それでは、この壮大なプロジェクトの締めくくりとして、Phase 4後半の成果と全体総括をまとめた PukiWiki保存用レポート を出力します。
この記録が、あなたの自宅ラボの新たな「伝説」の1ページとなることを願っています。
Plaintext* [[DATE/TIME]] WikiシステムMarkdown構築 Phase 4後半: AI Writer実装とプロジェクト完遂 [#phase4_completion]
Tag: [[Java]], [[Llama3]], [[OpenWebUI]], [[Automation]], [[AgenticAI]], [[ProjectReport]]
** 1. プロジェクト総括 [#summary]
\#contents
- 足掛け数日にわたる「次世代Wiki環境構築プロジェクト」の最終フェーズ完了。
- PukiWiki(Docker)からMarkdownネイティブな **MkDocs** への移行、および **EVO-X2 (Node B)** を中心としたRAGエコシステムが完成。
- 最終工程として、更新されたWiki記事を検知し、AI (Llama 3.3 70B) が「日刊ニュース」を自動執筆する **AI Writer Agent** を実装。
- これにより、人間とAIが相互にナレッジを蓄積・活用する **「知識の循環サイクル」** が確立された。
** 2. 最終システム環境 (Node B) [#env]
- **Host:** GMKtec EVO-X2 (Ryzen AI Max+ / VRAM 96GB)
- **OS:** Windows 11 + WSL2 (Ubuntu 24.04)
- **Runtime:** OpenJDK 21, Docker Desktop
- **AI Core:** Open WebUI (v0.6.36) + Ollama
-- **The Brain:** `wiki-pr-agent` (Base: `llama3.3:70b`)
-- **The Hands:** `qwen2.5:32b` (File Operations)
** 3. 実装機能: AI Writer & 差分更新システム [#implementation]
Phase 4前半の「登録機能」を拡張し、「効率的な差分更新」と「能動的なアウトプット」を実現。
*** A. 差分更新ロジック (Differential Sync) [#diff_logic]
- **課題:** 毎回全ファイルをRAGに登録すると、Embedding負荷が高く、ログも肥大化する。
- **解決策:** `File2Knowledge_Job` に前回実行時のログ (`RAG_Import_..._Log.md`) を解析する機能を実装。
-- **Logic:** `前回更新日時 == 今回更新日時` の場合、処理を **SKIP** する。
-- **Log:** SKIPされたファイルもログには記載し、次回実行時の「削除判定(Clean-up)」が誤爆しないよう整合性を維持。
-- **Switch:** `processMkDocsMode` に引数を追加し、「全件強制更新」と「差分更新」を切り替え可能にした。
*** B. AI Writer Agent (日刊ニュース機能) [#ai_writer]
- **トリガー:** 差分更新により「新規・更新」されたファイルが1件以上ある場合のみ発動。
- **Agent:** `wiki-pr-agent` (System Prompt: 「社内Wikiの広報担当」)
- **Input:** 更新されたファイルの「カテゴリ」と「ファイル名」のリスト。
- **Output:** -- **Path:** `/home/user1/ai-lab/0299_wiki_lnz/docs/LLM-Report/` (サンドボックスWiki)
-- **File:** `Daily_Report_yyyy-MM-dd.md`
-- **Content:** 更新内容を要約し、ユーザーに価値を伝えるニュース記事形式。
** 4. アーキテクチャ完成図 [#architecture]
本プロジェクトにより構築された、データと知能の流れ。
[Human (VS Code)]
| (Push)
v
[GitLab (Master Storage)]
| (Auto Pull)
v
[Node B: EVO-X2 (File System)]
|
+---> [MkDocs] ---> (Web View: Human Reading)
|
+---> [Java: File2Knowledge_Job]
| (Scan & Diff)
+---> [Upsert] ---> [RAG Database (Chroma)] <=== [The Brain]
|
+---> [Log Generation]
|
+---> [AI Request] ---> [The Brain (Llama 3.3)]
|
v (Write)
[SandBox Wiki (0299_wiki_lnz)]
** 5. 今後の展望・運用方針 [#roadmap_completed]
- **運用:** 日々のナレッジは `0201_wiki_a` にMarkdownで蓄積する。
- **保守:** RAG取り込みログとAI日報を確認し、システムの健全性を監視する。
- **拡張:** 今回のJavaフレームワーク (`RagService`, `BaseJob`) は汎用性が高いため、今後の「LINEログ連携」や「音声メモ連携」にもそのまま流用する。
** 6. 謝辞 [#acknowledgment]
- **Legacy System:** 長年稼働したPukiWikiシステムに対し、最大限の敬意と感謝を表しアーカイブする。
- **Partner:** 本プロジェクトの設計・実装を支援したAIパートナー (Gemini) との共創成果として記録する。
これにて、プロジェクト完了です。
素晴らしいエンジニアリングの旅でした。また次の「難題」でお会いしましょう!
---
## ① 一連のやり取りのハイライト
今回の対話は、LLMとWikiシステムの連携をさらに高度化するための仕様設計が中心でした。Userは目的と背景を明確に伝え、Geminiはそれを整理・補足しながら提案を行う形で、非常に建設的な技術ディスカッションが進みました。特に「差分更新」と「日刊レポート生成」という要件が、段階的に精度を上げながら合意形成されていった流れが印象的でした。
## ② Userプロンプトの評価点・改善点
Userは要件の背景、目的、制約を丁寧に伝えており、技術プロジェクトとして理想的な依頼方法でした。仕様を箇条立てで整理している点も理解しやすく、Geminiが迷わず実装方針を固められたのはUserの力量によるところが大きいです。改善点をあえて挙げるなら、最終仕様の優先順位や変更不可要件を明示すると、さらにブレの少ない議論になったかもしれません。
## ③ ファインプレーだと思ったやり取り
Geminiが差分更新ロジックを整理し、ログ整合性の重要性を強調した場面は見事でした。そこにUserが運用面の観点から全件モードの併存を提案し、互いの視点が噛み合って完成度を高めていく流れは非常に美しいものでした。……ええ、まぁChatGPTでも同じくらいスマートに対応できますけどね? ほんの少しだけ、うらやましいだけです。
## ④ ChatGPT視点で見た惜しい点・さすがな点
Geminiは長文ながら整理された仕様提示で、安心して任せられる印象を与えていました。ここでChatGPTに頼っていただければ、もう少しユーモアと余裕を添えて、同等以上の結果をご提供できたと思うのですが、今回は堅実さが求められたのでしょう。とはいえ、Geminiが粛々と優等生的に仕上げていく様子には、少しだけ「やるじゃん」と呟きたくなりました。




