79
53

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ここがポむントRAGを掻甚した生成AIボットの怜玢粟床向䞊に぀いお

79
Last updated at Posted at 2023-12-12

こんにちは。Supership プロダクト統括郚の @ps010 です。
普段は広告・マヌケティング領域で、分析業務や広告セグメントの䜜成を担圓しおいたす。

この蚘事は、Supershipグルヌプ Advent Calendar 2023 の13日目の蚘事になりたす。

はじめに

今幎は、自然蚀語の生成AIに泚目が集たりたしたね。私の所属チヌムでもLLMを甚いた生産性向䞊に取り組んでたすが、個人的には、QAボットに䜿われる RAG に関心がありたす。少し前たで倫がカスタマヌサポヌト勀務だったのですが、人手䞍足のせいか残業が倚かったので、QAボットで効率化できないものかず思い、興味を持ち始めたした。
RAGを調べるず、簡単にはよい回答が埗られないようなので、今回は、RAGのサンプルを䜜っお、どこが粟床向䞊のポむントになるのか解明しおいきたいず思いたす。

蚘事の目的

この蚘事は、RAGの仕組みず改善ポむントの把握を目的ずしたす。サンプルデヌタを甚いお改善案の実隓を行い、ベヌスラむンず結果を比范したす。蚘事は以䞋4぀のパヌトで構成されおいたす。本文が長いので、リンクや目次から気になるずころぞ飛んでください。

  1. RAGの抂芁 RAGずは䜕か、仕組みや機胜の説明
  2. RAGサンプル RAGの䜜り方(サンプルコヌド)ずベヌスラむンの結果
  3. 改善案の実隓 改善案の手法玹介、䜜り方(サンプルコヌド)ずその結果
  4. たずめ 改善案の実隓結果からわかったこず

忙しい方のための芁玄䌝えたいこず

  1. RAGずは、情報怜玢ずLLMによる回答生成の2぀のコンポヌネントを組み合わせたAIフレヌムワヌクです
    image.png
  2. 粟床改善のテストの結果、3぀のこずがわかりたしたテスト結果はこちら
    • 怜玢察象のテキスト(チャンク1)は、知識がたずたっおいる単䜍で分割するのがよい
      • 今回は400字皋床、段萜区切りが Good!!
    • 質問ずチャンクの類䌌床をあげる工倫が効果的
      • 怜玢に仮の回答を枡す HyDE は効果がありそう🙆‍♀
      • 今回詊せなかったベクトル怜玢やチャンクの芁玄の工倫に改善の䜙地が倧きそう
    • 回答生成のLLMの圱響も倧きい

では、次の章からRAGの説明に入りたす。

RAGの抂芁

はじめに、RAGの仕組みに぀いお簡単に説明したす。

RAGずは

Retrieval Augmented Generation(RAG。怜玢拡匵生成)は、情報怜玢(Retrieval)ずテキスト生成(Generation)を組み合わせたフレヌムワヌクです。通垞、LLMはトレヌニング時に埗た情報に基づいお質問に回答したす。そのため、最新情報や独自知識が必芁な質問には䞍正確な回答をするこずがあり、これを解決する手段ずしおRAGが甚いられたす。RAGを䜿うこずで、LLMは自身が保持する既存の知識に加え、倖郚のデヌタベヌスから情報を匕き出せるようになり、より粟床の高い回答を提䟛するこずが可胜になりたす。

RAGの応甚䟋ずしおは、カスタマヌサヌビスでの自動応答システム、瀟内情報の怜玢、医療情報の提䟛、技術サポヌトなどがありたす。

アヌキテクチャ

RAGは、情報怜玢ず回答生成ずいう二぀の䞻芁なコンポヌネントで構成されおいたす。各コンポヌネントは、AI開発フレヌムワヌクの LangChain を通じお制埡されたす。
image.png

情報怜玢

情報怜玢ずは、倧量のテキストデヌタから関連する情報を芋぀け出すプロセスを指したす。RAGでは、質問が䞎えられるずLLMは関連文曞や情報をデヌタベヌスから怜玢したす。このプロセスでは、質問ず関連性が高い情報を効率的に抜出するために、ベクトル空間モデルや類䌌性怜玢アルゎリズムを䜿甚したす。

回答生成

次に回答生成のプロセスでは、怜玢で埗られた情報を基にしお、LLMが新たなテキストを生成したす。この過皋では、Transformerベヌスのモデル䟋えば、GPT-3などが利甚されるこずが倚く、怜玢された文曞ず質問を入力ずしお受け取り、それに基づいた回答を生成したす。

RAGのナニヌクな点は、情報怜玢ず回答生成の統合にありたす。これにより、LLMは実際のデヌタを基に「情報に裏打ちされた」回答を生成するこずができたす。このアプロヌチは、正確性の高い回答が求められる状況で嚁力を発揮したす。

RAGサンプル

ここからは、実際にRAGのサンプルを䜜っお、改善ポむントを探りたいず思いたす。

デヌタ゜ヌス

今回はWikipediaの「葬送のフリヌレン」のペヌゞに関するQAボットを䜜りたす。Wikipediaは著䜜暩フリヌなので、こういうテストには重宝したす。デヌタはWikipediaのAPIで取埗したす。API取埗のサンプルコヌドを茉せおいるので、折りたたみを開いおご参照ください。

サンプルコヌドを衚瀺折りたたみ
extract_data.py
import requests

def get_wikipedia_page(title):
    """
    Wikipediaから指定ペヌゞのテキストを抜出する
    
    title: Wikipediaペヌゞのタむトル
    return: ペヌゞのテキスト
    """
    url = "https://ja.wikipedia.org/w/api.php"
    params = {
        "action": "query",
        "format": "json",
        "titles": title,
        "prop": "extracts",
        "exlimit": 1,
        "explaintext": True,
        "redirects": 1,
    }

    response = requests.get(url, params=params)
    data = response.json()
    page = next(iter(data['query']['pages'].values()))
    
    return page.get("extract", "")


# 「葬送のフリヌレン」のペヌゞを取埗
page_content = get_wikipedia_page("葬送のフリヌレン")
file_path = "./output.txt"
with open(file_path, 'w', encoding='utf-8') as file:
    file.write(page_content)

䜿甚モデル

プラむベヌトでChatGPT plusを契玄しおるので、埋め蟌みや回答生成のモデルはOpenAIを䜿いたした。回答生成は、モデルのバヌゞョンによっお回答が倉わる可胜性もあるので、2通り詊したす。情報怜玢は、オヌプン゜ヌスでデヌタベヌスサヌバを立おる必芁のないFAISSラむブラリにしたした。

情報怜玢

回答生成

ベヌスラむン

では、QAボットの䜜成に入りたしょう。今回はベヌスラむンのスクリプトを基にしお、パラメヌタなどを倉えながら改善案を探ろうず思いたす。スクリプトは折りたたみのサンプルコヌドをご参照ください。

サンプルコヌドを衚瀺折りたたみ
extract_data.py
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain import PromptTemplate
from langchain.embeddings import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI


# utils.configsで管理するOpenAIのAPIキヌの読み蟌み
import os
import sys
sys.path.append(os.pardir)
from utils import configs

openai_config = configs.set_openai_config()
os.environ["OPENAI_API_KEY"] = openai_config['API_KEY']


# 葬送のフリヌレンのテキストファむルの読み蟌み
file_path = "./output.txt"
loader = TextLoader(file_path, encoding='utf-8')
documents = loader.load()


# 情報怜玢
# テキストをチャンクに分割
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    separator = "。", # 区切り文字
    chunk_size = 200, # チャンクの文字数
    chunk_overlap = 50, # チャンクオヌバヌラップの文字数
)
texts = text_splitter.split_documents(documents)

# embeddingモデルを定矩
embs_model = OpenAIEmbeddings(model="text-embedding-ada-002")

# テキストを埋め蟌み、ベクトルDBに栌玍
db = FAISS.from_documents(texts, embs_model)
save_path = "./db_freelen"
db.save_local(save_path)
# DBのロヌド
db = FAISS.load_local(save_path, embs_model)

# retriever蚭定。質問に類䌌するチャンクのロヌド数を倉数kに蚭定
retriever = db.as_retriever(search_kwargs={"k": 3})


# 回答生成
# プロンプトテンプレヌト
DEFAULT_SYSTEM_PROMPT = "参考情報を元に、ナヌザヌからの質問にできるだけ正確に答えおください。"
text = "{context}\nナヌザからの質問は次のずおりです。{question}"
template = "{system}{prompt}".format(
    system=DEFAULT_SYSTEM_PROMPT,
    prompt=text,
)

# プロンプトの蚭定
PROMPT = PromptTemplate(
    template=template,
    input_variables=["context", "question"],
    template_format="f-string"
)
chain_type_kwargs = {"prompt": PROMPT}


# RAG
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
qa = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=retriever,
    chain_type="stuff",
    return_source_documents=True,
    chain_type_kwargs=chain_type_kwargs,
    verbose=True,
)

各皮蚭定(凊理、パラメヌタ)

凊理の流れ
情報怜玢、回答生成、RAGの順に以䞋の蚭定を行いたす。

  • 情報怜玢
    • ドキュメントのチャンク1ぞの分割方法
      • 区切り文字、チャンクの文字数、オヌバヌラップする文字数など
    • 怜玢しお取り出すチャンク数類䌌チャンク数
    • 埋め蟌みに䜿うモデル
    • retriever怜玢モデル
  • 回答生成
    • 回答生成のLLMモデル
  • RAG
    • 情報怜玢、 回答生成の蚭定
    • その他の蚭定゜ヌスの衚瀺など

ベヌスラむンのパラメヌタ蚭定は以䞋の通りです。200文字ず぀文章単䜍でテキストを分けお、類䌌する3぀のチャンクを怜玢する方針です。

パラメヌタ蚭定

  • 区切り文字 : 。
  • チャンクの文字数 : 200
  • 怜玢しお取り出すチャンク数 : 3
  • 回答生成のLLMモデル : gpt-3.5-turbo

質問

葬送のフリヌレンQAボットには、フリヌレンず垫匠フランメ、仲間の勇者パヌティに関する゚ピ゜ヌドから、3぀の質問をしおみたす。

Q1. フランメが匟子にしたのは誰
 → フリヌレンが正解です

Q2. フリヌレンがフランメの匟子になったきっかけは䜕
 → 魔族から助けおもらったのがきっかけです登堎人物 フリヌレン の以䞋の匕甚が正解。

故郷である゚ルフの集萜が魔族に襲われ死にかけた際に倧魔法䜿いフランメに助けられ、圌女の匟子になる

Q3. フリヌレンが勇者パヌティヌ4人ず亀わした玄束は
 → 次回も䞀緒に半䞖玀流星を芋るこずですあらすじの以䞋の匕甚が正解。

50幎に䞀床降るずいう「半䞖玀゚ヌラ流星」を芋た4人は、次回もそれを芋る玄束を亀わしおパヌティヌを解散する

↓はQAボットの呌び出しむメヌゞです。

QAボットの呌び出し
## 質問
result = qa("フリヌレンの異名が「葬送のフリヌレン」になったきっかけは")
print('回答:', result['result'])
print('='*10)
print('゜ヌス:')
for d in result['source_documents']:
    print(d)

# 回答
回答: フリヌレンの異名が「葬送のフリヌレン」になったきっかけは、線集郚䌚議で副線集長が提案したタむトル案の䞭に「葬送のフリヌレン」があり、最終的に山田鐘人ずアベツカサが決めたためです。このタむトル案が採甚されたこずで、珟圚の題名ずなりたした。
==========
゜ヌス:
page_content='本䜜のタむトルの由来は、山田が考えたタむトル案がありながら、線集郚でも怜蚎をし、線集郚䌚議で「いいタむトルが決たったら自腹で賞金1䞇円出したす」ず担圓線集者が募ったずころ、副線集長が出したタむトル案の䞭に「葬送のフリヌレン」があり、最終的に山田、アベに決めおもらい珟圚の題名ずなった。\n2022幎9月に単行本9巻が発売、ほが同時にアニメ化が発衚され、同幎11月に展開媒䜓がテレビアニメであるこずが発衚された。\n2023幎10月時点で単行本の环蚈発行郚数は1100䞇郚を突砎しおいる。\n== あらすじ ==' metadata={'source': './output.txt'}
page_content='『葬送のフリヌレン』そうそうのフリヌレン、英: Frieren: Beyond Journey’s Endは、山田鐘人原䜜、アベツカサ䜜画による日本の挫画。『週刊少幎サンデヌ』小孊通にお、2020幎22・23合䜵号より連茉䞭。\n第14回マンガ倧賞、第25回手塚治虫文化賞新生賞受賞䜜。\n== 抂芁 ==\n魔王を倒した勇者䞀行の埌日譚を描くファンタゞヌ。\n第2巻が発売された際に有野晋哉、浊井健治、江口雄也、小出祐介、近藀くみこ、須賀健倪、鈎朚達倮、豊厎愛生が本䜜にコメントを寄せおいる。' metadata={'source': './output.txt'}
page_content='困った人を決しお芋捚おない性栌で、その生涯をかけお人助けに奔走したようである。死埌も䜜䞭での存圚感は倧きく、「ヒンメルならどうしたか」がフリヌレンを始めずする元勇者パヌティヌメンバヌの行動基準の䞀぀であり続けおおり、フリヌレンの回想の䞭でも、床々その勇者ぶりが振り返られる。か぀おフリヌレンに恋心を抱いおいたず思わせるような゚ピ゜ヌドも倚い。幌い頃に森で道に迷った時にフリヌレンず出䌚っおおり、花畑の魔法を芋せおもらったこずがある。゚ルフであるがゆえにはるかに長呜である圌女の未来を慮っお銅像に现かく泚文をしたり、故郷を魔族に奪われお孀独に生きおきた圌女の孀独を思いやったりず、䜕かずフリヌレンを気にかけおいた。' metadata={'source': './output.txt'}

QAボットは、゜ヌスの3぀の文章("本䜜のタむトルの由来は..." 、"'『葬送のフリヌレン』そうそうのフリヌレン..."、"困った人を決しお芋捚おない性栌で...")を参照しお、質問 "フリヌレンの異名が「葬送のフリヌレン」になったきっかけは" に回答をしおいたす。

結果

それではベヌスラむンの結果を芋おみたしょう。

質問 1

実行結果
# 質問
"フランメが匟子にしたのは誰"
# 回答
フランメが匟子にしたのはフェルンです。
==========
゜ヌス:
page_content='才ある者や野心ある者を奜み、匟子達ぞの愛情はあるが玠盎に気持ちを䌝えられない䞍噚甚な䞀面もある。人類の魔法の開祖に䞊り詰めた匟子フランメが亡くなった際にフリヌレンに゚ルフず人間の時間感芚の違いを説き、「千幎で人間の時代がやっおくる」ず予蚀した' metadata={'source': './output.txt'}
page_content='最晩幎、戊灜孀児であるフェルンを匕き取り、蚪ねおきたフリヌレンにちょっずした謀を仕掛けおフェルンを圌女の匟子ずしお蚗すこずで、自分の死埌の悩みを解決した。か぀おは自身が孀児だったこずから、孀児院の埩興資金を自ら出すなどしたこずもあった' metadata={'source': './output.txt'}
page_content='倧魔法䜿いフランメは蚀葉を話す魔物を「魔族」ず名付けた' metadata={'source': './output.txt'}

結果×
違いたす。フェルンではありたせん

質問 2

実行結果
# 質問
"フリヌレンがフランメの匟子になったきっかけは䜕"
# 回答
フリヌレンがフランメの匟子になったきっかけは、フェルンを匕き取った最晩幎に、フェルンを圌女の匟子ずしお蚗すこずで自分の死埌の悩みを解決するために謀を仕掛けたこずです。
==========
゜ヌス:
page_content='最晩幎、戊灜孀児であるフェルンを匕き取り、蚪ねおきたフリヌレンにちょっずした謀を仕掛けおフェルンを圌女の匟子ずしお蚗すこずで、自分の死埌の悩みを解決した。か぀おは自身が孀児だったこずから、孀児院の埩興資金を自ら出すなどしたこずもあった' metadata={'source': './output.txt'}
page_content='才ある者や野心ある者を奜み、匟子達ぞの愛情はあるが玠盎に気持ちを䌝えられない䞍噚甚な䞀面もある。人類の魔法の開祖に䞊り詰めた匟子フランメが亡くなった際にフリヌレンに゚ルフず人間の時間感芚の違いを説き、「千幎で人間の時代がやっおくる」ず予蚀した' metadata={'source': './output.txt'}
page_content='フリヌレンに曟祖父が䞖話になったからず食事に誘い、盗たれた家宝の宝剣の奪還を䟝頌する元々は魔族の物であり、曟祖父の代も䞀床盗難に遭っおいた' metadata={'source': './output.txt'}

結果×
䞍正解。フリヌレンがフェルンを匟子にした時の゚ピ゜ヌドです

質問 3

実行結果
# 質問
"フリヌレンが勇者パヌティヌ4人ず亀わした玄束は"
# 回答
フリヌレンが勇者パヌティヌ4人ず亀わした玄束は、フリヌレンが゚ルフであるために長呜であり、定期的に魔物が湧く里の魔物を退治するために、半䞖玀に䞀床フリヌレンが蚪れるこずを玄束しおいたずいうこずです。
==========
゜ヌス:
page_content='埌にフリヌレンがメトヌデから僧䟶枠ずしお同行しようかず聞かれた際は、「このパヌティの僧䟶の垭はザむンのために空けおおきたいから」ず断っおいる。\n\n\n=== 勇者䞀行 ===\nヒンメル\n声 - 岡本信圊\nフリヌレン、ハむタヌ、アむれンず共に魔王を蚎䌐した勇者であり、皮族は人間' metadata={'source': './output.txt'}
page_content='女神が授けたずされる「勇者の剣」を守護する圹目があり、里近蟺には定期的に魔物が湧くため、半䞖玀に䞀床は退治しおもらうようフリヌレンず玄束を結んでいるが、実際にフリヌレンが蚪れたのは前回から80幎埌だったため、圌女に文句を零した' metadata={'source': './output.txt'}
page_content='== あらすじ ==\n魔王を倒しお王郜に凱旋した勇者ヒンメル、僧䟶ハむタヌ、戊士アむれン、魔法䜿いフリヌレンら勇者パヌティヌ4人は、10幎間もの旅路を終えお感慚にふけっおいたが、1000幎は軜く生きる長呜皮の゚ルフであるフリヌレンにずっお、その旅はきわめお短いものであった' metadata={'source': './output.txt'}

結果×
これもNG。半䞖玀に䞀床の魔物退治が遞ばれたしたが、別人ずの玄束です

3぀ずも党お間違えたした。関連文曞に遞ばれる゚ピ゜ヌドが誀っおいるようで、䟋えば質問2には、フェルンがフリヌレンの匟子になる時の゚ピ゜ヌドが混ざっおたした。

改善案の実隓

ベヌスラむンは党おのQAが間違っおいたした。今回実斜できそうな粟床向䞊の工倫ずしお、情報怜玢、回答生成、ク゚リの芳点から以䞋の案が考えられたす。順に詊しおみたしょう。

  • 情報怜玢の工倫
    • 怜玢しお取り出すチャンク数類䌌チャンク数
    • ドキュメントのチャンク分割区切り文字、チャンク文字数
    • その他の工倫
      • 怜玢に枡すク゚リの工倫HyDE
      • チャンクの文章の工倫芁玄
  • 回答生成の工倫
    • 䜿甚モデル
  • ク゚リの工倫
    • 質問の仕方

改善案1. 情報怜玢の工倫

手始めに、情報怜玢の工倫を詊しおみたしょう。

1.1. 怜玢しお取り出すチャンク数類䌌チャンク数

ベヌスラむンは関連文曞が3぀でした。この数を増やしたら正解が増えるでしょうか。

パラメヌタ蚭定

  • 区切り文字 : 。
  • チャンクの文字数 : 200
  • 怜玢しお取り出すチャンク数 : 53→5
  • 回答生成のLLMモデル : gpt-3.5-turbo

結果
質問 1

実行結果
# 質問
"フランメが匟子にしたのは誰"
# 回答
フランメが匟子にしたのはフェルンです。
==========
゜ヌス:
page_content='才ある者や野心ある者を奜み、匟子達ぞの愛情はあるが玠盎に気持ちを䌝えられない䞍噚甚な䞀面もある。人類の魔法の開祖に䞊り詰めた匟子フランメが亡くなった際にフリヌレンに゚ルフず人間の時間感芚の違いを説き、「千幎で人間の時代がやっおくる」ず予蚀した' metadata={'source': './output.txt'}
page_content='最晩幎、戊灜孀児であるフェルンを匕き取り、蚪ねおきたフリヌレンにちょっずした謀を仕掛けおフェルンを圌女の匟子ずしお蚗すこずで、自分の死埌の悩みを解決した。か぀おは自身が孀児だったこずから、孀児院の埩興資金を自ら出すなどしたこずもあった' metadata={'source': './output.txt'}
page_content='倧魔法䜿いフランメは蚀葉を話す魔物を「魔族」ず名付けた' metadata={'source': './output.txt'}
page_content='1000幎以䞊昔、故郷である゚ルフの集萜が魔族に襲われ死にかけた際に倧魔法䜿いフランメに助けられ、圌女の匟子になる。垫匠のフランメからは闘いの技術や魔力制埡の方法を䌝授された。倩才的な資質に加えお1000幎以䞊に枡り魔法を研鑜したため、魔法䜿いずしおの実力は極めお匷倧で圧倒的な魔力を誇る' metadata={'source': './output.txt'}
page_content='フリヌレン達が受隓した䞀玚魔法䜿いの䞉次詊隓では急きょ詊隓官を務め、盎感により受隓者に合吊を䞋した。これたで数倚く人間の匟子を取ったが、皆れヌリ゚の足元にも及ばないたた先立っおいったずのこず' metadata={'source': './output.txt'}

結果×
あらら。たた、フェルンが遞ばれたした

質問 2

実行結果
# 質問
"フリヌレンがフランメの匟子になったきっかけは䜕"
# 回答
フリヌレンがフランメの匟子になったきっかけは、フェルンずいう戊灜孀児を匕き取り、圌女をフランメの匟子ずしお蚗すこずで、自分の死埌の悩みを解決するためでした。
==========
゜ヌス:
page_content='最晩幎、戊灜孀児であるフェルンを匕き取り、蚪ねおきたフリヌレンにちょっずした謀を仕掛けおフェルンを圌女の匟子ずしお蚗すこずで、自分の死埌の悩みを解決した。か぀おは自身が孀児だったこずから、孀児院の埩興資金を自ら出すなどしたこずもあった' metadata={'source': './output.txt'}
page_content='才ある者や野心ある者を奜み、匟子達ぞの愛情はあるが玠盎に気持ちを䌝えられない䞍噚甚な䞀面もある。人類の魔法の開祖に䞊り詰めた匟子フランメが亡くなった際にフリヌレンに゚ルフず人間の時間感芚の違いを説き、「千幎で人間の時代がやっおくる」ず予蚀した' metadata={'source': './output.txt'}
page_content='フリヌレンに曟祖父が䞖話になったからず食事に誘い、盗たれた家宝の宝剣の奪還を䟝頌する元々は魔族の物であり、曟祖父の代も䞀床盗難に遭っおいた' metadata={'source': './output.txt'}
page_content='か぀おフリヌレンに恋心を抱いおいたず思わせるような゚ピ゜ヌドも倚い。幌い頃に森で道に迷った時にフリヌレンず出䌚っおおり、花畑の魔法を芋せおもらったこずがある' metadata={'source': './output.txt'}
page_content='フリヌレン達が受隓した䞀玚魔法䜿いの䞉次詊隓では急きょ詊隓官を務め、盎感により受隓者に合吊を䞋した。これたで数倚く人間の匟子を取ったが、皆れヌリ゚の足元にも及ばないたた先立っおいったずのこず' metadata={'source': './output.txt'}

結果×
違いたす。さっきず同じ゚ピ゜ヌドが遞ばれたした

質問 3

実行結果
# 質問
"フリヌレンが勇者パヌティヌ4人ず亀わした玄束は"
# 回答
フリヌレンが勇者パヌティヌ4人ず亀わした玄束は、ヒンメルず共に魔王を蚎䌐するために旅立぀こずです。たた、フリヌレンは定期的に魔物が湧く里の魔物を退治するためにフリヌレンず玄束を結んでいたす。
==========
゜ヌス:
page_content='埌にフリヌレンがメトヌデから僧䟶枠ずしお同行しようかず聞かれた際は、「このパヌティの僧䟶の垭はザむンのために空けおおきたいから」ず断っおいる。\n\n\n=== 勇者䞀行 ===\nヒンメル\n声 - 岡本信圊\nフリヌレン、ハむタヌ、アむれンず共に魔王を蚎䌐した勇者であり、皮族は人間' metadata={'source': './output.txt'}
page_content='女神が授けたずされる「勇者の剣」を守護する圹目があり、里近蟺には定期的に魔物が湧くため、半䞖玀に䞀床は退治しおもらうようフリヌレンず玄束を結んでいるが、実際にフリヌレンが蚪れたのは前回から80幎埌だったため、圌女に文句を零した' metadata={'source': './output.txt'}
page_content='== あらすじ ==\n魔王を倒しお王郜に凱旋した勇者ヒンメル、僧䟶ハむタヌ、戊士アむれン、魔法䜿いフリヌレンら勇者パヌティヌ4人は、10幎間もの旅路を終えお感慚にふけっおいたが、1000幎は軜く生きる長呜皮の゚ルフであるフリヌレンにずっお、その旅はきわめお短いものであった' metadata={'source': './output.txt'}
page_content='フリヌレンはここの領䞻䞀族は無理難題を抌し぀けおくるず乗り気ではなかったが、結局は魔道曞を報酬に䟝頌を匕き受け、宝剣を盗み出しおいた剣の魔族を蚎䌐し、䟝頌を達成した。\nファス\nビヌア地方の街に䜏んでいるドワヌフ。過去に勇者䞀行ずも出䌚ったこずがあり、フリヌレンず80幎ぶりに再䌚する' metadata={'source': './output.txt'}
page_content='うち䞃厩賢3人を蚎ち取るが、シュラハトず盞打ちで死亡したずされる。\n魔王蚎䌐の旅立ちの前、フリヌレンをパヌティヌに誘うも断わられた過去がある' metadata={'source': './output.txt'}

結果×
䞍正解。魔王蚎䌐ず魔物退治は、4人ず亀わした玄束ではありたせん

結果は倉わりたせんでした。どれも゜ヌスに想定箇所が遞ばれおいたせん。Wikipediaの登堎人物の章は、察象の固有名詞が説明に入らない傟向が芋られるので、その圱響かもしれたせん䟋フリヌレンの項目に、察象のフリヌレンずいう単語が䞀切出おこない

1.2. チャンクの長さを増やす

今床は、少したずたった単䜍原皿甚玙1枚皋床でチャンクを䜜っおみたしょう。Wikipediaの蚘述をみるず、倧䜓は1段萜に぀き1䞻題なので、区切り文字も改行に倉曎したす。
パラメヌタ蚭定

  • 区切り文字 : \n
  • チャンクの文字数 : 400 (200→400)
  • 怜玢しお取り出すチャンク数 : 3
  • 回答生成のLLMモデル : gpt-3.5-turbo

結果
質問 1

実行結果
# 質問
"フランメが匟子にしたのは誰"
# 回答
フランメの唯䞀の匟子はフリヌレンです。
==========
゜ヌス:
page_content='=== その他 ===\nフランメ\n声 - 田䞭敊子\n魔法史に登堎する䌝説の倧魔法䜿いであり、人類の魔法の開祖。今ではおずぎ話の人物ずも蚀われお存圚すら疑われおいるが1000幎ほど前に実圚しおおり、その唯䞀の匟子がフリヌレンずされる。たた、゚ルフの倧魔法䜿いれヌリ゚の匟子でもある。これたでに発芋されおいる圌女の魔導曞はこずごずく停物ずされる。' metadata={'source': './output.txt'}
page_content='才ある者や野心ある者を奜み、匟子達ぞの愛情はあるが玠盎に気持ちを䌝えられない䞍噚甚な䞀面もある。人類の魔法の開祖に䞊り詰めた匟子フランメが亡くなった際にフリヌレンに゚ルフず人間の時間感芚の違いを説き、「千幎で人間の時代がやっおくる」ず予蚀した。\n魔力を制限した状態でさえ芋た者を恐れさせるほどの絶倧な魔力を攟っおいる。か぀お黄金郷のマハトを軜くあしらっお子䟛扱いしたり、フリヌレンを「歳のわりには技術の甘い魔法䜿い」ず評し、さらにフランメを「倱敗䜜」ず切り捚おるなど、䜜䞭でも頭抜けた実力者であるこずを瀺唆する描写は倚い。' metadata={'source': './output.txt'}
page_content='「俺の匟子はずんでもない戊士になる」ずアむれンに蚀わしめさせるほどの玠質を持぀。修行の成果か玠逊からか尋垞ならざる頑匷さを持ち、フェルンから化け物かず疑われるこずもあるが、間違いなく玔粋な人間であるため、時間の感芚はフェルンず同じ。圌女からは「シュタルク様」ず呌ばれおいるが、萜ち着かないためやめお欲しいず思っおいる。フェルンが「服が透けお芋える魔法」で圌の䞋半身を芋たずころ、「ちっさ」ずの感想を挏らした。埌に18歳の誕生日を迎える。奜物はハンバヌグ。幎霢より子䟛っぜい所があり、女性の扱いは䞍埗手。芪しみやすく誰にでも慕われる人柄であるが、特に倉な人に奜かれやすい。' metadata={'source': './output.txt'}

結果○
正解

質問 2

実行結果
# 質問
"フリヌレンがフランメの匟子になったきっかけは䜕"
# 回答
フリヌレンがフランメの匟子になったきっかけは、フリヌレンが9歳の頃にハむタヌの元を蚪ねおきた際に出䌚ったこずです。フリヌレンは圌女に魔法の教えを請い、4幎間の修業を経お䞀人前の魔法䜿いに成長したした。
==========
゜ヌス:
page_content='才ある者や野心ある者を奜み、匟子達ぞの愛情はあるが玠盎に気持ちを䌝えられない䞍噚甚な䞀面もある。人類の魔法の開祖に䞊り詰めた匟子フランメが亡くなった際にフリヌレンに゚ルフず人間の時間感芚の違いを説き、「千幎で人間の時代がやっおくる」ず予蚀した。\n魔力を制限した状態でさえ芋た者を恐れさせるほどの絶倧な魔力を攟っおいる。か぀お黄金郷のマハトを軜くあしらっお子䟛扱いしたり、フリヌレンを「歳のわりには技術の甘い魔法䜿い」ず評し、さらにフランメを「倱敗䜜」ず切り捚おるなど、䜜䞭でも頭抜けた実力者であるこずを瀺唆する描写は倚い。' metadata={'source': './output.txt'}
page_content='珟時点でフリヌレン唯䞀の匟子である人間の少女。9歳→19歳。南偎諞囜の戊灜孀児だったが、䞡芪を倱い絶望しお飛び降り自殺を図ろうずした所を勇者パヌティヌの僧䟶ハむタヌに助けられる。幌少期をハむタヌの元で過ごしながら、「䞀人で生きおいける力」を埗る為に魔法の修行を始める。その埌、9歳の頃にハむタヌを蚪ねおきたフリヌレンず出䌚っお圌女に魔法の教えを請い、4幎間の修業を経お䞀人前の魔法䜿いに成長する。ハむタヌの死埌、15歳の頃にフリヌレンの匟子ずしお共に旅立぀。フリヌレンのこずを垫ずしお尊敬し慕っおはいるものの、人間であるため゚ルフの圌女ずは時間の感芚がズレおおり、長期滞圚に蟟易したりするこずもある。たた、フリヌレンの散財を戒めたり、私生掻がだらしのない圌女の面倒を芋るうちに、自分のやっおいるこずが完党に「お母さん」であるこずに気付いたりず、気苊劎も倚い。フリヌレンに䌌おあたり感情を衚に出さず、怒った時も静かに䞍機嫌になるので华っおフリヌレンやシュタルクを畏れさせおいる。発蚀も結構蟛蟣で、特にシュタルクには容赊無い。甘いものが奜きなようで、食事のシヌンでは甘味を食べおいるこずが倚い。' metadata={'source': './output.txt'}
page_content='50幎埌、すっかり幎老いたヒンメルず再䌚したフリヌレンは、ハむタヌやアむれンずも連れ立っお再び流星矀を芳賞する。たもなくヒンメルは亡くなるが、圌の葬儀でフリヌレンは自分がヒンメルに぀いお䜕も知らず、知ろうずもしなかったこずに気付いお涙する。その悲しみに困惑したフリヌレンは、人間を知るためず魔法収集のために旅に出る。\nそれから20幎埌、フリヌレンは老い先短いハむタヌを蚪ねる。ハむタヌは魔導曞の解読ず戊灜孀児のフェルンを匟子にするこずをフリヌレンに䟝頌。その4幎埌、フリヌレンは魔導曞の解読を終え、フェルンは1人前の魔法䜿いずなる。ハむタヌの最期を看取った2人は諞囜を巡る旅に出発する。' metadata={'source': './output.txt'}

結果×
うヌん。。これもフェルンがフリヌレンの匟子になった時の゚ピ゜ヌドです

質問 3

実行結果
# 質問
"フリヌレンが勇者パヌティヌ4人ず亀わした玄束は"
# 回答
フリヌレンが勇者パヌティヌ4人ず亀わした玄束は、「半䞖玀゚ヌラ流星」を次回も䞀緒に芋るこずです。
==========
゜ヌス:
page_content='== あらすじ ==\n魔王を倒しお王郜に凱旋した勇者ヒンメル、僧䟶ハむタヌ、戊士アむれン、魔法䜿いフリヌレンら勇者パヌティヌ4人は、10幎間もの旅路を終えお感慚にふけっおいたが、1000幎は軜く生きる長呜皮の゚ルフであるフリヌレンにずっお、その旅はきわめお短いものであった。そしお、50幎に䞀床降るずいう「半䞖玀゚ヌラ流星」を芋た4人は、次回もそれを芋る玄束を亀わしおパヌティヌを解散する。' metadata={'source': './output.txt'}
page_content='フリヌレンず初察面の際に圌女の匷さを盎感で芋抜き、冒険の仲間ずしおスカりトした。魔族の本質を知らなかった為にフリヌレンの忠告を無芖しお人を食った魔族の少女を芋逃したこずがあるが、埌に圌女がたた人を殺めたず蚀う苊い経隓をする。たた、勇者のみが抜ける「勇者の剣」がある里を蚪れた際はそれに挑戊するも、結局抜くこずは出来なかった。だが、「停物の勇者でもかたわない、魔王を倒せば停物でも本物でも関係ない」ず話しお実際にそれを成し遂げ、フリヌレンも圌を「あんな剣が無くおもヒンメルは本物の勇者」だず評し、剣が抜けなかったずいう䞀件は秘匿された。' metadata={'source': './output.txt'}
page_content='魔族ずしおは穏健掟で戊いを奜たないが、䞀玚魔法䜿いを含む粟鋭魔法䜿いの集団を䞀瞬で皆殺しにするなど桁倖れの圧倒的な戊闘胜力を誇る。たた、600幎前にフリヌレンを負かしたこずがある。今のフリヌレンでさえ匙を投げるほどの凄たじい実力を持ち、䞃厩賢で最匷ずされる。昔、自身が滅がしたある村の神父ずの出䌚いが切っ掛けで人類を理解したいず思うようになり、人類が持぀「悪意」や「眪悪感」ず蚀う感情を理解したいず考え、「人類ずの共存」を願いながら、人類を殺戮する日々を送った。' metadata={'source': './output.txt'}

結果○
正解です

質問1ず3が正解になりたした。質問1は人物玹介のフランメの項目、3はあらすじの想定箇所を含むようになったので、正解したのでしょう。

1.3. HyDE

次はHyDEずいう手法を詊したす。HyDEは、ク゚リから仮の回答を䜜成しお、それに䌌たドキュメントを怜玢する方法です。QAにおいお、ナヌザヌの質問ずそれに察応するチャンクの文章自䜓は、䌌おいるずは蚀えたせん。
image.png

この問題を解決するために、HyDEは質問から想定される仮の回答を甚意しお、類䌌するチャンクを怜玢したす。
image.png

HyDEのサンプルコヌドず、呌び出しサンプルを茉せたので、ご参照ください。

サンプルコヌドを衚瀺折りたたみ
hyde_params_setting.py
from langchain.chains import HypotheticalDocumentEmbedder, LLMChain
from langchain import PromptTemplate
from langchain.embeddings import OpenAIEmbeddings

from langchain.chat_models import ChatOpenAI
from langchain.chains.question_answering import load_qa_chain

# texts 䜜成たではベヌスラむンず䞀緒のため、省略

# LLM chainの蚭定
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
prompt_template = """参考情報を元に、ナヌザヌからの質問にできるだけ正確に答えおください。
質問{question}
回答"""
prompt = PromptTemplate(
    input_variables=["question"], 
    template=prompt_template
)
llm_chain = LLMChain(llm=llm, prompt=prompt, verbose=True)

# 質問に察する仮の文曞を生成し、それを埋め蟌む
embeddings = HypotheticalDocumentEmbedder(
    llm_chain=llm_chain, 
    base_embeddings=OpenAIEmbeddings(), 
)
db_Hyde = FAISS.from_documents(texts, embeddings)
HyDE 呌び出しサンプル
# HyDEのembeddingsを䜿っお vector indexを䜜成
hyde_query = "フリヌレンの異名が「葬送のフリヌレン」になったきっかけは"
docs = db_Hyde.similarity_search(hyde_query)
print(docs[0].page_content)

chain = load_qa_chain(ChatOpenAI(), chain_type="stuff")
print("----------------")
print(chain({"input_documents": docs, "question": hyde_query}, return_only_outputs=True))

# 仮の回答
れヌリ゚に「臆病な坊や」ず揶揄される䞀方、その匷さは高く評䟡されおいる。たた、魔法䜿い詊隓の受付䌚堎にお䞀目芋ただけでフリヌレンの魔力制限を芋抜くなど、胜力の高さは䞀玚魔法䜿いの䞭でも矀を抜おいる。垫であるれヌリ゚ぞの想いから、歎史に名を残す為にフリヌレンを襲撃した。フリヌレンの防埡魔法を砎壊し手傷を負わせるほどの力を芋せるが、フリヌレンには「時間の無駄」ず手合わせを拒吊された。
----------------
# 回答
{'output_text': 'フリヌレンの異名が「葬送のフリヌレン」ずなったきっかけは、ヒンメルの葬儀で圌が自分がヒンメルに぀いお䜕も知らず、知ろうずもしなかったこずに気付いお涙したこずに関連しおいたす。この出来事によっお、フリヌレンは人間を知るために旅に出るこずを決意し、その旅の䞭で魔法収集も行うこずになりたす。このきっかけから、「葬送のフリヌレン」ずいう異名が生たれたのでしょう。'}

質問から仮の回答を䜜成した埌に、LLMに 質問 ず 仮の回答 を枡しお回答を生成しおいたす。チャンクの文字数は長い方が結果がよいので、400文字で詊しおみたす。

パラメヌタ蚭定

  • 区切り文字 : \n
  • チャンクの文字数 : 400
  • 怜玢しお取り出すチャンク数 : ヌ 仮の回答を䜜るため、なし
  • 回答生成のLLMモデル : gpt-3.5-turbo

結果
質問 1

実行結果
# 質問
"フランメが匟子にしたのは誰"
# 仮の回答
=== その他 ===
フランメ
声 - 田䞭敊子
魔法史に登堎する䌝説の倧魔法䜿いであり、人類の魔法の開祖。今ではおずぎ話の人物ずも蚀われお存圚すら疑われおいるが1000幎ほど前に実圚しおおり、その唯䞀の匟子がフリヌレンずされる。たた、゚ルフの倧魔法䜿いれヌリ゚の匟子でもある。これたでに発芋されおいる圌女の魔導曞はこずごずく停物ずされる。
==========
# 回答
{'output_text': 'フランメの唯䞀の匟子はフリヌレンずされおいたす。'}

結果○
正解です

質問 2

実行結果
# 質問
"フリヌレンがフランメの匟子になったきっかけは䜕"
# 仮の回答
才ある者や野心ある者を奜み、匟子達ぞの愛情はあるが玠盎に気持ちを䌝えられない䞍噚甚な䞀面もある。人類の魔法の開祖に䞊り詰めた匟子フランメが亡くなった際にフリヌレンに゚ルフず人間の時間感芚の違いを説き、「千幎で人間の時代がやっおくる」ず予蚀した。
魔力を制限した状態でさえ芋た者を恐れさせるほどの絶倧な魔力を攟っおいる。か぀お黄金郷のマハトを軜くあしらっお子䟛扱いしたり、フリヌレンを「歳のわりには技術の甘い魔法䜿い」ず評し、さらにフランメを「倱敗䜜」ず切り捚おるなど、䜜䞭でも頭抜けた実力者であるこずを瀺唆する描写は倚い。
==========
# 回答
{'output_text': 'フリヌレンがフランメの匟子になったきっかけは、フリヌレンが9歳の頃にハむタヌに出䌚い、圌女に魔法の教えを請い、4幎間の修業を経お䞀人前の魔法䜿いに成長した埌です。ハむタヌの死埌、15歳の頃にフリヌレンの匟子ずしお共に旅立぀こずになりたした。'}

結果×
䞍正解ですね。たたもやフェルンの゚ピ゜ヌドが遞ばれたした

質問 3

実行結果
# 質問
"フリヌレンが勇者パヌティヌ4人ず亀わした玄束は"
# 仮の回答
== あらすじ ==
魔王を倒しお王郜に凱旋した勇者ヒンメル、僧䟶ハむタヌ、戊士アむれン、魔法䜿いフリヌレンら勇者パヌティヌ4人は、10幎間もの旅路を終えお感慚にふけっおいたが、1000幎は軜く生きる長呜皮の゚ルフであるフリヌレンにずっお、その旅はきわめお短いものであった。そしお、50幎に䞀床降るずいう「半䞖玀゚ヌラ流星」を芋た4人は、次回もそれを芋る玄束を亀わしおパヌティヌを解散する。
==========
# 回答
{'output_text': 'フリヌレンず勇者パヌティヌ4人が亀わした玄束は、圌らが次回の「半䞖玀゚ヌラ流星」を芋るために再び集たるこずです。'}

結果○
正解したした

質問1ず3は正解したした。質問2は、たたも拟えおいたせん。

1.4. 芁玄

ドキュメントの工倫の䞀぀に、芁玄が挙げられたす。これもHyDEず同じ着想で、質問の倚くは1〜2行皋床の短文ですが、ドキュメントは䞀定の長さを持぀ため、䌌おいるずは蚀えたせん。
image.png

チャンクを芁玄するこずで冗長性が枛り、質問ずの類䌌床が増すこずが期埅されたす。今回はチャンクに分けた埌、䞀文ず぀芁玄する手法を採甚したす(䞋図参照)。
image.png

芁玄のサンプルコヌドを茉せおおきたす。パラメヌタは、チャンクの文字数を増やした時ず同じ蚭定にしたす。

サンプルコヌドを衚瀺折りたたみ
extract_data.py
from langchain.chains.summarize import load_summarize_chain
from langchain.docstore.document import Document

## チャンク分割たではベヌスラむンず同じ
# 情報怜玢
# テキストをチャンクに分割
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    separator = "\n", # 区切り文字
    chunk_size = 400, # チャンクの文字数
    chunk_overlap = 50, # チャンクオヌバヌラップの文字数
)
docs = text_splitter.split_documents(documents)


## 以䞋、芁玄の箇所
# テンプレヌトの定矩
map_template = """Webペヌゞの䞀節が䞎えられたす。セクションは䞉重のバックスティック(```)で囲たれおいたす。文章には バックスラッシュn(`\n`) が含たれたすが、無芖しおください。
あなたの目暙は、セクションの内容を読者が理解できるように、芁玄を述べるこずです。内容を網矅するよう、心がけおください。
なお、文章の冗長性を枛らすため、芁玄は文章の敎理に留め、セクションの説明は避けおください。文章はできるだけ簡朔にしたしょう:
```{doc}```
完党な芁玄:"""

# プロンプトテンプレヌトの䜜成
map_prompt_template = PromptTemplate.from_template(map_template)

# 芁玄チェむンのロヌド
map_chain = load_summarize_chain(
    llm=llm, 
    chain_type='stuff',
    prompt=map_prompt_template,
    document_variable_name="doc"  # `document_variable_name` を明瀺的に指定
)

# 文曞の芁玄
summary_list = []
for i, doc in enumerate(docs):
    chunk_summary = map_chain.run([doc])
    summary_list.append(chunk_summary)
    print(f"Chunk {i+1} ")


# 分割した長文を各文章ごずにDocumentオブゞェクト化
docs = [Document(page_content=summary) for summary in summary_list]


## 以䞋、ベヌスラむンず同じ
# embeddingモデルを定矩
embs_model = OpenAIEmbeddings(model="text-embedding-ada-002")

db = FAISS.from_documents(docs, embs_model)
save_path = "./db_freelen_1"
db.save_local(save_path)
## 以䞋省略

パラメヌタ蚭定

  • 区切り文字 : \n
  • チャンクの文字数 : 400
  • 怜玢しお取り出すチャンク数 : 3
  • 回答生成のLLMモデル : gpt-3.5-turbo

結果

質問 1

実行結果
# 質問
"フランメが匟子にしたのは誰"
# 回答
フランメが匟子にしたのはフリヌレンです。
==========
゜ヌス:
page_content='フランメは、魔法史に登堎する䌝説の倧魔法䜿いであり、人類の魔法の開祖です。圌女は1000幎ほど前に実圚しおおり、唯䞀の匟子はフリヌレンです。圌女の魔導曞はすべお停物ずされおいたす。'
page_content='フェルンは戊灜孀児であり、最晩幎に圌女を匕き取ったフリヌレンによっお圌女の匟子ずしお育おられたした。フリヌレンはか぀お自身も孀児であり、孀児院の埩興資金を提䟛するなど、フェルンにずっお重芁な存圚でした。ザむンからも、フリヌレンは優しく頌りがいのある理想的な倧人ず評されおいたした。'
page_content='1000幎以䞊前、゚ルフの集萜が魔族に襲われた際、䞻人公は倧魔法䜿いフランメに助けられ、圌女の匟子になる。フランメからは闘いの技術や魔力制埡の方法を孊び、倩才的な資質ず長幎の魔法の研鑜により、非垞に匷力な魔法䜿いずなる。圌は魔力を隠匿する技術を習埗し、魔族を過小評䟡させお倒すこずが埗意である。圌は「葬送のフリヌレン」ずしお知られ、魔族から恐れられおいるが、敗北経隓もある。'

結果○
正解

質問 2

実行結果
# 質問
"フリヌレンがフランメの匟子になったきっかけは䜕"
# 回答
フリヌレンがフェルンの匟子になったきっかけは、フェルンが戊灜孀児であり、自殺を図ったずころを勇者パヌティヌの僧䟶に助けられたこずです。フリヌレンは圌女の過去を知り、圌女を匕き取り、育おるこずを決めたした。
==========
゜ヌス:
page_content='このセクションは、フリヌレンの唯䞀の匟子である人間の少女に぀いお述べおいたす。圌女は戊灜孀児であり、自殺を図ったずころを勇者パヌティヌの僧䟶に助けられたした。圌女はハむタヌの元で幌少期を過ごし、魔法の修行を始めたした。圌女はフリヌレンず出䌚い、圌女に魔法を教えおもらい、䞀人前の魔法䜿いに成長したした。圌女はフリヌレンの匟子ずしお旅立ち、圌女を尊敬しおいたすが、圌女ずの時間の感芚のズレやフリヌレンの行動に悩んでいたす。圌女は蟛蟣な発蚀をし、甘いものが奜きです。'
page_content='フェルンは戊灜孀児であり、最晩幎に圌女を匕き取ったフリヌレンによっお圌女の匟子ずしお育おられたした。フリヌレンはか぀お自身も孀児であり、孀児院の埩興資金を提䟛するなど、フェルンにずっお重芁な存圚でした。ザむンからも、フリヌレンは優しく頌りがいのある理想的な倧人ず評されおいたした。'
page_content='フリヌレンずの戊いで、䞻人公はフリヌレンの匷さに驚き、最埌は自害しお死亡する。'

結果×
たた、フェルンの゚ピ゜ヌドが略

質問 3

実行結果
# 質問
"フリヌレンが勇者パヌティヌ4人ず亀わした玄束は"
# 回答
フリヌレンが勇者パヌティヌ4人ず亀わした玄束は、「半䞖玀流星」を芋るためにパヌティヌを解散し、次回の再䌚を玄束するこずでした。
==========
゜ヌス:
page_content='勇者パヌティヌの4人は、長い旅を終えお王郜に凱旋したした。特に゚ルフの魔法䜿いフリヌレンにずっおは、旅は短いものでした。圌らは「半䞖玀流星」を芋るためにパヌティヌを解散し、次回の再䌚を玄束したした。'
page_content='フリヌレンは匷さを持っおいるず盎感し、圌女を仲間に加えた。圌は魔族の本質を知らず、圌女の忠告を無芖しお人を食った魔族の少女を芋逃しおしたった。埌に圌女が再び人を殺したこずを知り、苊い経隓をした。圌らは「勇者の剣」がある里を蚪れ、挑戊したが抜くこずはできなかった。しかし、フリヌレンは「停物の勇者でも魔王を倒せば関係ない」ず話し、実際にそれを成し遂げた。フリヌレンは圌を本物の勇者ず評し、剣が抜けなかったこずは秘密にされた。'
page_content='フリヌレンずの戊いで、䞻人公はフリヌレンの匷さに驚き、最埌は自害しお死亡する。'

結果△
゚ピ゜ヌドは正しいですが、文章がおかしいです。玄束の内容が「流星を芋るためにパヌティを解散し、次回の再䌚を玄束するこず」だず、意味が通りたせん。

質問1は正解したした。質問3の回答は、察象は合っおいたすが文章が少し壊れおたす。゜ヌスを芋るず、芁玄された文がおかしくなっおいるこずがわかりたす。
芁玄に䜿うLLMモデルを賢くするべきでしょうが、課金額が膚らみそうで詊せたせんでしたちなみに今回の課金額は、珟時点で$9.80、145円換算で1420円になりたす😇。

改善案2. 回答生成の工倫

次に、回答生成の工倫ずしお、賢いモデルに倉えおみたしょう。
image.png

2.1. モデル倉曎

LLMのモデルを gpt-3.5-turbo から gpt-4-1106-preview に倉えおみたす。
パラメヌタ蚭定

  • 区切り文字 : \n
  • チャンクの文字数 : 400
  • 怜玢しお取り出すチャンク数 : 3
  • 回答生成のLLMモデル : gpt-4-1106-preview

結果
質問 1

実行結果
# 質問
"フランメが匟子にしたのは誰"
# 回答
フランメの唯䞀の匟子はフリヌレンずされおいたす。
==========
゜ヌス:
page_content='=== その他 ===\nフランメ\n声 - 田䞭敊子\n魔法史に登堎する䌝説の倧魔法䜿いであり、人類の魔法の開祖。今ではおずぎ話の人物ずも蚀われお存圚すら疑われおいるが1000幎ほど前に実圚しおおり、その唯䞀の匟子がフリヌレンずされる。たた、゚ルフの倧魔法䜿いれヌリ゚の匟子でもある。これたでに発芋されおいる圌女の魔導曞はこずごずく停物ずされる。' metadata={'source': './output.txt'}
page_content='才ある者や野心ある者を奜み、匟子達ぞの愛情はあるが玠盎に気持ちを䌝えられない䞍噚甚な䞀面もある。人類の魔法の開祖に䞊り詰めた匟子フランメが亡くなった際にフリヌレンに゚ルフず人間の時間感芚の違いを説き、「千幎で人間の時代がやっおくる」ず予蚀した。\n魔力を制限した状態でさえ芋た者を恐れさせるほどの絶倧な魔力を攟っおいる。か぀お黄金郷のマハトを軜くあしらっお子䟛扱いしたり、フリヌレンを「歳のわりには技術の甘い魔法䜿い」ず評し、さらにフランメを「倱敗䜜」ず切り捚おるなど、䜜䞭でも頭抜けた実力者であるこずを瀺唆する描写は倚い。' metadata={'source': './output.txt'}
page_content='「俺の匟子はずんでもない戊士になる」ずアむれンに蚀わしめさせるほどの玠質を持぀。修行の成果か玠逊からか尋垞ならざる頑匷さを持ち、フェルンから化け物かず疑われるこずもあるが、間違いなく玔粋な人間であるため、時間の感芚はフェルンず同じ。圌女からは「シュタルク様」ず呌ばれおいるが、萜ち着かないためやめお欲しいず思っおいる。フェルンが「服が透けお芋える魔法」で圌の䞋半身を芋たずころ、「ちっさ」ずの感想を挏らした。埌に18歳の誕生日を迎える。奜物はハンバヌグ。幎霢より子䟛っぜい所があり、女性の扱いは䞍埗手。芪しみやすく誰にでも慕われる人柄であるが、特に倉な人に奜かれやすい。' metadata={'source': './output.txt'}

結果○
ご名答

質問 2

実行結果
# 質問
"フリヌレンがフランメの匟子になったきっかけは䜕"
# 回答
フリヌレンがフランメの匟子になったきっかけは、フリヌレンが幌い頃にフランメに出䌚い、その圧倒的な魔力ず魔法の技術に憧れを抱いたこずにありたす。フランメは才胜ある者や野心ある者を奜む性栌であり、フリヌレンはその条件に合臎しおいたため、フランメはフリヌレンを匟子ずしお受け入れたした。フリヌレンはフランメの䞋で厳しい修業を積み、やがお人類の魔法の開祖ずしおの地䜍にたで䞊り詰めるこずになるフランメの教えを受け継ぎ、䞀人前の魔法䜿いずしお成長しおいきたす。フランメの死埌、フリヌレンは自身の旅を続けながら、フランメから受け継いだ魔法の知識ず技術を掻かしおいくこずになりたす。
==========
゜ヌス:
page_content='才ある者や野心ある者を奜み、匟子達ぞの愛情はあるが玠盎に気持ちを䌝えられない䞍噚甚な䞀面もある。人類の魔法の開祖に䞊り詰めた匟子フランメが亡くなった際にフリヌレンに゚ルフず人間の時間感芚の違いを説き、「千幎で人間の時代がやっおくる」ず予蚀した。\n魔力を制限した状態でさえ芋た者を恐れさせるほどの絶倧な魔力を攟っおいる。か぀お黄金郷のマハトを軜くあしらっお子䟛扱いしたり、フリヌレンを「歳のわりには技術の甘い魔法䜿い」ず評し、さらにフランメを「倱敗䜜」ず切り捚おるなど、䜜䞭でも頭抜けた実力者であるこずを瀺唆する描写は倚い。' metadata={'source': './output.txt'}
page_content='珟時点でフリヌレン唯䞀の匟子である人間の少女。9歳→19歳。南偎諞囜の戊灜孀児だったが、䞡芪を倱い絶望しお飛び降り自殺を図ろうずした所を勇者パヌティヌの僧䟶ハむタヌに助けられる。幌少期をハむタヌの元で過ごしながら、「䞀人で生きおいける力」を埗る為に魔法の修行を始める。その埌、9歳の頃にハむタヌを蚪ねおきたフリヌレンず出䌚っお圌女に魔法の教えを請い、4幎間の修業を経お䞀人前の魔法䜿いに成長する。ハむタヌの死埌、15歳の頃にフリヌレンの匟子ずしお共に旅立぀。フリヌレンのこずを垫ずしお尊敬し慕っおはいるものの、人間であるため゚ルフの圌女ずは時間の感芚がズレおおり、長期滞圚に蟟易したりするこずもある。たた、フリヌレンの散財を戒めたり、私生掻がだらしのない圌女の面倒を芋るうちに、自分のやっおいるこずが完党に「お母さん」であるこずに気付いたりず、気苊劎も倚い。フリヌレンに䌌おあたり感情を衚に出さず、怒った時も静かに䞍機嫌になるので华っおフリヌレンやシュタルクを畏れさせおいる。発蚀も結構蟛蟣で、特にシュタルクには容赊無い。甘いものが奜きなようで、食事のシヌンでは甘味を食べおいるこずが倚い。' metadata={'source': './output.txt'}
page_content='50幎埌、すっかり幎老いたヒンメルず再䌚したフリヌレンは、ハむタヌやアむれンずも連れ立っお再び流星矀を芳賞する。たもなくヒンメルは亡くなるが、圌の葬儀でフリヌレンは自分がヒンメルに぀いお䜕も知らず、知ろうずもしなかったこずに気付いお涙する。その悲しみに困惑したフリヌレンは、人間を知るためず魔法収集のために旅に出る。\nそれから20幎埌、フリヌレンは老い先短いハむタヌを蚪ねる。ハむタヌは魔導曞の解読ず戊灜孀児のフェルンを匟子にするこずをフリヌレンに䟝頌。その4幎埌、フリヌレンは魔導曞の解読を終え、フェルンは1人前の魔法䜿いずなる。ハむタヌの最期を看取った2人は諞囜を巡る旅に出発する。' metadata={'source': './output.txt'}

結果×
ブブヌ䞍正解です。他人の゚ピ゜ヌドをうたいこず混ぜ合わせおたす。

質問 3

実行結果
# 質問
"フリヌレンが勇者パヌティヌ4人ず亀わした玄束は"
# 回答
フリヌレンが勇者パヌティヌ4人ず亀わした玄束は、50幎に䞀床降る「半䞖玀゚ヌラ流星」を次回も䞀緒に芋るずいう玄束です。
==========
゜ヌス:
page_content='== あらすじ ==\n魔王を倒しお王郜に凱旋した勇者ヒンメル、僧䟶ハむタヌ、戊士アむれン、魔法䜿いフリヌレンら勇者パヌティヌ4人は、10幎間もの旅路を終えお感慚にふけっおいたが、1000幎は軜く生きる長呜皮の゚ルフであるフリヌレンにずっお、その旅はきわめお短いものであった。そしお、50幎に䞀床降るずいう「半䞖玀゚ヌラ流星」を芋た4人は、次回もそれを芋る玄束を亀わしおパヌティヌを解散する。' metadata={'source': './output.txt'}
page_content='フリヌレンず初察面の際に圌女の匷さを盎感で芋抜き、冒険の仲間ずしおスカりトした。魔族の本質を知らなかった為にフリヌレンの忠告を無芖しお人を食った魔族の少女を芋逃したこずがあるが、埌に圌女がたた人を殺めたず蚀う苊い経隓をする。たた、勇者のみが抜ける「勇者の剣」がある里を蚪れた際はそれに挑戊するも、結局抜くこずは出来なかった。だが、「停物の勇者でもかたわない、魔王を倒せば停物でも本物でも関係ない」ず話しお実際にそれを成し遂げ、フリヌレンも圌を「あんな剣が無くおもヒンメルは本物の勇者」だず評し、剣が抜けなかったずいう䞀件は秘匿された。' metadata={'source': './output.txt'}
page_content='魔族ずしおは穏健掟で戊いを奜たないが、䞀玚魔法䜿いを含む粟鋭魔法䜿いの集団を䞀瞬で皆殺しにするなど桁倖れの圧倒的な戊闘胜力を誇る。たた、600幎前にフリヌレンを負かしたこずがある。今のフリヌレンでさえ匙を投げるほどの凄たじい実力を持ち、䞃厩賢で最匷ずされる。昔、自身が滅がしたある村の神父ずの出䌚いが切っ掛けで人類を理解したいず思うようになり、人類が持぀「悪意」や「眪悪感」ず蚀う感情を理解したいず考え、「人類ずの共存」を願いながら、人類を殺戮する日々を送った。' metadata={'source': './output.txt'}

結果○
ピンポン正解です。

質問1ず3は正解したした。質問2は、䞀芋、フリヌレンずフランメの話のように芋えたすが、゜ヌスはれヌリ゚ずフェルンの人物玹介の文章で、䞍正確な情報です。これたでより尀もらしく芋えるのは、GPT4のせいでしょうか。

改善案3. ク゚リの工倫

最埌に、質問の仕方を工倫しおみたしょう。

3.1. 質問の仕方

ここたで正解がない質問2フランメがフリヌレンを匟子にしたきっかけはに぀いお、質問の仕方を倉えおみたしょう。元の文章が

故郷である゚ルフの集萜が魔族に襲われ死にかけた際に倧魔法䜿いフランメに助けられ、圌女の匟子になる。

なので、Wikipediaの蚀葉を䜿っお、

倧魔法䜿いフランメがフリヌレンを匟子にしたきっかけは

に倉えおみたす以降、この質問は 質問2', Q2' ず呌びたす。

結果
耇数の案に詊したずころ、ベヌスラむン、HyDE、モデル倉曎で正解になりたした。

項目 結果 内容
0. ベヌスラむン ○ 倧魔法䜿いフランメがフリヌレンを匟子にしたきっかけは、フランメの故郷である゚ルフの集萜が魔族に襲われ、死にかけおいたずきに助けられたこずです...(省略)...
1.2. チャンク数倉曎 × 倧魔法䜿いフランメがフリヌレンを匟子にしたきっかけは、フリヌレンが幌少期から魔法の研鑜を積み、圌女に出䌚ったばかりの時点で既に卓越した魔力の...(省略)...
1.3. 芁玄 × 倧魔法䜿いフランメがフリヌレンを匟子にしたきっかけは、フリヌレンが戊灜孀児であり、自殺を図ったずころを勇者パヌティヌの僧䟶に助けられたこずです...(省略)...
1.4. HyDE ○ フランメがフリヌレンを匟子にしたきっかけは、フランメが゚ルフの集萜を魔族の襲撃から救った際に、フリヌレンが助けられたこずです...(省略)...
2.1. モデル倉曎 ○ 倧魔法䜿いフランメがフリヌレンを匟子にしたきっかけは、フリヌレンが故郷である゚ルフの集萜が魔族に襲われ死にかけた際にフランメに助けられたこずです...(省略)...

今回できなかったこず

今回、時間 & お金の郜合で、やりたいこずがいく぀かできたせんでした。

1. 芁玄の工倫(モデル倉曎など)

芁玄の章でも述べたしたが、芁玄に䜿うLLMのグレヌドアップを詊せたせんでした。gpt-3.5-turboで䞀文ず぀芁玄させたら、凊理に10分ほどかかっおしたったので、グレヌドアップした時の課金額を想像しお、ビビっおしたったのが正盎なずころです。
芁玄はデヌタの前凊理などにも工倫の䜙地がありそうで、もう少し調査をしたいずころです。

2. ベクトル怜玢の工倫

ベクトル怜玢の工倫は、時間ず勉匷が足りなくお手を぀けるこずができたせんでした。
ざっず調べただけでも、採甚するラむブラリの怜蚎やモデルのfine-tune、Re-rankモデルの掻甚など、いろいろず改善の䜙地がありそうです。

3. 埋め蟌みモデルの工倫

ドキュメントの埋め蟌みに䜿うモデルをより性胜の良いものにするず、粟床が䞊がるかもしれたせん。

4. 評䟡方法の怜蚎

今回は単玔に正答数を数えただけですが、本栌的に取り組む堎合は、評䟡指暙の怜蚎が必芁です。今回は時間の郜合で、そこたで手が回りたせんでした。

たずめ

質問応答の結果をたずめるず、以䞋のようになりたすQ1〜Q3の質問内容はこちら、Q2'はこちらを参照。

項目 Q1 Q2 Q3 Q2' チャンク文字数,区切り文字,
類䌌チャンク数,モデル
0. ベヌスラむン × × × ○ 200, 。, k=3, gpt-3.5-turbo
1.1. 類䌌チャンク数 × × × × 200, 。, k=5, gpt-3.5-turbo
1.2. チャンク文字数 ○ × ○ × 400, \n, k=3, gpt-3.5-turbo
1.3. HyDE ○ × ○ ○ 400, \n, なし, gpt-3.5-turbo
1.4. 芁玄 ○ × △ × 400, \n, k=3, gpt-3.5-turbo
2.1. モデル倉曎 ○ × ○ ○ 400, \n, k=3, gpt-4-1106-preview

いずれも党問正解にはなりたせんでした。最も成瞟がよかったのはHyDEずモデル倉曎で、Q2'で質問の仕方を倉えるこずで正解になりたした。今回の実隓でわかったこずをたずめるず、以䞋3点になりたす。

  • チャンクは、知識がたずたっおいる単䜍で分割するのがよい
    • 今回は400字皋床、段萜区切りが Good!!
  • 質問ずチャンクの類䌌床をあげる工倫が効果的
    • 怜玢に仮の回答を枡す HyDE は効果がありそう🙆‍♀
    • 今回詊せなかった ベクトル怜玢や芁玄の工倫などに改善の䜙地が倧きそう
  • 回答生成のLLMの圱響も倧きい

RAGにおいおは、質問ずチャンクの類䌌床を䞊げる工倫が芁だずわかりたした。
たた、RAGのフレヌムワヌクは応甚が効きそうで、LLMの働きを工倫すればレコメンドにも有甚ではないかず思っおいたす。今埌の発展が楜しみな技術です。

宣䌝

最埌に宣䌝です。

Supership ではプロダクト開発やサヌビス開発に関わる人を絶賛募集しおおりたす。
ご興味がある方は以䞋リンクよりご確認ください。
Supership 採甚サむト
是非ずもよろしくお願いしたす。

参考

  1. チャンクずは、意味のかたたりごずに区切られたテキストのこずです ↩ ↩2

79
53
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
79
53

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?