VWork バイブコーディングフレームワーク

OpenKBで自社ナレッジのAI相談窓口とWikiを作った —— gemma4 12bとDeepSeekは『コンパイル』と『回答』で効き方が違う

Kurageの公開情報(商品カタログ・各プロダクトのLP・README・技術記事290本の索引)を OpenKB に入れて、2つのものを作りました。

作りながら一番おもしろかったのは、ローカルの gemma4 12b と DeepSeek V4 Flash が、RAGパイプラインの「どこで」差を出すのかでした。本稿はそこを技術寄りにまとめます。

OpenKBとは:ベクトルDB不要のRAG

OpenKB(VectifyAI・Apache-2.0)は、生ドキュメントをLLMで相互リンクされたWikiにコンパイルするナレッジベースです。検索は同社の PageIndex(ベクトルDB不要・木構造の推論ベース検索)。

従来のRAGが毎クエリでゼロから検索するのに対し、OpenKBは一度Wiki化して蓄積します(要約ページ・概念ページ・エンティティページ・[[wikilink]])。LLMは LiteLLM 経由で差し替え可能(OpenAI / Claude / Gemini / DeepSeek / Ollama…)。今回はローカルOllamaの gemma4:12b とDeepSeek APIを比べました。

肝:パイプラインには「2つのLLMの仕事」がある

OpenKBでLLMが働く場所は、性質のまったく違う2つに分かれます。

  1. コンパイル:ドキュメント → Wiki(要約・概念・エンティティ・相互リンク)を生成する。取り込み時に一度だけ走る重い処理
  2. 回答(query):出来上がったWikiを検索してユーザーの質問に答える。都度走る軽い処理

この2つで、gemma4とDeepSeekの「効き方」が正反対でした。

コンパイル:gemma4は”正確な事実”を落とす

最初は全部ローカルの gemma4:12b でやりました。すると、出来上がったWikiに問題が出ます。

OpenKBのコンパイルは資料を概念的な文章に要約する設計です。その圧縮の過程で、価格・URL・手数料といった「正確な事実」が抜け落ちました。たとえば商品エンティティのページに、価格もLPのURLも残らない。生テキストには残っていますが、回答エージェントはそこまで掘らず「詳細は記載なし」と答えてしまいます。

同じ資料を DeepSeek V4 Flash でコンパイルし直すと、事実が保持されました。エンティティページに「55,000円」「商品ページのURL」「デモURL」がそのまま残ります。要約の”捨て方”が、モデルの強さで変わるわけです。

実測値:

コンパイルは「要約の質 = 事実の保持」が命。だから強いモデル(DeepSeek)を使う。

回答:gemma4は速くて無料、でもURLを”作る”

回答(query)側は、出来上がったWikiを読むだけなので軽い。ここはローカル gemma4:12b で無料運用したい。

DeepSeekでコンパイルした(=事実が残っている)Wikiを、gemma4で読ませると:

DeepSeekは同じ質問で、正しいLP URL+価格+手数料まで毎回返します。

回答の「正確なURL取得」は gemma4 12b の agentic retrieval の弱点。無料で概念的な回答はできるが、”正確な誘導先”が要る用途はDeepSeekが安全

設計:コンパイル=DeepSeek、回答=選べる

OpenKBは config.yamlmodel ひとつでコンパイルも回答も回します。でも役割で分けたい。そこで回答側だけ環境変数で上書きして、

を1行で切り替えられるようにしました。

LiteLLM × Ollama のハマりどころ

ローカルgemma4をLiteLLM経由で使うときの実務メモ:

出来上がり:相談窓口+Wiki=GEOと送客

最終形はこうなりました。

まとめ:モデルは”役割で使い分ける”

ローカルLLMは「全部これで」ではなく、重い要約はクラウド、軽い読み取りはローカル——という使い分けが、コストと品質のバランス点でした。