「実務で後一歩使えない」を解決するLLM・RAG ~質問回答に必要なドキュメントを適切に検索する~
Nishika DSの髙山です。
今回は前回の記事「実務で後一歩使えない」を解決するLLM・RAG ~PDFの表を崩さず理解する~の続編です。
実際にLLM・RAGを使ったシステムを構築した際に「なかなか適切なドキュメントをひっかけてくれない」という悩みはつきものです。どのような場合にドキュメントの検索が難しいのか、課題とその解決策を紹介します。
【実務での悩み】固有名詞(商品コード、製品名など)に関する質問に関するドキュメントが検索できない
例えば商品固有の名前やコードについて質問をして社内のナレッジに基づいて回答をさせたいというケースは実務でニーズがあると思います。
日本の官公庁のWebサイトに掲載されている「よくある質問」を手作業で抽出し、インストラクション用の公開データセット「matsuxr/JaGovFaqs-22k」を使用して22,794のQAのセットを使用して検索結果を見てみます。
RAGを構築する際には高精度のテキスト埋め込みを使用することが多いため、例に漏れずOpenAIの最新のテキスト埋め込みモデルtext-embedding-3-smallを使用してQuestionとAnswerを繋げた文字列についてベクトル化したうえでGPT 3.5 Turbo (1/25カットオフ)を使用して回答する簡単RAGの実装を用意します。
製品コードを含む質問をした結果が次のとおりです。
質問:IDEA製品コード051112000はどういう意味か
回答:IDEA製品コード051112000に関する情報は提供されていませんので、その意味について回答することはできません。もし、別の情報源や資料があれば、それを参照して詳細を確認することができます。
情報が提供されていないため回答できておりません。検索結果を確認すると「IDEA製品コード051112000」を含むQAが検索結果の上位にないことがわかります。
# 検索順位1位
Q: 用法コードを追加したい場合は、どのように希望を出せばよいでしょうか。A: 「用法マスタ」や「用法コードの紐付け事例集」等を参照し、類似の用法コードが無いか確認してください。https://iryohokenjyoho.service-now.com/csm?id=kb_article_view&sysparm_article=KB00101062.類似のコードがない場合は、電子処方箋用法コード追加希望理由書に必要事項を記入の上、件名を「用法コード追加依頼」と明記し、下記へメール送付をお願いします。【送付先メールアドレス】yohocode_shohosen@ssk.or.jp<電子処方箋用法コード追加希望理由書はこちら>3.追加希望理由書を受理後、検討し、結果を返送します。
# 検索順位2位
Q: 扱う製品・商品について“推奨(おすみつき)”をもらえますか?A:
本PROJECTは、特定の商品やサービスを推奨するものではありません。また、商品の品質を担保・証明していると誤解を招くようなロゴマークの使用の仕方はできません。
# 検索順位3位
...(中略)...
# 検索順位10位
Q: 業種コードは、必ず4桁で記載しなければならないのですか。A: 届出書の業種コード欄には、PRTR届出の手引きに記載されているもの(4桁)のみを記載してください。例えば、同要領の中で下2桁が「00」となっているものは、日本標準産業分類のより詳細な業種分類やコード番号を記入しないでください。また、第III部4-1-1(→ p.III-192)の最左欄に記載されている記号も記入しないでください。
例:×「プラスチック管製造業2212※」→○「プラスチック製品製造業 2200」
×「食料品製造業3a」→○「食料品製造業 1200」
※:日本標準産業分類(平成5年改訂版)の分類番号。
ベクトルベースのセマンティック検索は言葉の字面(表層)が違っていてもユーザの意図やクエリの意味を理解して、関連性の高い情報を検索する技術です。OpenAI Embeddingsは特段多言語のテキスト検索に強いですが、こうした固有名詞の検索については期待通りの結果が得られないことがあります。
【解決手段】Okapi BM25によるキーワード検索を利用する
Okapi BM25(以降BM25とする)によるキーワード検索を利用することで固有名詞に関する質問の回答精度を向上することができます。
BM25はベクトルベースのセマンティック検索ではなく、いわばTF-IDFの進化系のキーワードベースの検索手法で以下のような特徴があります。
- 文書の長さや単語の組み合わせも加味した上で単語の出現頻度を総合的に高精度に評価
- 複数のキーワードを含むクエリに対応
- 手法自体は特定の言語に依存しない手法
検索方法をtext-embedding-3-smallではなくBM25に変更して、その他の条件は変えず質問をするとドキュメントの内容に基づいて正しく回答できるようになります。
※BM25のインデックス作成時には、形態素解析器(Fugashi[unidic-lite])を使用し、名詞・動詞・形容詞の単語に限定し重要でないストップワードを除外しております。
質問:IDEA製品コード051112000はどういう意味か
回答:IDEA製品コード051112000は、燃料IDEAv2.3の一般炭を指すようです。この製品コードは、サプライチェーン温室効果ガス排出量算定用であり、Scope12排出量と重複するため、カテゴリ3排出量算定の原単位としては不適切とされています。つまり、このコードは燃料IDEAv2.3の一般炭を示し、温室効果ガス排出量算定に使用される特定の製品を指していると考えられます。
検索方法をBM25に置き換えた場合、検索順位1位に「IDEA製品コード:051112000 『一般炭』」という文言が入ったドキュメントが含まれており、検索精度が改善し回答内容が妥当であることが確認できます。
# 検索順位1位
Q: カテゴリ3の排出量はどのように算定すればよいのか。A: Scope12排出量の算定において用いた活動量(エネルギー消費量)に、カテゴリ3用の排出原単位を乗じることで算定することができます。カテゴリ3において用いることができる排出原単位は、例えば下記があります。
■電力、蒸気サプライチェーンを通じた組織の温室効果ガス排出等の算定のための排出原単位データベース[7] 電気・熱使用量あたりの排出原単位(表7)
■燃料IDEAv2.3(サプライチェーン温室効果ガス排出量算定用)
※例.IDEA製品コード:051112000 「一般炭」等なお、IDEA製品コード:05112801「一般炭の燃焼エネルギー」等は、システム境界に「使用(燃焼)」を含み、Scope12排出量と重複するため、カテゴリ3排出量算定の原単位としては不適切です。
※参考LCIデータベースIDEA version 2.3 国立研究開発法人 産業技術総合研究所 安全科学研究部門 社会とLCA 研究グループ、一般社団法人サステナブル経営推進機構
# 検索順位2位
Q: 同一化学物質含有で、SDSの記載内容が全く同一の製品の場合、別途製品一覧で含有率を記載して、化管法に基づくSDSにはコードを羅列して「製品名及び含有率は製品一覧で確認してください。」と記載する方法でもよいのでしょうか。A: 原則、1製品ごとにSDSを作成する必要があります。
(1) 相手方が承諾すれば、それで結構です。
(2) 相手方が承諾すれば、それで結構です。
# 検索順位3位
...(以下略)...
まとめ
ベクトルベースのセマンティック検索は高精度ですが、デメリットもあります。BM25を使用することで固有名詞を含む質問の回答精度を改善することがわかりました。
実務レベルでRAGの仕組みを実装する際にはユースケースに合わせて検索手法をチューニングすることが肝要です。
固有名詞を含む質問、含まない質問の両方が考えられる場合はハイブリッドな検索やアプリ設計を検討します。検索手法に限って言えば、例えば以下の案を検討します。
- 最初の1段階目ではBM25で検索した後に、2段階目で上位数十件についてベクトル検索をする
- ユーザーが検索スコアの重みづけを切り替えられるようなアプリ設計にする
検索手法も重要ですが、どのようにドキュメントの内容を分割してベクトルを作成するか、ドキュメントの情報をどのように扱うかがより重要です。そちらについても今後の記事で書いていきたいと思います。
Nishikaについて
Nishikaは2019年に創業、「テクノロジーですべての人が誇りを持てる社会の実現」をビジョンに掲げ、「テクノロジーを、普段テクノロジーからは縁の遠い人にとっても当たり前の存在としていき、皆の仕事の付加価値・業務効率を向上させることに貢献したい」と考え、活動しています。
AIプロダクト事業/AIコンサルティング・開発事業/AI人材事業を手掛け、AIコンサルティング・開発事業では「生成AIを使うと何が嬉しいのか、通り一遍ではない使い方を知りたい」という段階のお客様から、伴走してご支援するアプローチを強みとしています。
We're hiring!
Nishikaテックチームでは、「テクノロジーを、普段テクノロジーからは縁の遠い人にとっても当たり前の存在としていく」を目指し、音声AIプロダクトの開発・生成AIを活用した課題解決ソリューションの構築を行なっています。
興味をお持ちいただけた方は、以下リンクからご応募お待ちしています。インターンも募集しております!
Discussion