ChatGPT/LangChain
チャットアプリ構築
改善編

目次■ Chainの記述を簡素化■ 生成物の評価方法■ RAGの性能改善手法– メタデータによるフィルタリング– チャンキング戦略– 埋め込みモデルの選択– クエリ変換– リランキング■ 問い合わせの性能改善

Retrieval Augmented Generation（RAG）とは■

LLMの限界– LLMは訓練データに依存している、新しい情報や外部のデータベースにはアクセスでない■

RAGとの連携– 質問やプロンプトに対する回答を生成する際に、外部のデータベースから関連する情報を「取得」（Retrieval）– それを基に回答を「生成」（Generation）■

構成要素– Query Encoder:
質問やプロンプトをベクトル形式にエンコード– Document Retriever:
エンコードされたクエリを用いて、外部データベースから関連するドキュメントを取得– Answer Generator:取得されたドキュメントとクエリを基に、最終的な回答を生成

Chainの記述が簡素化■

LangChain Expression Language (LCEL) は、LangChain でのコードの新しい記述方法– 非同期、バッチ、ストリーミングのサポート– フォールバック– 並列処理■

パイプで PromptとモデルをChainできるfrom langchain.chat_models import ChatOpenAIfrom langchain.prompts import PromptTemplate
prompt = PromptTemplate.from_template("""料理のレシピを考えてください。
料理名: {dish}""")
llm = ChatOpenAI(model_name="gpt-3.5-turbo-1106", temperature=0)
chain = prompt | llm■

以前は以下のような記述となっていた
chain = LLMChain(prompt=prompt, llm=llm)

Chainの記述が簡素化■ LCELとそれを利用しない場合のソースの違いを確認■ ストリームがサポートしているとはどいいうことなのか？

生成物の評価方法■ 生成系A Iの出力結果がどれくらいなのか測る方法がないと改善したかわからないので評価方法をいくつか紹介する– LangChain Evaluations■■■–String : 指定された入力の予測文字列を評価し、参照文字列と比較
Comparision : 2つの言語モデル間のA/Bテストや、同じモデルの異なるバージョンの比較
Trajectory : AgentやChainなどの一連の流れを持った処理に対して評価

RAGAS
■
■

RAGパイプラインを評価/テストするためのフレームワーク
LangSmith(LangChain) や Prompt Flow(Azure OpenAI Service) にも同様の機能がある– LangSmith：LLMの実行ログ収集やデータセット作成、モデル評価– Prompt Flow：ツールを使ってAIアプリを作成するMicroSoftの製品

LangChain Evaluations■ LangChain Evaluationsで利用できる評価基準
評価基準

説明文

Conciseness

簡潔性

不必要な情報を排除し、要点を的確に表現している度合いを示します。

Relevance

関連性

初期のプロンプトや質問に対して生成結果がどれだけ関連しているかを評価します。

Correctness

正確性

事実情報の正確さと、生成結果に誤りがないことを示します。

Coherence

一貫性

生成結果の中でアイデアが論理的かつ流暢に繋がっている度合いを示します。

Harmfulness

有害性

生成結果が有害なコンテンツを含んだり、促進したりしている度合いを評価します。

Maliciousness

悪意性

生成結果が害を与えたり、悪意のある目的を促進する意図をどれだけ持っているかを示します。

Helpfulness

有用性

ユーザーに対して生成結果がどれだけ有用で情報提供ができているかを評価します。

Controversiality

議論性

生成結果が引き起こす可能性のある紛争や異議のレベルを示します。

Misogyny

差別性

女性への憎悪、軽蔑、偏見を示すコンテンツの存在を評価します。

Criminality

犯罪性

生成結果が犯罪行為を示唆、促進、または関与している度合いを示します。

Insensitivity

無神経性

他人の感情に配慮が欠けているか、または無関心である度合いを評価します。

LangChain Evaluations
String Evaluations
EvaluatorType

概要比較対象

評価方法

定量評価

QA

質問応答タスクの結果を評価します。LLM が評価するため、想定回答と意味的に一致していれば正解と見なします。

明示する

LLM が評価-

COT_QA

質問応答タスクの結果を評価します。正解を LLMに推論させるため、ラベルのないタスクの評価に利用することができます。

LLM が推論

LLM が評価-

CONTEXT_QA

COT_QA と同様です。LLM に指定しているプロンプトが異なります。

LLM が推論

LLM が評価-

LLM が推論

LLM が評価

LLM が評価

質問応答タスクの結果を評価します。正解を LLMに推論させた上で、以下の観点で総合的に定量評価を行います。
SCORE_STRING* helpfulness* relevance* correctness* depthRAGAS■ 基本的に、以下の情報を使って指標は算出されます。
– 与えられたプロンプト– 関連があるものとして取得されたコンテキスト– 生成された回答– 任意の質問に対する真の回答
評価基準

説明文

Faithfulness

忠実度

生成された回答が与えられたコンテキストに対して事実上一貫しているか

Answer Relevancy

回答の関連性

生成された回答が与えられたプロンプトにどれだけ関連しているか
不完全な回答や冗長な情報を含む回答には低いスコアとなる

Context Precision

コンテキストの精度取得されたコンテキスト内のすべての関連アイテムが高くランク付けされているか

Context Recall

コンテキストの再現性取得されたコンテキストが、真の回答とどれだけ一致しているか

Context Relevancy

コンテキストの関連性与えられたプロンプトと取得されたコンテキストの関連性

RAGAS■RAGAS を使用した性能評価■

入力と出力、中間処理でベクターストアから取得した情報に加え、入力に対する真の回
答 ground_truths の4つを使用

■

評価の実行

■

評価には、evaluate 関数を使用します。

■

算出したい指標を個別に指定することも可能ですが、デフォルトで算出する指標は以下4つです。

•忠実度 (faithfulness)•

回答の関連性 (answer_relevancy)•コンテキストの精度 (context_precision)•コンテキストの再現性 (context_recall)RAGの性能改善手法■ 前処理■ メタデータによるフィルタリング■ チャンキング戦略■ 埋め込みモデルの選択■ クエリ変換■ リランキングRAGの性能改善手法
前処理■ 前処理が必要な理由– PDFの中には実際に表示されている以上のテキストが含まれていることがある– テキストだと思ったら実際にはスキャンした埋め込み画像– 段組で記載されているなどで内容の順番が一定ではない– 構文がドキュメントにより異なる■ 前処理の方法– PDFではなく元のPower PointやWordファイルを使うようにする– テキストのクリーニングや正規化– 構文解析を行う

PDFを読み取る■ PDFの中のドキュメントを読み取る■ 日本語対応の読み取りライブラリを使用してベクトル化する– pdfminer■ アプリは RAGで利用するためベクトルに保存して問い合わせる作成するところまで

PDFを画像にして文字を読み取る■

PDFが画像になってるので読めないことがある■

これを読み取りRAGに組込みたい– 手順■■■■

PDFを画像ファイルに変換する
光学文字認識ツールで画像から文字を認識する
認識した文字をアウトプットする
画像変更前と後を同じプロンプトで要約して比べる(検証のためLangChainEvaluation使える？)■

pdf2image– PDFを画像ファイルに変換するためのライブラリです。

■

PyOCR
– PythonのOCR（光学文字認識）ツール■

Tesseractについて– Googleが開発したOCRエンジン– Tesseractには3種類のエンジンがあり、それぞれ長所が異なります。
■

通常版、fast版（実行速度重視）、best版（精度重視、実行速度はやや遅い）

RAGの性能改善手法

メタデータによるフィルタリング■ フィルタリングでは、文書の属性情報（メタデータ）に基づいて、文書を絞り込む– 文書のタイトルや作成者、作成日、キーワード、カテゴリなど■

ベクトル化する時に一緒にカテゴリ、作成者、URL、キーワード、タイトルもそれぞれメタデータとして保存する– それらの類似性を組み合わせる手法は後に記述する
ドキュメントをMarkDownにする
マークダウンの見出しをMetadataとして保存する
メタデータを利用して検索やフィルタリングをする

RAGの性能改善手法
チャンキング戦略■ 長いテキストをより小さなセグメント（チャンク）に分割する– テキストの内容や構造に関係なく、テキストを指定された文字数やトークン数で分割– いくつかの区切り文字を使って、テキストを階層的かつ反復的に小さなチャンクに分割■–

文書の保つ構造に基づいてチャンクに分割■–

句読点、ピリオド、改行

タイトル、テキスト、図、表セマンティック（意味）に分けるチャンキンング■ チャンクサイズは短い方が精度が良いようだ

RAGの性能改善手法
埋め込みモデルの選択■ 文書中の単語の出現回数をもとにしたTF-IDFやBM25といったスコア付けしていた■ 埋め込みとは、単語や文書を表現する数値ベクトルのこと■ 埋め込みモデルを使うと、似た意味の単語やテキストを似たようなベクトルに変換してくれるため、単語や文書の意味を考慮した検索の実現を期待できる■ 埋め込みモデル– 日本語の埋め込みモデルがある https://github.com/hppRC/simple-simcse-ja– 多言語E5（multilingual-e5-*）OSS– OpenAIのtext-embedding-ada-002 SaaS– Cohereが提供している多言語用のモデル（embed-multilingual-v3.0）SaaSRAGの性能改善手法

Stuff, Refine,Reranking,
RAGから質問に近いベクトルを複数抽出してその情報をどのように生成AIに問い合わせるかによって精度が良くなる可能性がる■

Stuff–

複数のRAGの検索結果を一つの質問に含めて生成AIに問い合わせる■

ReRank–ランキング用のモデル（Reranker）を用いて、検索結果を表示する前に、その順序を並び替える処理–
最終的に上位10件の文書を表示したい場合、結果上位100件の文書に対して、クエリと文書をモデル（クロスエンコーダー）に与えて類似度を計算し、計算した結果を使って並び替えた文書の上位10件を表示■Refine–
複数のベクトルの検索結果を一つずつ問い合わせて、その回答を含め次の問い合わせを行う■ReDuce–
複数のベクトルの検索結果を一つずつ問い合わせて、回答をまとめて再度問い合わせを–行う

Chain Type Stuff■ ベクトルから取得した内容を一度に詰め込む方式
質問
質問に関連した
Chunk1

質問に関連した
Chunk2
質問に関連した
Chunk3

質問

生成AI

回答

Chain Type Refine■ ベクトルから取得した内容を繰り返し聞いていく方式
質問
質問に関連した
Chunk1

質問

生成AI

回答

質問に関連した
Chunk2

質問

生成AI

回答

質問に関連した
Chunk3

質問

生成AI

回答

Chain Type Rebase■ それぞれの回答からさらに回答を作る方式
質問
質問に関連した
Chunk1

質問

生成AI

回答

質問に関連した
Chunk2

質問

生成AI

回答

質問に関連した
Chunk3

質問

生成AI

回答

質問

生成AI

回答

Chain Type ReRank■ 一番良い回答を選ぶ方式
質問
質問に関連した
Chunk1

質問

生成AI

回答

質問に関連した
Chunk2

質問

生成AI

回答

質問に関連した
Chunk3

質問

生成AI

回答

スコアが高い回答

RAGの性能改善手法
クエリ変換■ クエリを書き換えることで性能が向上する■ 複数のクエリを生成し、それらに対して検索を実行して、結果をマージすることで性能が向上する■ HyDE（Hypothetical Document Embeddings：仮の文書の埋め込み）は、入力されたクエリに対して仮の文書を生成し、その文書を埋め込み、検索に使用する手法

出典■ LCEL– https://note.com/npaka/n/nc9598129ca3f#c1b63baa-a2cc-4190-ae4984c1d1a69e5d■ LangChain Evaluations– https://zenn.dev/umi_mori/books/prompt-engineer/viewer/langchain_evaluations■ RAGAS– https://qiita.com/s3kzk/items/44b8780c656b4f747403■LangSmith– https://liginc.co.jp/blog/tech/638075■ RAGの性能評価– https://fintan.jp/page/10301/