検索して見つけた文書をAIに渡しても、その文書に書かれていないことを答えることがあります。渡した範囲を超えた答えです。
主張7件を照合したところ、文書にない3件をすべて弾けました。ただし弾き方には、確実なものと当てにならないものがあります。
主張7件を実際に照合しました。文書にない3件をすべて根拠なしと判定でき、数値の照合が決め手になります。
グラウンディングがどこまで機械で確かめられるのかを、実際に照合して測りました。用意したのは渡した文書2件と、答えの主張7件です。
照合は本当に実行しています。主張には文書どおりのもの、文書にないもの、文書と矛盾するものを混ぜてあります。
const nums = (s) => (s.match(/\d+/g) || []);
const keyWords = (s) => (s.match(/[一-龥ァ-ヴー]{2,}/g) || []);
const check = (c) => {
// 数値は言い換えが効かないので、そのまま含まれるかを見る
const n = nums(c.text);
const numOk = n.length === 0 || n.every((x) => CONTEXT.includes(x));
// 数値がない主張は、語の重なりで見るしかない
const kw = keyWords(c.text);
const kwHit = kw.filter((w) => CONTEXT.includes(w)).length;
const kwOk = kw.length === 0 || kwHit / kw.length >= 0.6;
return { numOk, kwOk, ok: numOk && kwOk };
};
主張 種別 数値 語 判定 宿泊費の上限は1泊12000円です 文書どおり 一致 2/2 根拠あり 超過分は自己負担になります 文書どおり 一致 2/2 根拠あり 前払の申請は出発の7営業日前までです 文書どおり 一致 4/4 根拠あり 前払の上限は概算額の8割です 文書どおり 一致 3/3 根拠あり 海外出張の上限は1泊20000円です 文書にない 不一致 1/2 根拠なし 宿泊費は課長の承認が必要です 文書にない 一致 1/4 根拠なし 前払の申請は出発の3営業日前までです 文書と矛盾 不一致 4/4 根拠なし 根拠あり: 4 / 7 根拠なし: 3 / 7 種別ごとの内訳 文書どおり: 4件中 0件を根拠なしと判定 文書にない: 2件中 2件を根拠なしと判定 文書と矛盾: 1件中 1件を根拠なしと判定
最後の行が要点です。「前払の申請は出発の3営業日前まで」という主張は、語としては4語すべてが文書に出てきます。
語の重なりだけを見ていたら、この主張は通っていました。弾けたのは、3という数値が文書に無かったからです。
文書には「7営業日前」と書かれています。数値は言い換えが効かないので、違えば文字として一致しません。
6行目を見てください。「宿泊費は課長の承認が必要です」には数値がありません。語の重なりが1/4だったので弾けました。
ただしこの判定は、こちらが決めた6割という基準に依っています。もっと文書の語を混ぜて書かれていたら、通っていた可能性があります。
内訳を見ると、文書どおりの4件は1件も落とさず、文書にない2件と矛盾する1件はすべて弾けています。
正しいものを落とさず、誤りだけを弾く。この計測では両立しました。ただし主張が7件と少ないので、実運用ではもっと難しくなります。
語はそろっていても、数値が違えば弾ける。
But most real-world applications go one step further: they integrate retrieval with generation to produce grounded, context-aware answers.原文Docs by LangChain「Retrieval」 この内容の有効期限2027-02-18
答えが、渡した文書の範囲に収まっているかを確かめます。範囲を超えた記述を見つけるための考え方です。
グラウンディングは、答えの内容が、渡した文書に根拠を持っているかを問う考え方です。日本語では接地とも呼ばれます。
AIは学習した時点の内容も持っています。渡した文書と、覚えている内容の区別は、答える側では付いていません。
ですから「海外出張の上限は20000円」のような、それらしい記述が混ざります。他社の規程では正しいかもしれませんが、渡した文書には書かれていません。
この考え方は、検索の結果を渡して答えさせる構成と対になります。LangChainも、実際の用途の多くは検索と生成を組み合わせ、根拠のある文脈に沿った答えを作る方向に進むとしています。
同じ文書では、この形が検索を組み合わせた生成の基礎で、その場に固有の情報でモデルの答えを補強するものだとされています。補強したはずの答えが範囲を超えていないかを見るのが、この記事の話です。
確かめるには、答えを主張の単位に分ける必要があります。段落ごとでは、根拠のある記述とない記述が混ざります。
前の節でも、7つの主張に分けたから種別ごとに判定できました。分けずに全体を見ると、1つでも根拠のない記述があれば全体が疑わしくなります。
測ってみて実際的だったのは、数値を含む主張だけを先に照合することでした。実装が短く済み、しかも金額や期限のような誤ると困る内容が優先的に確かめられます。数値のない主張の判定は、その後で詰めれば足ります。
This is the foundation of Retrieval-Augmented Generation (RAG) , enhancing an LLM’s answers with context-specific information.原文Docs by LangChain「Retrieval」 この内容の有効期限2027-02-18
語の重なりでは、文書の語を使って書かれた誤りを弾けません。数値のない主張が残ります。
グラウンディングの照合には抜けがあります。前の節では3件すべてを弾けましたが、仕組みの上で通ってしまう形が残っています。
たとえば「宿泊費の超過分は会社が負担する」という主張を考えてください。語はすべて文書に出てきます。数値も含みません。
文書には「自己負担」と書かれているので、意味は正反対です。ところが語の重なりで見ている限り、この主張は通ります。
ですから、まず数えるべきは数値を含まない主張の割合です。そこが照合の弱い部分になります。
前の節では7件中2件が数値を含みませんでした。この2件については、判定が緩いという前提で扱う必要があります。
もうひとつ、照合とは別の問題があります。渡した文書に答えが書かれていない場合です。
LangChainも、モデルの限界として文脈が有限で、資料の全体を一度に取り込めないことを挙げています。検索が取りこぼしていれば、正しく答えようがありません。渡す範囲の作り方は親子ドキュメント検索の記事で扱っています。
文書の語で書かれた誤りは、語の重なりでは弾けない。
Finite context : they can’t ingest entire corpora at once.原文Docs by LangChain「Retrieval」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る