Ragasで日本語のテストデータを生成する（うまくいかない。。）

:::note warn
日本語のテストデータを上手に生成することはできませんでしたが、自分への備忘録として残しておきます。
:::


Ragasは、RAG（検索拡張生成）パイプラインの評価に役立つフレームワークです。

https://docs.ragas.io/en/stable/index.html

Ragasの機能の一つに、テストデータの生成機能があります。

https://docs.ragas.io/en/stable/getstarted/testset_generation.html

## テストデータ生成してみる

まずは、上記ドキュメントに沿ってやってみます。

:::note

題材となるテストデータは、AWSのWhat's Newから新し目のものをピックアップしました。

<details><summary>AI21 Labs の Jamba-Instruct モデルが Amazon Bedrock で利用可能に</summary>

```
AI21 Labs の Jamba-Instruct モデルが Amazon Bedrock で利用可能に
投稿日: 2024年6月25日
AI21 Labs の Jamba-Instruct は、強力な命令追従型大規模言語モデルで、Amazon Bedrock で利用できるようになりました。Jamba-Instruct は、命令追従型に調整され、信頼性の高い商用利用を想定して構築されているため、自由形式の対話が可能で、文脈やサブテキストを理解し、自然言語による命令に基づいてさまざまなタスクを完了できます。

256,000 のコンテキストウィンドウを備えた Jamba-Instruct は、800 ページの小説、または特定の会計年度の会社全体の財務報告に相当するものを取り込むことができます。この大きなコンテキストウィンドウにより、Jamba-Instruct は提供された入力に基づいて質問に答えたり、要約を作成したりできるため、小さなコンテキストウィンドウに合わせてドキュメントを手動でセグメント化する必要がありません。

Jamba-Instruct は、その強力な推論能力と分析機能により、複雑な問題を分解し、関連情報を収集し、構造化されたアウトプットを提供できます。このモデルは、通話記録に関する Q&A を有効にする、ドキュメントから重要なポイントを要約する、チャットボットを構築するなど、一般的な企業ユースケースに最適です。Jamba-Instruct は、コーディング、執筆、調査、分析、クリエイティブタスク、一般的なタスク支援など、どのような支援が必要な場合でも、生成 AI エンタープライズアプリケーションのワークフローを合理化し、制作時間を短縮できる強力なモデルです。
 

AI21 Labs の Jamba-Instruct ファンデーションモデルが、米国東部 (バージニア北部) AWS リージョンの Amazon Bedrock で利用できるようになりました。詳細については、機械学習ブログをお読みになり、Amazon Bedrock の AI21 Labs 製品ページとドキュメントをご覧ください。Amazon Bedrock で Jamba-Instruct を使い始めるには、Amazon Bedrock コンソールにアクセスしてください。
```

</details>

<details><summary>Amazon CodeCatalyst が GitLab.com のソースコードリポジトリのサポートを開始</summary>

```
Amazon CodeCatalyst が GitLab.com のソースコードリポジトリのサポートを開始
投稿日: 2024年6月25日
Amazon CodeCatalyst では、GitLab.com でホストされているソースコードリポジトリを CodeCatalyst プロジェクトで使用できるようになりました。これにより、お客様はクラウド IDE (開発環境)、Amazon Q 機能開発、カスタムブループリントやパブリックブループリントなどの CodeCatalyst の機能で GitLab.com リポジトリを使用できます。また、お客様は GitLab.com のイベントに基づいて CodeCatalyst ワークフローをトリガーしたり、GitLab.com に戻って CodeCatalyst ワークフローのステータスを表示したり、CodeCatalyst ワークフローのステータスに基づいて GitLab.com のプルリクエストのマージをブロックしたりすることもできます。

お客様は、その機能を使用するために CodeCatalyst に移行することなく、GitLab.com でホストされているソースコードリポジトリを使用できる柔軟性を望んでいます。移行は長いプロセスであるため、お客様は移行を決定する前に、独自のコードリポジトリを使用して CodeCatalyst とその機能を評価することを希望しています。GitLab.com などの一般的なソースコードプロバイダーのサポートは、CodeCatalyst に対するお客様からの最大の要望です。お客様は GitLab.com からソースコードを移行しなくても CodeCatalyst の機能を使用できるようになりました。

この機能は、CodeCatalyst が利用可能なリージョンでご利用いただけます。料金に変更はありません。

詳細については、ドキュメントを参照するか、Amazon CodeCatalyst ウェブサイトを参照してください。
```

</details>

<details><summary>Amazon EC2 C6a インスタンスをご利用いただけるリージョンが増加</summary>

```
Amazon EC2 C6a インスタンスをご利用いただけるリージョンが増加
投稿日: 2024年6月25日
本日より、汎用 Amazon EC2 C6a インスタンスがアジアパシフィック (香港) リージョンで利用可能になりました。C6a インスタンスは、3.6 GHz の最大周波数の第 3 世代 AMD EPYC プロセッサを搭載しています。C6a インスタンスは、同等の C5a インスタンスよりも最大 15% 優れた料金パフォーマンスを実現します。C6a インスタンスのコストは、同等の x86 ベースの EC2 インスタンスに比べて 10% 低くなります。これらのインスタンスは、専用ハードウェアと軽量ハイパーバイザーを組み合わせた AWS Nitro System で構築されています。同システムは、ホストハードウェアのコンピューティングリソースおよびメモリリソースすべてを実質的にお客様のインスタンスに提供し、全体的なパフォーマンスおよびセキュリティを改善します。

今回のリージョン追加により、C6a インスタンスは、米国東部 (バージニア北部、オハイオ)、米国西部 (オレゴン、北カリフォルニア)、アジアパシフィック (香港、ムンバイ、シンガポール、シドニー、東京)、カナダ (中部)、欧州 (フランクフルト、アイルランド、ロンドン)、南米 (サンパウロ) の各 AWS リージョンで利用できます。これらのインスタンスは、Savings Plans、リザーブド、オンデマンド、およびスポットインスタンスとして購入できます。使用を開始するには、AWS マネジメントコンソール、AWS コマンドラインインターフェイス (CLI)、および AWS SDK にアクセスしてください。詳細については、C6a インスタンスのページを参照してください。
```

</details>

<details><summary>Amazon ElastiCache が、追加の AWS リージョンでの M7g および R7g Graviton3 ベースのノードをサポート</summary>

```
Amazon ElastiCache が、追加の AWS リージョンでの M7g および R7g Graviton3 ベースのノードをサポート
投稿日: 2024年6月25日
Amazon ElastiCache で、Graviton3 ベースの M7g および R7g のノードファミリーがサポートされるようになりました。ElastiCache Graviton3 ノードでは、Graviton2 と比べて価格とパフォーマンスが改善されています。例えば、R7g.4xlarge ノードで Redis 用 ElastiCache を実行した場合、R6g.4xlarge で実行した場合と比較して、スループット (1 秒あたりの読み取りおよび書き込みオペレーション) が最大 28% 向上し、P99 レイテンシーが最大 21% 減少します。さらに、これらのノードのネットワーク帯域幅は最大 25% 高くなります。

M7g および R7g ノードは、以下の AWS リージョンの Amazon ElastiCache で使用できるようになりました: 米国東部 (バージニア北部、オハイオ)、米国西部 (オレゴン、北カリフォルニア)、カナダ (中部)、南米 (サンパウロ)、欧州 (アイルランド、フランクフルト、ロンドン、ストックホルム、スペイン、パリ (m7g のみ))、アジアパシフィック (東京、シドニー、ムンバイ、ハイデラバード、ソウル、シンガポール) の各リージョン。料金および利用できるリージョンの詳細については、Amazon ElastiCache の料金ページをご参照ください。使用を開始するには、AWS マネジメントコンソールを使用して新しいクラスターを作成するか Graviton3 にアップグレードし、詳細な情報をご確認ください。
```

</details>

<details><summary>アジアパシフィック (ムンバイ) リージョンで少ない基本容量で Amazon Redshift Serverless が利用可能に</summary>

```
アジアパシフィック (ムンバイ) リージョンで少ない基本容量で Amazon Redshift Serverless が利用可能に
投稿日: 2024年6月25日
Amazon Redshift では、AWS アジアパシフィック (ムンバイ) リージョンで 8 つの Redshift Processing Unit (RPU) という低いデータウェアハウス基本容量構成で Amazon Redshift Serverless の使用を開始できるようになりました。Amazon Redshift Serverless はデータウェアハウスの容量を RPU 単位で測定します。お支払いいただくのは、RPU 時間単位で実行するワークロードの継続時間に対してのみで、秒単位での料金が発生します。以前は、Amazon Redshift Serverless を実行するために必要な最小基本容量は 32 RPU でした。基本容量が最低 8 RPU に引き下げられたことで、価格性能の要件に応じて、複雑さが小さいものから大きいものまで、さまざまなワークロードをより柔軟にサポートできるようになりました。RPU は 8 RPU 単位でインクリメントまたはデクリメントできます。

Amazon Redshift Serverless を使用すれば、データウェアハウスクラスターをプロビジョニングおよび管理することなく、分析を実行しスケールできます。Amazon Redshift Serverless を使用すれば、データアナリスト、デベロッパー、データサイエンティストを含むすべてのユーザーは、Amazon Redshift を使用して数秒のうちにデータからインサイトを得ることができます。新しい低容量構成では、Amazon Redshift Serverless を本番環境、テスト環境、開発環境に、ワークロードに必要なコンピューティング量が少ない場合に最適な価格帯で使用できます。

使用を開始する方法については、Amazon Redshift Serverless の機能紹介のページ、ユーザードキュメント、API リファレンスをご参照ください。
```

</details>

:::

まず、必要なライブラリーをインストールします。ドキュメントの読み取りにLangChainを使用します。また、LLMはBedrockを使用します。

```
pip install langchain langchain-community langchain-aws ragas
```

ドキュメントを読み込みます。

```python
from langchain_community.document_loaders import DirectoryLoader

loader = DirectoryLoader("./ja")
documents = loader.load()
```

`filename`メタデータにファイル名をセットします。

```python
for document in documents:
    document.metadata["filename"] = document.metadata["source"]
```

LLMを定義し、`generator`を生成します。

```python
from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context
from langchain_aws import ChatBedrock, BedrockEmbeddings

generator_llm = ChatBedrock(model_id="anthropic.claude-3-haiku-20240307-v1:0")
critic_llm = ChatBedrock(model_id="anthropic.claude-3-haiku-20240307-v1:0")
embeddings = BedrockEmbeddings(
    model_id="amazon.titan-embed-text-v2:0", model_kwargs={"dimensions": 256}
)

generator = TestsetGenerator.from_langchain(generator_llm, critic_llm, embeddings)
```

テストデータを生成します。

```python
testset = generator.generate_with_langchain_docs(
    documents,
    test_size=10,
    distributions={simple: 0.5, reasoning: 0.25, multi_context: 0.25},
)
```

テストデータの内容を確認します。英語で生成されてしまいました。

| question | contexts (抜粋) | ground_truth | 
|------|---------------------|------|
| How can customers use GitLab.com repositories with Amazon CodeCatalyst? | Amazon CodeCatalyst が GitLab.com のソースコードリポジトリのサポートを開始 投稿日: 2024年6月25日 Amazon CodeCatalyst では、GitLab.com でホストされているソースコードリポジトリを CodeCatalyst プロジェクトで使用できるようになりました... | nan |
| What is the minimum Redshift Processing Unit (RPU) capacity required to use Amazon Redshift Serverless in the Asia Pacific (Mumbai) region? | アジアパシフィック (ムンバイ) リージョンで少ない基本容量で Amazon Redshift Serverless が利用可能に 投稿日: 2024年6月25日 Amazon Redshift では、AWS アジアパシフィック (ムンバイ) リージョンで 8 つの Redshift Processing Unit (RPU) という低いデータウェアハウス基本容量構成で Amazon Redshift Serverless の使用を開始できるようになりました... | The minimum Redshift Processing Unit (RPU) capacity required to use Amazon Redshift Serverless in the Asia Pacific (Mumbai) region is 8 RPU. |
| What is the minimum Redshift Processing Unit (RPU) capacity required to use Amazon Redshift Serverless in the Asia Pacific (Mumbai) Region? | アジアパシフィック (ムンバイ) リージョンで少ない基本容量で Amazon Redshift Serverless が利用可能に 投稿日: 2024年6月25日 Amazon Redshift では、AWS アジアパシフィック (ムンバイ) リージョンで 8 つの Redshift Processing Unit (RPU) という低いデータウェアハウス基本容量構成で Amazon Redshift Serverless の使用を開始できるようになりました... | The minimum Redshift Processing Unit (RPU) capacity required to use Amazon Redshift Serverless in the Asia Pacific (Mumbai) Region is 8 RPU. |
| What is the new minimum data warehouse capacity configuration for Amazon Redshift Serverless in the AWS Asia Pacific (Mumbai) Region? | アジアパシフィック (ムンバイ) リージョンで少ない基本容量で Amazon Redshift Serverless が利用可能に 投稿日: 2024年6月25日 Amazon Redshift では、AWS アジアパシフィック (ムンバイ) リージョンで 8 つの Redshift Processing Unit (RPU) という低いデータウェアハウス基本容量構成で Amazon Redshift Serverless の使用を開始できるようになりました... | The new minimum data warehouse capacity configuration for Amazon Redshift Serverless in the AWS Asia Pacific (Mumbai) Region is 8 Redshift Processing Units (RPUs). |
| What is the minimum Redshift Processing Unit (RPU) capacity required to use Amazon Redshift Serverless in the Asia Pacific (Mumbai) Region? | アジアパシフィック (ムンバイ) リージョンで少ない基本容量で Amazon Redshift Serverless が利用可能に 投稿日: 2024年6月25日 Amazon Redshift では、AWS アジアパシフィック (ムンバイ) リージョンで 8 つの Redshift Processing Unit (RPU) という低いデータウェアハウス基本容量構成で Amazon Redshift Serverless の使用を開始できるようになりました... | The minimum Redshift Processing Unit (RPU) capacity required to use Amazon Redshift Serverless in the Asia Pacific (Mumbai) Region is 8 RPU. |

毎回必ず英語で生成されるのかは不明ですが、明示的に「日本語」を指定する方法を見つけましたので、やってみます。

## テストデータを日本語で生成

ドキュメントで「Language Adaptation」として、明示的に言語を指定してテストデータを生成する方法が解説されています。

https://docs.ragas.io/en/stable/howtos/applications/use_prompt_adaptation.html

この手順に沿ってやってみます。

ドキュメント読み込み部分は先程と同じです。

```python:（さっきと同じ）
from langchain_community.document_loaders import DirectoryLoader

loader = DirectoryLoader("./ja")
documents = loader.load()

for document in documents:
    document.metadata["filename"] = document.metadata["source"]
```

ここで日本語対応の一手間を加えます。
`japanese`を指定して、`generator.adapt`を実行します。これにより、内部的に使用されるプロンプトの日本語対応版が生成されます。

:::note
Claude 3 Haikuを使って試したところ、いい感じに生成されなかったので、GPT-3.5 Turboを使用しました。
:::

```python
from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

generator_llm_o = ChatOpenAI(model="gpt-3.5-turbo")
critic_llm_o = ChatOpenAI(model="gpt-3.5-turbo")
embeddings_o = OpenAIEmbeddings()

generator = TestsetGenerator.from_langchain(generator_llm_o, critic_llm_o, embeddings_o)

language = "japanese"

generator.adapt(language, evolutions=[simple, reasoning, multi_context])
generator.save(evolutions=[simple, reasoning, multi_context])
```

`generator.save`を実行することで生成されたプロンプトをキャッシュディレクトリ（デフォルトでは`~/.cache/ragas`）にJSON形式で保存されます。

```json:（例）~/.cache/ragas/japanese/reasoning_question.json
{
  "name": "reasoning_question",
  "instruction": "Complicate the given question by rewriting question into a multi-hop reasoning question based on the provided context.\n    Answering the question should require the reader to make multiple logical connections or inferences using the information available in given context.\n    Rules to follow when rewriting question:\n    1. Ensure that the rewritten question can be answered entirely from the information present in the contexts.\n    2. Do not frame questions that contains more than 15 words. Use abbreviation wherever possible.\n    3. Make sure the question is clear and unambiguous.\n    4. phrases like 'based on the provided context','according to the context',etc are not allowed to appear in the question.",
  "output_format_instruction": "",
  "examples": [
    {
      "question": "フランスの首都は何ですか？",
      "context": "フランスは西ヨーロッパにある国です。パリ、リヨン、マルセイユなど、いくつかの都市があります。パリはエッフェル塔やルーブル美術館などの文化的な名所だけでなく、行政の中心地としても知られています。"
    },
    {
      "question": "Pythonのappend（）メソッドは何をしますか？",
      "context": "Pythonでは、リストは複数のアイテムを1つの変数に格納するために使用されます。リストは、データのコレクションを格納するために使用される4つの組み込みデータ型の1つです。append（）メソッドは、リストの末尾に1つのアイテムを追加します。"
    }
  ],
  "input_keys": [
    "question",
    "context"
  ],
  "output_key": "output",
  "output_type": "str",
  "language": "japanese"
}
```

プロンプトを生成しておくと、次回日本語を指定して`generator.adapt`した際には、生成処理はスキップされ、生成済みファイルが使用されます。

テストデータ生成はBedrockを使いたいので、改めてBedrockのLLMを指定して`generator`を生成します。

```python
from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context
from langchain_aws import ChatBedrock, BedrockEmbeddings

generator_llm = ChatBedrock(model_id="anthropic.claude-3-haiku-20240307-v1:0")
critic_llm = ChatBedrock(model_id="anthropic.claude-3-haiku-20240307-v1:0")
embeddings = BedrockEmbeddings(
    model_id="amazon.titan-embed-text-v2:0", model_kwargs={"dimensions": 256}
)

generator = TestsetGenerator.from_langchain(generator_llm, critic_llm, embeddings)

language = "japanese"

generator.adapt(language, evolutions=[simple, reasoning, multi_context])
```

この状態でテストデータを生成します。

```python
testset = generator.generate_with_langchain_docs(
    documents,
    test_size=10,
    distributions={simple: 0.5, reasoning: 0.25, multi_context: 0.25},
)
```

| question | contexts (抜粋) | ground_truth | 
|------|---------------------|------|
| What region has recently made Amazon Redshift Serverless available with a lower basic capacity in the Asia Pacific (Mumbai) region? | アジアパシフィック (ムンバイ) リージョンで少ない基本容量で Amazon Redshift Serverless が利用可能に 投稿日: 2024年6月25日 Amazon Redshift では、AWS アジアパシフィック (ムンバイ) リージョンで 8 つの Redshift Processing Unit (RPU) という低いデータウェアハウス基本容量構成で Amazon Redshift Serverless の使用を開始できるようになりました... | アジアパシフィック (ムンバイ) リージョン |
| AI21 Labs の Jamba-Instruct モデルはどこで利用可能になったか？ | AI21 Labs の Jamba-Instruct モデルが Amazon Bedrock で利用可能に 投稿日: 2024年6月25日 AI21 Labs の Jamba-Instruct は、強力な命令追従型大規模言語モデルで、Amazon Bedrock で利用できるようになりました... | AI21 Labs の Jamba-Instruct は Amazon Bedrock で利用できるようになりました。 |
| What is the new minimum basic capacity configuration for using Amazon Redshift Serverless in the AWS Asia Pacific (Mumbai) region? | アジアパシフィック (ムンバイ) リージョンで少ない基本容量で Amazon Redshift Serverless が利用可能に 投稿日: 2024年6月25日 Amazon Redshift では、AWS アジアパシフィック (ムンバイ) リージョンで 8 つの Redshift Processing Unit (RPU) という低いデータウェアハウス基本容量構成で Amazon Redshift Serverless の使用を開始できるようになりました... | The new minimum basic capacity configuration for using Amazon Redshift Serverless in the AWS Asia Pacific (Mumbai) region is 8 Redshift Processing Units (RPU). |
| What is the Jamba-Instruct model by AI21 Labs and how is it now available on Amazon Bedrock? | AI21 Labs の Jamba-Instruct モデルが Amazon Bedrock で利用可能に 投稿日: 2024年6月25日 AI21 Labs の Jamba-Instruct は、強力な命令追従型大規模言語モデルで、Amazon Bedrock で利用できるようになりました... | AI21 Labs の Jamba-Instruct は、強力な命令追従型大規模言語モデルで、Amazon Bedrock で利用できるようになりました。Jamba-Instruct は、命令追従型に調整され、信頼性の高い商用利用を想定して構築されているため、自由形式の対話が可能で、文脈やサブテキストを理解し、自然言語による命令に基づいてさまざまなタスクを完了できます。 |
| What are the key features and benefits of Amazon EC2 C6a instances in Asia Pacific (HK), and how do they compare in performance and cost to C5a and x86 EC2 instances? | Amazon EC2 C6a インスタンスをご利用いただけるリージョンが増加 投稿日: 2024年6月25日 本日より、汎用 Amazon EC2 C6a インスタンスがアジアパシフィック (香港) リージョンで利用可能になりました。C6a インスタンスは、3.6 GHz の最大周波数の第 3 世代 AMD EPYC プロセッサを搭載しています... | The key features and benefits of Amazon EC2 C6a instances in Asia Pacific (HK) include being powered by 3rd Gen AMD EPYC processors with a maximum frequency of 3.6 GHz, offering up to 15% better price performance compared to C5a instances, and costing 10% less than equivalent x86-based EC2 instances. These instances are built on the AWS Nitro System combining dedicated hardware and a lightweight hypervisor to provide customers with all computing and memory resources of the host hardware, improving overall performance and security. |
| How do I access the Jamba-Instruct model on Amazon Bedrock in AWS North Virginia? | AI21 Labs の Jamba-Instruct モデルが Amazon Bedrock で利用可能に 投稿日: 2024年6月25日 AI21 Labs の Jamba-Instruct は、強力な命令追従型大規模言語モデルで、Amazon Bedrock で利用できるようになりました... | {"answer": "与えられた質問の答えは文脈に存在しません", "verdict": -1} |
| AI21 Labs の Jamba-Instruct モデルは、何を提供していますか？ | AI21 Labs の Jamba-Instruct モデルが Amazon Bedrock で利用可能に 投稿日: 2024年6月25日 AI21 Labs の Jamba-Instruct は、強力な命令追従型大規模言語モデルで、Amazon Bedrock で利用できるようになりました... | AI21 Labs の Jamba-Instruct は、命令追従型に調整され、信頼性の高い商用利用を想定して構築されているため、自由形式の対話が可能で、文脈やサブテキストを理解し、自然言語による命令に基づいてさまざまなタスクを完了できます。 |

いい感じにはならなかったですね。（GPT-3.5 Turboでテストデータ生成しても同じ感じでした。）


たすけて～～～