ハルシネーション防止に強い!スクレイピング×LlamaIndex連携型AI会話システム設計

New Challenge

自然な会話生成が得意な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の例(ニュース記事)

    <html>
    
      <body>
    
            <h1>AIが変える未来</h1>
    
              <p class="date">2025年8月20日</p>
    
              <div class="article">
    
                  <p>人工知能は医療、教育、交通など多くの分野で革新をもたらしている。</p>
    
                  <p>特に自然言語処理の進化は、情報アクセスのあり方を根本から変えている。</p>
    
          </div
    
      </body>
    
    
    </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を計算し、VectorStoreIndexKeywordTableIndex に格納します。

  • VectorStoreIndex
    各Nodeをベクトル化し、意味的な類似度検索を可能にする。
    → 「AIが教育に与える影響は?」という質問に対して、本文Nodeを優先的に抽出できる。

  • KeywordTableIndex
    キーワードベースでインデックス化。
    → 商品名やカテゴリなど、構造化された属性検索に強い。

Retrieverはこれらのインデックスから関連Nodeを取り出し、Llama3がその内容をもとに応答を生成します。
粒度が粗すぎると不要な情報まで引っかかり、細かすぎると文脈が途切れるため、チャンク化の粒度設計が検索精度に直結するのがポイントです。

システムの応用と実運用における設計拡張

信頼度スコアとUIへの統合

AI応答に「信頼度:85%(検証済)」などのスコア表示。ユーザーによるフィードバック機構のUI設計。

定期情報更新の仕組みと運用自動化

CronやSidekiqでスクレイピング結果の定期更新 → インデックス再構築 → 最新情報を反映した応答の自動生成。

業界別ユースケース拡張(医療・金融・教育など)

各分野に応じた信頼ソースの選定と、専門情報取得・検証のフロー拡張。たとえば法律や法令、教育関連なら官公庁サイトや公共文書。

以上、間違い・ご意見は
以下アドレスまでお願いします。
適時、返信・改定をします。

nowkouji226@gmail.com

今の仕事関係

タイトルとURLをコピーしました