0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RAGの精度向上方法について検討・調査する

0
Posted at

概要

前回以下のような記事を作成しました

RAGというものは何か、あとは実際に試してみるということを実施しました
最後の方で精度が良くなかったという結果に落ち着いたので、今回は精度向上にはどのようなことができるかを記事にしてみたいと思います

本題

調べてみるといくつか特徴と改善策のようなものが見つかりました

  • チャンクサイズの調整
  • 検索方法の変更
  • 音声ファイルの事前処理・精度向上

チャンクサイズの調整

長文やデータをAI(LLM)で処理しやすいように分割する際の「1回あたりのデータのかたまりの大きさ」であるチャンクサイズというものを調整すると効果があるようです(今回扱っているものでいうと検索対象の音声ファイルということになります)

また、オーバーラップといってチャンクサイズで区切ったものに対して前後の隣り合うチャンク同士を「10〜20%」ほど重複させて前後の意味合いを欠落させないようにすることも重要なようでした

大きすぎても小さすぎても良くないらしいので、やりたいことに合っているチャンクサイズを探さなければいけない模様でした

以下の記事を参考にさせていただきました

以下にチャンクサイズが300,オーバーラップが50の例とチャンクサイズが400とオーバーラップが80の例で出力してみた結果になります

マグロという特徴的なキーワードがあるからかあまり大きな差は見られませんでした

[~/sandbox/whi][main] % uv run python ask_agent.py "ノンスタイルの漫才でマグロについて漫才している動画はどれでしょうか?"
Question: ノンスタイルの漫才でマグロについて漫才している動画はどれでしょうか?
Extracting search keywords...
Extracted Keywords: ノンスタイル, NON STYLE, 漫才, ネタ, マグロ, まぐろ
Searching transcripts (Chunk Size: 300, Overlap: 50)...
Found 10 matching segment(s).
Generating answer...

========================================
ノンスタイルの漫才でマグロについて漫才している動画は、以下の通りです。

**伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」**
この動画では、寿司屋を舞台にした漫才の中で、マグロについて繰り返し言及されています。

*   「マグロを バック何これ? これ何なんさっきから おいなんで驚いてんの? 客やねんから 食べるに決まってるやろおい おいもう見てる人手洋がつけろこれ 調子乗るから 何やねんこの時間が 先生 何でお前がわー驚いてんねん マグロへ戻らん レゴブロックでした 何食べさしてんねんもう さぁ今回のネタは寿司屋に行きたいございますが」
    [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (10:24)](https://youtu.be/wrc2UCrZfdY?t=624)
*   「寿司屋みたいな マグロとれたら1分くらいに 注文したらちゃうねん、おいおいおい なあ 聞いてるかって 1、2、3、4 マグマグマグマグルちゃん にぎにぎにぎにぎるくん マグロちゃんを にぎるくんは よなよな布団で 気持ち悪いわ 飯くん前に何ちゅうこと 言ってくれてんの お前冷凍マグロ レンジでチンしたよ 自動って持ってるやんけ おいおいおい おい 何してんねん めちゃくちゃもう 丸焦げと熱いのこれ お待たせいたしました オンマグロです オンマグロみたいに言うな」
    [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (02:24)](https://youtu.be/wrc2UCrZfdY?t=144)
*   「マグロにぎにぎまーちですけども マグロにぎにぎまーちとか知らんから 歌うな 俺その後嫌いやから さよならわさびちゃん どっちも言えねん 知らんしまず知らんし 歌うにやめて」
    [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (03:20)](https://youtu.be/wrc2UCrZfdY?t=200)

また、「井上が大人の男を目指す新ネタ「朝活」」の動画でも、ネタの一部としてマグロについて言及されています。

*   「確かまりました こちら、オーミの漬けマグロです コーヒーだわんやろ 誰がコーヒーとマグロ食うねん」
    [井上が大人の男を目指す新ネタ「朝活」 (03:22)](https://youtu.be/V9WJIZ4Gytk?t=202)
[~/sandbox/whi][main] % uv run python ask_agent.py "ノンスタイルの漫才でマグロについて漫才している動画はどれでしょうか?" --chunk-size 400 --chunk-overlap 80
Question: ノンスタイルの漫才でマグロについて漫才している動画はどれでしょうか?
Extracting search keywords...
Extracted Keywords: ノンスタイル, 漫才, マグロ, まぐろ, お笑い, NON STYLE
Searching transcripts (Chunk Size: 400, Overlap: 80)...
Found 10 matching segment(s).
Generating answer...

========================================
ノンスタイルの漫才でマグロについて漫才している動画は、主に「伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」」です。この動画では、寿司屋をテーマにした漫才の中で「マグロ」が頻繁に登場します。

例えば、以下のような発言があります。
*   「マグロ おっぱく お寿司にぎるには こうしてやるのさ」 [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (10:07)](https://youtu.be/wrc2UCrZfdY?t=607)
*   「マグロとれたら1分くらいに 注文したらちゃうねん」 [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (01:30)](https://youtu.be/wrc2UCrZfdY?t=90)
*   「マグマグマグマグルちゃん にぎにぎにぎにぎるくん」 [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (02:18)](https://youtu.be/wrc2UCrZfdY?t=138)
*   「マグロ1丁」 [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (06:58)](https://youtu.be/wrc2UCrZfdY?t=418)

また、「井上が大人の男を目指す新ネタ「朝活」」の動画でも「漬けマグロ」について言及があります。
*   「こちら、オーミの漬けマグロです コーヒーだわんやろ 誰がコーヒーとマグロ食うねん」 [井上が大人の男を目指す新ネタ「朝活」 (02:54)](https://youtu.be/V9WJIZ4Gytk?t=174)
========================================

ちなみにチャンクサイズ1200,オーバーラップ100で試したところ以下のような感じになりました
返答内容的には何かそれっぽい形になったような気もします

[~/sandbox/whi][main] % uv run python ask_agent.py "ノンスタイルの漫才でマグロについて漫才している動画はどれでしょうか?" --chunk-size 1200 --chunk-overlap 100
Question: ノンスタイルの漫才でマグロについて漫才している動画はどれでしょうか?
Extracting search keywords...
Extracted Keywords: ノンスタイル, NON STYLE, 漫才, ネタ, マグロ, 鮪
Searching transcripts (Chunk Size: 1200, Overlap: 100)...
Found 10 matching segment(s).
Generating answer...

========================================
ノンスタイルの漫才でマグロについて漫才している動画は、以下の通りです。

*   **[伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (0:00)](https://youtu.be/wrc2UCZfdY?t=0)**
    *   この動画では、井上が「一人で寿司屋に行けるような大人な男になりたい」と話し、石田が寿司屋の大将を演じます。
    *   石田が「マグマグマグマグルちゃん にぎにぎにぎにぎるくん マグロちゃんを にぎるくんは よなよな布団で」と歌い、井上が「気持ち悪いわ 飯くん前に何ちゅうこと 言ってくれてんの お前冷凍マグロ レンジでチンしたよ」とツッコむ場面があります (0:00頃の発言)。
    *   また、井上が「マグロ1丁」と注文する場面や、石田が「マグロにぎにぎまーち」と歌う場面も複数回登場します (例: [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (2:38)](https://youtu.be/wrc2UCZfdY?t=158) や [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (6:40)](https://youtu.be/wrc2UCZfdY?t=400))。
    *   さらに、ネタの振り返りでは、石田が「マグロへ戻らん レゴブロックでした 何食べさしてんねんもう」と発言しています ([伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (10:15)](https://youtu.be/wrc2UCZfdY?t=615))。

提供された動画データの中には、喫茶店のネタで「オーミの漬けマグロ」に言及する場面もありましたが ([井上が大人の男を目指す新ネタ「朝活」 (2:23)](https://youtu.be/V9WJIZ4Gytk?t=143))、メインでマグロについて漫才しているのは上記の「寿司屋+◯◯」の動画です。
========================================

検索方法の変更

現在の実装としてはキーワード検索になっているので、キーワードが一致しなければ検出されないようになっています

そこで他の検索方法である「ベクトル検索(セマンティック検索)」や「ハイブリッド検索」というものに変えると検出率が上がる可能性がありそうでした

  • ベクトル検索の仕組みについて

    1. 数値化(Embedding): 文字起こししたテキストや、ユーザーの質問を、意味を数値化したリスト(ベクトル)に変換します
    2. 位置の比較:
      意味の近い言葉(例:「寿司」と「お鮨」、「インストール」と「セットアップ」)は、この数値空間上で「非常に近い位置」に配置されます
    3. 計算: 質問のベクトルと最も「位置が近い(コサイン類似度が高い)」チャンクを数式で探し出します。
  • ハイブリッド検索について
    こちらはキーワード検索とベクトル検索を組み合わせて検索する方法になります
    ベクトル検索については固有名詞などの細かい完全一致が苦手という弱点があるので、そこはキーワード検索で補足するという検索方法のようです

ベクトル検索を行うには検索対象のデータをチャンクし、ベクトル化(Embedding)する必要があります
分割したテキストを、Embeddingモデルに入力し単語ごとの意味合いを数値に変換します

数値変換した内容からコサイン類似度などの近似値を比較して関連度が高いものを検出するという流れのように感じました

以下に変更前後での出力を並べました
質問の内容についてもマグロのような特定の名称ではなく海鮮系という抽象的な表現に変更しております

結果としては、変更前では寿司屋しか検出されなかったのに対して、変更後には他のネタについても検出されるようになっていました

類似度的にはフグや蟹も海鮮にあたるので、確かに近似値的には関連している物を検出できるようになっている気がします

[~/sandbox/whi][main] % uv run python ask_agent.py "漫才のネタについて探しています。ネタの内容としては海鮮系の何かについて話していた気がしま す。探してもらえますか??"
Question: 漫才のネタについて探しています。ネタの内容としては海鮮系の何かについて話していた気がします。探してもらえますか??
Extracting search keywords...
Extracted Keywords: 漫才, ネタ, 海鮮, 魚介, シーフード, seafood
Searching transcripts (Chunk Size: 300, Overlap: 50)...
Found 10 matching segment(s).
Generating answer...

========================================
提供された動画データの中に、海鮮系のネタとして「寿司屋に行きたい」というネタがありました。

このネタは「にぎにぎランド」とも関連しており、劇場では頻繁に披露されていましたが、テレビでは一度も放送されなかったと語られています。YouTubeでの公開がこのネタに最適だとされています。

根拠となる発言は以下の通りです。
*   「さぁ今回のネタは寿司屋に行きたいございますが まあこれ歌に関しては はい 散々やりましたよ 歌 うんにぎにぎランドは にぎにぎランドはやりましたか 記憶はこれは残ってるな 確かに劇場で結構やりましたね これに関してはだから 久々にネタ合わせしたけど 残ってたな 劇場では結構やってたわりには テレビでは一切でやらないっていうのがね やっぱね だらだらしてだらだらしてますからね あれでやったんや 一回だけね 音ネタ縛りの漫才版でやったけど やっぱこのネタはね YouTubeがちょうどいいと思うわ YouTubeサイズのネタですね 確かに 自由に離脱してください」
    [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (11:13)](https://youtu.be/wrc2UCrZfdY?t=673)
*   「お寿司にぎるには このメロディーやかんね このメロディーやかん お寿司にぎるには このメロディーやかんね なんでやかんか 俺過去のアーカイブを見てくれ ほら分かるわ このメロディーはやかんね お寿司にぎるには このメロディーでやると シャクが流さる なあ お前過去このメロディーで25分のネタやってんだ なあ お寿司にぎるには こうしてやるのさ お寿司にぎるには こうしてやるのさ 参加必須かいな お寿司にぎるには」
    [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (06:16)](https://youtu.be/wrc2UCrZfdY?t=376)
*   「ニギニギランドがあって ギュギュパークがあって 最後はもう ほんまに歌なんですよね」
    [伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (12:04)](https://youtu.be/wrc2UCrZfdY?t=724)
========================================
[~/sandbox/whi][main] % uv run python ask_agent.py "漫才のネタについて探しています。ネタの内容としては海鮮系の何かについて話していた気がしま す。探してもらえますか??"
Question: 漫才のネタについて探しています。ネタの内容としては海鮮系の何かについて話していた気がします。探してもらえますか??
Searching transcripts using local vector index...
Embedding query: "漫才のネタについて探しています。ネタの内容としては海鮮系の何かについて話していた気がします。探してもらえますか??"...
Loading local embedding model 'intfloat/multilingual-e5-small'...
Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.
Loading weights: 100%|██████████████████████████████████████████████████████████████████████████████████| 199/199 [00:00<00:00, 7931.75it/s]
Found 5 matching segment(s).
  [1] Score: 0.8898 | 伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (11:13)
  [2] Score: 0.8857 | 石田のアドリブ多すぎて井上が困惑「花火デート」 (12:40)
  [3] Score: 0.8840 | 猟奇的なボケを連発「マンション」 (15:50)
  [4] Score: 0.8833 | 井上が大人の男を目指す新ネタ「朝活」 (06:12)
  [5] Score: 0.8827 | 伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (06:16)

Generating answer...

==================================================
提供された動画データの中には、海鮮系の内容に触れている漫才のネタがいくつかありました。

1.  **「寿司屋+◯◯」** というタイトルのネタでは、寿司屋や「にぎにぎランド」、「お寿司逃げるには」といった寿司に関する内容が話されています。
    *   「今回のネタは寿司屋に行きたいございますが まあこれ歌に関しては はい 散々やりましたよ 歌 うんにぎにぎランドは にぎにぎランドはやりましたか 記憶はこれは残ってるな」([伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (11:13)](https://youtu.be/wrc2UCrZfdY?t=673))
    *   「お寿司逃げるには このメロディーやかんね このメロディーやかん お寿司逃げるには このメロディーやかんね なんでやかんか 俺過去のアーカイブを見てくれ ほら分かるわ このメロディーはやかんね お寿司逃げるには このメロディーでやると シャクが流さる」([伝説のネタと伝説のネタがコラボ「寿司屋+◯◯」 (06:16)](https://youtu.be/wrc2UCrZfdY?t=376))

2.  **「花火デート」** というタイトルのネタでは、「フグの毒に当たってから」というセリフがありました。
    *   「長かったあの救命救急のところ フグの毒に当たってから あれはでも本当に歴史に残る名シーンでしたね」([石田のアドリブ多すぎて井上が困惑「花火デート」 (12:40)](https://youtu.be/Rmj1oBOSgiw?t=760))

3.  **「マンション」** というタイトルのネタでは、「蝉とか蟹」という言葉が出てきています。
    *   「その前の蝉とか蟹の方が受けへんねんな そうやねん なんなんやろな」([猟奇的なボケを連発「マンション」 (15:50)](https://youtu.be/fM_9ekItGc?t=950))
==================================================

音声ファイルの事前処理・精度向上

最後に検出データの事前処理と精度向上についてです
記事を書くにあたり初めに考えたのがこちらでした

RAGの精度向上といいつつもそもそも音声データの準備の段階で精度が低く検索対象のキーワードや意味を持つ文が抜けてしまっていては探せるものも探せません
音声ファイルのデータを見返してみると、「マンション」と発音しているところで「マージョン」と聞き取ってしまっています

他の部分でマンションとも聞き取っている部分があるので検索には引っかかるようですが、このような検索対象のデータの精度の低さも結果的にRAGの検索結果の精度を下げていることにつながっています

考えられる精度向上方法については、クラウド上の音声認識API(Google Cloud Speech-to-Text)を使うことを勧められましたがもう少しローカルでチューニングなどできないかを検討することにしました

調べてみると「faster-whisper」にはパラメータがいくつか存在し、そこを調整することでもう少し精度の向上は可能そうでした

- beam_size(デフォルト5):ビームサーチの探索幅、数値が高いほどより正確な言葉の候補を見つけ出します(処理は少し遅くなります)
- patience(デフォルト1):ビームサーチの探索度合い、数値を大きくするとより時間をかけて最適な文章を探します
- word_timestamps=True:単語ごとのタイムスタンプと「確信度(Probability)」を出力し、極端に確信度が低い単語をLLMで補正するための情報として使います

デフォルトのままとパラメータをそれぞれ10にした結果を比較すると、多少ですが精度は向上したように思えました

固有名詞の部分や関西弁であるところが文字起こししきれていなかったりということはあまり変わりませんでしたが、そこは「initial_prompt」というオプションもあるのでそこで調整できる可能性もありそうです

長いので結果は貼りませんが、実行した内容としては「[~/sandbox/whi][main] % uv run python transcribe.py "https://www.youtube.com/watch?v=fM_9ek5ItGc" --model medium --lang ja --prompt "ノンスタイル、NONSTYLE、石田明(いしだあきら)、井上裕介(いのうえゆうすけ)、マンション"」という形で実行しました

どうやってもNONSTYLEとは認識されませんでしたが、人物名は一部固有名詞として認識されるようになりました

{
  "video_id": "",
  "title": "",
  "url": "",
  "duration": 1580,
  "full_text": "【ED】 どうも! アレンジアンです! ちょっとさ、俺今年から来年買おうと思ってるもんか ええ、何?四国? 買えるか? バカなんかお前 違うかな、言うたら ちょっと家を買おうかな ええ、マジで? ええ、どんな家に住み着こうと思う? 妖怪か、お前 何、住み着くって 住むでいいやろ まあ、言ったら都内のさ、高層マージョン おお、高層マージョン 60階建ての 61階 屋上やねん 住めてないから ええ? 60階建ての60階に住みたいの マジか ええ、じゃあさ、もしもそのマージョン買ったとしてさ 今日はさ、俺をちょっと招待してくれや ああ、OK、分かった、いいよ その返事嫌い 何がや? 嫌や 何、嫌やって そこは俺が招待してやって言ったら お前は 答えないに なんで言わなあかんの? の方が楽しいや 楽しくなりや ええ、いいよ 言うたらええんかい? 言って ちょっと 今日はその、お前が買った家に 招待してくれや 答えない ありがとう なんか言えや 恥ずかしいな ありがとう お前ええわ、もう じゃあさ、お前の家の あの、最寄りの駅集合で いや、もうマンションからでええんやけど",
  "segments": [
    {
      "start": 0.0,
      "end": 6.0,
      "text": "【ED】"
    },
    {
      "start": 6.0,
      "end": 7.0,
      "text": "どうも!"
    },
    {
      "start": 7.0,
      "end": 8.0,
      "text": "アレンジアンです!"
    },
    {
      "start": 8.0,
      "end": 11.0,
      "text": "ちょっとさ、俺今年から来年買おうと思ってるもんか"
    },
    {
      "start": 11.0,
      "end": 12.0,
      "text": "ええ、何?四国?"
    },
    {
      "start": 12.0,
      "end": 13.0,
      "text": "買えるか?"
    },
    {
      "start": 14.0,
      "end": 15.0,
      "text": "バカなんかお前"
    },
    {
      "start": 15.0,
      "end": 16.0,
      "text": "違うかな、言うたら"
    },
    {
      "start": 16.0,
      "end": 17.0,
      "text": "ちょっと家を買おうかな"
    },
    {
      "start": 17.0,
      "end": 18.0,
      "text": "ええ、マジで?"
    },
    {
      "start": 18.0,
      "end": 20.0,
      "text": "ええ、どんな家に住み着こうと思う?"
    },
    {
      "start": 20.0,
      "end": 21.0,
      "text": "妖怪か、お前"
    },
    {
      "start": 21.0,
      "end": 22.0,
      "text": "何、住み着くって"
    },
    {
      "start": 22.0,
      "end": 23.0,
      "text": "住むでいいやろ"
    },
    {
      "start": 23.0,
      "end": 25.0,
      "text": "まあ、言ったら都内のさ、高層マージョン"
    },
    {
      "start": 25.0,
      "end": 26.0,
      "text": "おお、高層マージョン"
    },
{
  "video_id": "fM_9ek5ItGc",
  "title": "猟奇的なボケを連発「マンション」",
  "url": "https://www.youtube.com/watch?v=fM_9ek5ItGc",
  "duration": 1580,
  "full_text": "【ED】 【拍手】 どうも! アレンジナイスでーす! ちょっとさ、俺今年から来年買おうと思ってるもんかね えーなに?四国? 買えるか バカなんかお前 違う 違うかな言うたら ちょっと家を買おうかな えーまじでー! どんな家に住み着くおと思って 妖怪かお前 なに住み着くって 住むでいいやろ まあいいたら都内のさ、高層マーション おー高層マーション ",
  "segments": [
    {
      "start": 0.0,
      "end": 5.0,
      "text": "【ED】"
    },
    {
      "start": 5.0,
      "end": 6.0,
      "text": "【拍手】"
    },
    {
      "start": 6.0,
      "end": 7.0,
      "text": "どうも!"
    },
    {
      "start": 7.0,
      "end": 8.0,
      "text": "アレンジナイスでーす!"
    },
    {
      "start": 8.0,
      "end": 11.0,
      "text": "ちょっとさ、俺今年から来年買おうと思ってるもんかね"
    },
    {
      "start": 11.0,
      "end": 12.0,
      "text": "えーなに?四国?"
    },
    {
      "start": 12.0,
      "end": 13.0,
      "text": "買えるか"
    },
    {
      "start": 13.0,
      "end": 14.0,
      "text": "バカなんかお前"
    },
    {
      "start": 14.0,
      "end": 15.0,
      "text": "違う"
    },
    {
      "start": 15.0,
      "end": 16.0,
      "text": "違うかな言うたら"
    },
    {
      "start": 16.0,
      "end": 17.0,
      "text": "ちょっと家を買おうかな"
    },
    {
      "start": 17.0,
      "end": 18.0,
      "text": "えーまじでー!"
    },
    {
      "start": 18.0,
      "end": 20.0,
      "text": "どんな家に住み着くおと思って"
    },
    {
      "start": 20.0,
      "end": 21.0,
      "text": "妖怪かお前"
    },
    {
      "start": 21.0,
      "end": 22.0,
      "text": "なに住み着くって"
    },
    {
      "start": 22.0,
      "end": 23.0,
      "text": "住むでいいやろ"
    },
    {
      "start": 23.0,
      "end": 25.0,
      "text": "まあいいたら都内のさ、高層マーション"
    },
    {
      "start": 25.0,
      "end": 26.0,
      "text": "おー高層マーション"
    },

おわりに

今回はRAGの精度向上について考えるという記事にしましたが、ローカル環境ではなかなか一筋縄にはいかないということを実感しました

ひとまずの課題としては事前にデータを用意する段階での、パラメータチューニングやデータの整形を改善しなければ活用できる段階には程遠そうなので、また少し調べてみようと思います

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?