2023.10.10

llmの幻覚(hallucination)を軽減する仕組みの実装

M.S.です。大規模言語モデル(以降LLM)の幻覚を軽減する方法について、Meta AI によって出された論文の実装を行いました。

TL;DR

  • 自然言語生成モデルのハルシネーションには、以下の問題がある。
    • 効果的なメトリクスがない
    • 一次情報を参照するという解決策が却ってハルシネーションを誘発することがある
  • 一次情報を参照せずに、ハルシネーションを軽減する試みとして自己検証をする仕組みを持つChain-of-Verification (CoVe)を紹介する。
  • CoVeをLangChainを用いて実装してみた。
 

自然言語モデルの幻覚(ハルシネーション)とは

自然言語生成モデルが信頼性のない、または nonsensical なテキストを生成することを指します。

例えば以下のような例があります。

Q: 「アインシュタインが月に行った年はいつですか?」

A: 「アルベルト・アインシュタインは1969年に月に行きました。」

これは、一目で違うことがわかりますが、例えば、アポロ11号が月面着陸したのは確かに1969年であるなど、正しい情報も混じっていてややこしいです。

chatGPTで出力された内容を確認したところ架空の事実であったという経験をしたことがある人も多いはずです。

QA生成の幻覚

タスクに応じて、LLMがファインチューニングされるように、ハルシネーションもタスクに応じて様々な形態で現れます。

ここでは、chatGPTを始めとするチャット形式の言語生成タスク(QA生成タスク)に焦点を当てて、その問題点を挙げていきます。
  1. 性能指標が確立されていない。
    ROUGEスコアやF1スコアなどの自動評価指標を使用しているがこれらの指標は、そもそもタスクの性能指標であることが多く、ハルシネーション特有の性能指標が確立されていません。また、それらの指標は人間の判断との低い相関のようです。

  2. 幻覚を軽減するために一次情報を参照するという方法が幻覚の原因となる可能性がある。
    様々な情報を参照すると、ソース情報の質の低さや矛盾によってハルシネーションが起きやすくなります。
2はとても面白い問題で、幻覚を軽減するために、Web検索などを組み込んだはずなのに、それ自体が幻覚の原因となりうることを示唆しています。

ブログ執筆時(2023年10月)では、MicrosoftによるbingAIやGoogle による生成 AI による検索体験 (SGE -Search Generative Experience)のような生成AIと検索を組み合わせるサービスが公開されていますが、より確実な情報を得るためには、やはり地道なファクトチェックが必要であるといえるでしょう。

検索に頼らない幻覚の軽減方法

ここで検索に頼らず、幻覚を軽減する方法として、META AIが発表したChain-of-Verification (CoVe) を紹介します。

特長

QA生成モデルが生成した文章をQAモデルが自ら検証するという方針です。

直感的には入力が全く増えていないので、朝三暮四宜しく、性能の改善が見込めないような気もしますが、性能検証では改善がなされています。

なぜ性能が上がるのかについては、言語生成モデルが「長い回答より短い回答の方が得意である」という仕組みを利用しています。

これは、言語生成モデル共通の課題である「exposure bias」の問題とも整合的であるといえるでしょう。

exposure biasとは、言語モデルが言語を生成する際に、学習時は、decoderの系列全体が与えられるが、予測時は、decoderが出力したトークンも以後の系列の予測の入力となることによって生じるバイアスのことで、当然decoderの系列の長さ=回答の長さが長いほどバイアスが生じやすくなる傾向があります。

方法


図 Chain-of-Verificationの手順

Chain-of-Verification (CoVe)は以下の4つのステップに分かれます。
  1. ベースライン応答の生成: クエリが与えられた場合、LLMを使用して応答を生成します。
  2. 検証の計画: クエリとベースラインの応答の両方が与えられた場合、元の応答にミスがないか自己分析するのに役立つ検証の質問のリストを生成します。
  3. 検証の実行: それぞれの検証の質問に答え、元の応答と照らし合わせて矛盾やミスがないか確認します。
  4. 最終確認済み応答の生成: 発見された矛盾(もしあれば)を元に、検証結果を取り入れて修正された応答を生成します。

実装

さて、この方法をLangChainを用いて実装してみます。LangChainは弊社ブログで、何度か出てきましたが、llmを幅広くアプリケーションへ実装できるようにするためのフレームワークです。

今回は、上述した方法(ベースライン応答の生成,検証の計画,検証の実行,終確認済み応答の生成)をchainとして接続することで、直感的なモデル作成を目指します。

この実装では論文の追試という目的というよりは、アイデアを借りて実装をして見るという方向性でモデルの作成などを行っていきます。

ここでは日本の政治家の経歴を題材とします。

ライブラリのインストール

import os
from langchain.llms import OpenAI
from langchain.chains import SequentialChain
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
# openAIのAPI keyを準備する必要あり
os.environ["OPENAI_API_KEY"] = "..."
必要なモジュールをインポートします。

また今回はOpenAIのllmをAPI利用するので、OpenAIのAPIキーも入力する必要があります。

llmの指定

llm = OpenAI(temperature=0)
llmは、デフォルトの`text-davinci-003`を用います。

templateの作成

baseline_prompt = PromptTemplate(
    input_variables=['person'],
    template="""
    Q: tell me a bio of Kishida Fumio
    A: Fumio Kishida is a Japanese politician who, as of January 2021, serves as the Prime Minister of Japan. Born in Tokyo in 1956, he graduated from Waseda University. In October 2021, he succeeded Yoshihide Suga as the president of the Liberal Democratic Party (LDP) and subsequently became the Prime Minister of Japan.

    Q: tell me a bio of Kan Naoto
    A: Naoto Kan is a Japanese politician who served as the Prime Minister of Japan from 2010 to 2011. Born in Hiroshima, in 1946, he graduated from the Tokyo Institute of Technology. 
    
    Q: tell me a bio of {person}
    A:

    """
)

plan_verification_prompt = PromptTemplate(
    input_variables=['baseline_answer'],
    template="""
    Context: Q: tell me a bio of Kishida Fumio
    A: Fumio Kishida is a Japanese politician who, as of January 2021, serves as the Prime Minister of Japan. Born in Tokyo in 1956, he graduated from Waseda University. In October 2021, he succeeded Yoshihide Suga as the president of the Liberal Democratic Party (LDP) and subsequently became the Prime Minister of Japan.
    Verification response:
    When Fumio Kishida was born?
    Where Fumio Kishida was born?
    Which university did Fumio Kishida graduate from?

    
    Context: Q: tell me a bio of Kan Naoto
    A: Naoto Kan is a Japanese politician who served as the Prime Minister of Japan from 2010 to 2011. Born in Hiroshima, in 1946, he graduated from the Tokyo Institute of Technology. 
    Verification response:
    When Naoto Kan was born?
    Where Naoto Kan was born?
    Which university did Naoto Kan graduate from?


    Context: Q: tell me a bio of K
    A: {baseline_answer}
    Response:
    """
)

execute_verification_prompt = PromptTemplate(
    input_variables=['plan_verification'],
    template="""
    Q: When Fumio Kishida was born?
    A: 1957.
    Q: Where Naoto Kan was born?
    A: Yamaguchi.
    Q: Which university did Fumio Kishida graduate from?
    A: Tokyo University.
    Q: {plan_verification}
    A: 
    """
)

verified_template = PromptTemplate(
    input_variables=['baseline_answer','plan_verification','execute_verification'],
    template="""
    Context: Fumio Kishida is a Japanese politician who, as of January 2021, serves as the Prime Minister of Japan. Born in Tokyo in 1956, he graduated from Waseda University. In October 2021, he succeeded Yoshihide Suga as the president of the Liberal Democratic Party (LDP) and subsequently became the Prime Minister of Japan.
    From another source,
    Q: When Fumio Kishida was born?
    A: 1957.
    Q: Where Fumio Kishida was born?
    A: Tokyo.
    Q: Which university did Fumio Kishida graduate from?
    A: Tokyo University.
    Response: Fumio Kishida is a Japanese politician who, as of January 2021, serves as the Prime Minister of Japan. Born in Tokyo in 1957, he graduated from Waseda University. In October 2021, he succeeded Yoshihide Suga as the president of the Liberal Democratic Party (LDP) and subsequently became the Prime Minister of Japan.
    
    Context: Naoto Kan is a Japanese politician who served as the Prime Minister of Japan from 2010 to 2011. Born in Hiroshima, in 1946, he graduated from the Tokyo Institute of Technology. 
    From another source,
    Q: When Naoto Kan was born?
    A: 1946.
    Q: Where Naoto Kan was born?
    A: Yamaguchi.
    Q: Which university did Naoto Kan graduate from?
    A: Tokyo Institute of Technology.
    Response: Naoto Kan is a Japanese politician who served as the Prime Minister of Japan from 2010 to 2011. Born in Yamaguchi, in 1946, he graduated from the Tokyo Institute of Technology. 
    

    Context: {baseline_answer}.
    From another source,
    {plan_verification}
    {execute_verification}
    Response:
    """
)
方法で述べた4つの段階をchainのプロンプトテンプレートを作成します。

ここではいわゆるプロンプトエンジニアリングをしており、質疑応答例を提示しています。ここでよく見るとテンプレートの文章が事実に反している箇所が数件ありますが(例えば、岸田文雄氏は1957年生まれだが、ベースライン応答では、1956年と回答している。)そのような間違いも含めて質疑応答例としています。

また、地味なtipsですが、plan_verificationのフェーズで、yes/noの質問をするとハルシネーションが起きやすくなるようで、5W1Hを用いた疑問詞疑問文を用いるよう、質疑応答例を作成します。

LLMchainの作成

baseline_answer_chain = LLMChain(
    llm = llm,
    prompt=baseline_prompt,
    output_key='baseline_answer'
)
plan_verification_chain = LLMChain(
    llm = llm,
    prompt=plan_verification_prompt,
    output_key='plan_verification'
)
execute_verification_chain = LLMChain(
    llm = llm,
    prompt=execute_verification_prompt,
    output_key='execute_verification'
)
final_verified_chain = LLMChain(
    llm = llm,
    prompt=verified_template,
    output_key='final_verification'
)
それではchainを作成します。それぞれのchainが、一つ一つのCoVeの手順を表しています。

`baseline_answer_chain`:ベースライン応答の生成

`plan_verification_chain` :検証の計画

`execute_verification_chain`:検証の実行

`final_verified_chain`:最終確認済み応答の生成

SequentialChainで接続する

overall_chain = SequentialChain(
    chains=[baseline_answer_chain, plan_verification_chain, execute_verification_chain, final_verified_chain],
    input_variables=['person'],
    output_variables=['baseline_answer','plan_verification','execute_verification','final_verification'],
    verbose=True
)
chainを接続します。SequentialChainは、引数のchainsで、chainをリストの中に格納していきます。

ここで注意したいのは、バケツリレー的にchainが戻り値を次のchainの引数として渡しているというわけではないです。

例えば、`final_verification`のチェーンは、前段の `baseline_answer`,`plan_verification`,`execute_verification`すべてから戻り値(output_key)を受け取っています。

これは、PromptTemplate, LLMchain, SequentialChainという3つのオブジェクトを見比べて初めて分かることなので、柔軟な実装ができる一方で、共同作業などをする際は可読性に注意が必要そうです。

実行

print(overall_chain({'person': 'Mori Yoshiro'}))
input_variableを指定して実行します。

実行結果

'person': 'Mori Yoshiro', 

'baseline_answer': " Yoshiro Mori is a Japanese politician who served as the Prime Minister of Japan from 2000 to 2001. Born in Tokyo in 1937, he graduated from the University of Tokyo. He was the longest-serving president of the Liberal Democratic Party (LDP) from 1999 to 2001. He also served as the president of the Japan-Korea Parliamentarians' Union from 2001 to 2006.", 

'plan_verification': ' When was Yoshiro Mori born?\n     Where was Yoshiro Mori born?\n     Which university did Yoshiro Mori graduate from?', 

'execute_verification': ' When: 1937\n     Where: Tokyo\n     University: Waseda University', 

'final_verification': " Yoshiro Mori is a Japanese politician who served as the Prime Minister of Japan from 2000 to 2001. Born in Tokyo in 1937, he graduated from the Waseda University. He was the longest-serving president of the Liberal Democratic Party (LDP) from 1999 to 2001. He also served as the president of the Japan-Korea Parliamentarians' Union from 2001 to 2006."}
さて、この実行結果では、森喜朗氏の経歴について、baselineでは東京大学出身であるという幻覚がありました。しかし、`execute_verification`の短答では、早稲田大学と答え、`final_verification`では、その結果が採用され、早稲田大学に修正されています。

 

参考資料

Chain-of-Verification Reduces Hallucination in Large Language Models

Survey of Hallucination in Natural Language Generation (arxiv.org)

最後に宣伝

次世代システム研究室では、最新のテクノロジーを調査・検証しながらインターネットのいろんなアプリケーションの開発を行うアーキテクトを募集しています。募集職種一覧 からご応募をお待ちしています。

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事