自然な会話生成が得意なLlama3:8Bを活かしつつ、誤情報(ハルシネーション)を防ぐにはどうすればよいか。Ruby on Rails環境で構築するAIチャットシステムに、スクレイピングとLlamaIndexを絡めた、新しい検証・補強のアーキテクチャを提案します。
スクレイピングによって公式サイト・信頼性の高い情報源からリアルタイムに情報を取得し、Rails内で比較検証することで「正確さ」と「自然さ」を両立。さらに、LlamaIndexを取り込み、RAGアーキテクチャでの根拠付き応答や検索性の向上を図ります。実際のスクレイピング対象サイトや、検証ロジックを含めた設計の裏付けとともに、現実的な構成例を深掘りします。
スクレイピング連携で信頼できる情報を取得する仕組み
信頼できる情報源の選定と取得方法
OpenAI公式ブログ・Microsoft Copilot公式など、技術系公式ページ
業界別なら、厚生労働省(医療)・日本銀行(金融)など信頼公的情報サイト
(前回ご提案内容をベースに展開)
スクレイピング実装技術(Ruby/Python)とキャッシュ設計
Ruby(Nokogiri)/Python(BeautifulSoup or Selenium)の使い分け
PostgreSQLによるキャッシュ管理、Sidekiqを使った非同期取得・定期更新設計
情報信頼性の定量評価指標の設計
TF-IDFやBM25などによるキーワードベース整合度
埋め込み(Embedding)ベースによる意味的一致率
情報の鮮度(タイムスタンプ比較による時系列精度)
LlamaIndex を使った構造化の概要
LlamaIndexによるインデックス化の仕組み
LlamaIndexは大規模言語モデルと外部データ(PDF・HTML・DBなど)をつなぐオープンソースのデータオーケストレーションフレームワークです IBMstarscript.co.jp。
非構造データをドキュメントやノード単位で整形・チャンク化し、ベクトル検索やキーワード検索対応のインデックスを設計できます note(ノート)starscript.co.jp。
RAG(Retrieval-Augmented Generation)との連携方式
ユーザー質問に応じて、インデックスから関連ドキュメントを取得し、それをコンテキストに含めてLlama3に応答を依頼 → 根拠付き応答を生成する流れ(RAG) AI Marketstarscript.co.jp。
検証エンジンとの連動と類似度評価
LlamaIndexから取得した情報とLlama3の応答を比較し、類似度が低い場合は再生成や注釈付き応答に。
これにより、「ハルシネーションの可能性あり」と判断して代替データを提示。
チャンク化とインデックス化の実際
スクレイピングで取得した情報をそのままLlama3に渡しても、冗長でノイズが多く、精度の高い検索や応答生成は難しいのが現実です。そこで重要になるのが 「チャンク化」 です。
チャンク化とは、取得したデータを「意味のある単位」に分割し、メタデータを付与して検索可能なノード(Node)として管理することを指します。LlamaIndexはこの工程を前提に設計されており、正しい粒度での分割と適切なメタデータ付与が、ハルシネーション防止に直結します。
以下では、チャンク化の仕組みをHTML/JSONを例にして解説し、その上で実際にどうインデックス化が行われるかを整理します。
Document化とNode化のプロセス
まずはスクレイピングした情報を「ドキュメント(Document)」に変換し、それをさらに小さな意味単位で「ノード(Node)」に分割します。
HTMLの例(ニュース記事)
→ Node化例(Python)
from llama_index import TextNode nodes = [ TextNode(text="タイトル: AIが変える未来", metadata={"type": "title"}), TextNode(text="日付: 2025年8月20日", metadata={"type": "date"}), TextNode(text="人工知能は医療、教育、交通など多くの分野で革新をもたらしている。", metadata={"type": "body"}), TextNode(text="特に自然言語処理の進化は、情報アクセスのあり方を根本から変えている。", metadata={"type": "body"}) ]
JSONデータのチャンク化とメタデータ付与
APIレスポンスのようなJSONも同様に分割可能です。
JSONの例(商品情報API)
{ "product": {
"name": "高性能ノートPC",
"price": "198000円", "specs": { "CPU": "Intel Core i7", "RAM": "16GB", "Storage": "512GB SSD" }, "description":"ビジネスにもゲームにも最適な高性能モデルです。" } }→ Node化例(Python)
nodes = [ TextNode(text="商品名: 高性能ノートPC", metadata={"type": "name"}), TextNode(text="価格: 198000円", metadata={"type": "price"}),
TextNode(text="CPU: Intel Core i7", metadata={"type": "spec"}), TextNode(text="RAM: 16GB", metadata={"type": "spec"}), TextNode(text="Storage: 512GB SSD", metadata={"type": "spec"}), TextNode(text="説明: ビジネスにもゲームにも最適な高性能モデルです。",metadata={"type": "description"}) ]
ここでメタデータ(type, URL, 取得日時など)を付与しておくと、検索時に「価格情報だけ」「記事本文のみ」などのフィルタリングが可能になります。
インデックス構築とRetrieverでの活用
ノード化した情報は、そのままではただの断片に過ぎません。そこでEmbeddingを計算し、VectorStoreIndex や KeywordTableIndex に格納します。
VectorStoreIndex
各Nodeをベクトル化し、意味的な類似度検索を可能にする。
→ 「AIが教育に与える影響は?」という質問に対して、本文Nodeを優先的に抽出できる。KeywordTableIndex
キーワードベースでインデックス化。
→ 商品名やカテゴリなど、構造化された属性検索に強い。
Retrieverはこれらのインデックスから関連Nodeを取り出し、Llama3がその内容をもとに応答を生成します。
粒度が粗すぎると不要な情報まで引っかかり、細かすぎると文脈が途切れるため、チャンク化の粒度設計が検索精度に直結するのがポイントです。
システムの応用と実運用における設計拡張
信頼度スコアとUIへの統合
AI応答に「信頼度:85%(検証済)」などのスコア表示。ユーザーによるフィードバック機構のUI設計。
定期情報更新の仕組みと運用自動化
CronやSidekiqでスクレイピング結果の定期更新 → インデックス再構築 → 最新情報を反映した応答の自動生成。
業界別ユースケース拡張(医療・金融・教育など)
各分野に応じた信頼ソースの選定と、専門情報取得・検証のフロー拡張。たとえば法律や法令、教育関連なら官公庁サイトや公共文書。
〆
以上、間違い・ご意見は
以下アドレスまでお願いします。
適時、返信・改定をします。
nowkouji226@gmail.com