こう 聞かれます
- 「ハルシネーションに、
どう 手当てしますか」 - 「AI が
存在しない 情報を 答えてしまったら、 どうしますか」 - 「AI に
金額の 計算を 任せて よいですか」
面接官が 見ている点
- 無く
せる 物ではない、という 前提に 立てているか - 根拠を
渡す、 形を 固める、 コードで 確かめる、 人が 決める、と手を 重ねられるか - 間違いの
重さで、 AI に 任せる 範囲を 変えられるか
短い答え
- ハルシネーションは
無くせない 前提で、 RAG で 根拠の 文書を 渡し、 答えに 出典を 示して、 利用者が 確かめられるようにします。 - 出力は
決まった 形 (JSON スキーマ) で 出させ、 値が 正しい 範囲か、 根拠に ある 値かを コードで 確かめます。 - 医療や
金額のように 間違いが 命取りになる 場面では、 AI に 最後の 判断を させず、 人や 確かな プログラムが 決めます。
少し 詳しい答え
なぜ起きるか
LLM は、
重ねる手当て
- 根拠を渡す RAG で
関係する 文書を 渡し、 「渡した 文書だけを 根拠に 答える」 「載っていなければ 分からないと 言う」と 指示します - 出典を示すどの
文書の どこを 根拠に したかを 答えに 付けさせ、 画面にも 出します。 利用者が 元を 確かめられます - 形を固める
自由な 文ではなく、 決まった 欄の JSON で 出させます。 形が 決まると、 コードで 確かめられます - コードで確かめる
出た 値が 範囲内か、 根拠の 文書に 本当に ある 値か、 計算が 合うかを、 プログラムで 確かめます
TypeScript
type Answer = {
answer: string;
sources: string[]; // 根拠にした文書の番号
amountYen: number | null;
};
function check(a: Answer, docIds: string[]): boolean {
// 渡していない文書を出典にしていないか
const ok = a.sources.every((id) => docIds.includes(id));
// 金額は AI に計算させず、別のプログラムで出した値と比べる
return ok && (a.amountYen === null || a.amountYen >= 0);
}任せる 範囲を決める
間違えても
トレードオフ
「分からなければ
よく ある間違い
- プロンプトで
「嘘をつかないで」と 頼めば 直ると言う 減る ことは あっても、 無くなりません。 仕組みで 確かめます - RAG を
入れれば 起きないと言う 文書が あっても 読み違える ことがあります。 出典と 確かめを 組み合わせます - 計算を LLM に任せる
金額や 数の 計算は プログラムで 出し、 LLM には 説明だけを任せます
深掘りの問い
- 「ハルシネーションの
割合は、 どう 測りますか」 評価データで、 根拠に 無い ことを 言った 割合を 数える、と答えます - 「利用者には
どう 見せますか」 出典を 並べる、 AI の 答えである ことを 明かす、 確かめ方を 案内する、と答えます - 「答えられない
質問が来たら」 分からないと 伝え、 人の 窓口や 公式の 案内へ 渡す、と答えます