概要
前回、上のような記事を作りました
最終ゴールは動画内であるセリフは確実に言ったけれども、どの動画で発言していたかがわからない場合にAIエージェントとのチャット形式のような形で、セリフを教えると動画の候補を持ってくるというところが最終ゴールです
今回の記事ではネクストステップとして、AIが文字起こししたデータから候補を選択できるようにするというところについて学習・実際に試すことができればと思います
本題
今更ですがAIエージェントが質問された後にどのような流れで情報を取得して我々に返却しているか、詳細まで理解したことがなかったので、学習します
AIエージェントの流れ
-
計画立案(Planning)
要求を分解し、実行可能なタスクのリストを作成する段階 -
状況の観察と情報収集(Observation & Data Gathering)
計画に沿って、現状を把握しデータを集める段階 -
推論と意思決定(Reasoning & Decision Making)
収集した情報をもとに、次の行動を判断する中核的な段階 -
行動の実行(Action)
決定した内容を外部環境に対して反映させる段階 -
反省と完了判定(Reflection & Finalization)
一連の動作結果を検証し、要求が満たされたかを判断する段階
おおまかには上記の一連の流れが繰り返されているといった感じらしいです
また、今回やろうとしている文字起こしデータの回答についてはRAGというものが使われているようです
RAGを使った形式だと以下のような流れで要求に答えてくれるようです
-
情報の検索(Retrieval): ユーザーの質問に最も関連する「テキストの断片」を、文字起こしデータの中から探し出す
-
プロンプトの組み立て: 「見つかった情報」と「ユーザーの質問」を合体させて、1つの文章(プロンプト)を作る
-
回答の生成(Generation): AI(LLM)がその文章を読み込み、人間らしい自然な文章で「この動画の、この時間(〇分〇秒)あたりで言っています」と候補を提案する
これまではモデルの知識が更新されないと古い情報で回答されるということがあったと思いますが、RAGを利用することで質問に対して必要であれば、自身が用意した情報を取得しにいくという行為を行うので情報が古いということがなくなります
参考:
RAGをどのように構築するか
RAGというものの理解は少しできた気がします
RAGを構築すれば良いということもわかりましたが、どのようにやるべきかまだわかっていないので次は構築方法について調べていきます
構築の流れとしては文字起こししたデータをベクトルデータのDBに登録していき、AIエージェントがそのベクトルデータのデータベースへ情報を探しにいくようにするという一連の流れのようです
このタイミングで一度、Antiguravity CLIに質問してみると簡易的な構築の流れは以下のような感じという説明が回答されました
### 🛠️ 簡易RAGの設計プラン
このシステムは、以下の3つのステップで動作するPythonスクリプト(例: ask_agent.py )として実装します。
graph TD
A[ユーザーの質問<br>'ゾウの話をしている動画はどれ?'] --> B(1. 質問からキーワードを抽出)
B --> C(2. 保存されたJSONから関連セグメントを検索)
C -->|該当部分をコンテキストとして抽出| D(3. LLMへのプロンプト作成)
D -->|GEMINI_API_KEY等を使用| E(4. LLMエージェントによる回答生成)
E --> F[ユーザーへ回答<br>動画タイトル・タイムスタンプ付きリンクを含む]
#### 1. 検索エンジン(Retriever)
すでに作成した search.py
の検索ロジックを拡張し、質問に関連する発言セグメント(動画タイトル、発言テキスト、タイムスタンプ付きURL)を上位いくつか(Top-
N)抽出します。
#### 2. LLM(Generator)とエージェントの構築
抽出したテキストセグメントを「参考コンテキスト」としてLLMに渡し、回答を生成させます。
LLMには、現在も使用している Gemini API(Google GenAI SDK)を使用するのが最も手軽でおすすめです(無料枠があり、APIキーの取得も容易です)。
ということでそのまま実行計画を立ててもらい、実装してもらいました
出来上がったスクリプトについてはGemini APIキーが必要とのことだったので、別途準備しました
キーとスクリプトの準備ができ、試した例が以下になります
uv run python ask_agent.py "ゾウについて話している動画はどれですか?"
Question: ゾウについて話している動画はどれですか?
Extracting search keywords...
Extracted Keywords: ゾウ, elephant, 鼻
Searching transcripts...
Found 1 matching segment(s).
Generating answer...
========================================
ゾウについて話している動画は、[Me at the zoo (0:00)](https://youtu.be/jNQXAC9IVRw?t=0) です。この動画では「Alright, so here we are one of the elephant's cool thing...」と発言されています。
========================================
まあ、サンプル通りなので可もなく不可もなくといった感じです
次に他の動画でのセリフについて数パターン試しに調べてみます
参考にしたのは愛してやまないNONSTYLEのネタであるマンションという動画を使わせてもらいました
[~/sandbox/whi][main] % uv run python ask_agent.py "9,800円と発言している動画はどれですか?"
Question: 9,800円と発言している動画はどれですか?
Extracting search keywords...
Extracted Keywords: 9, 800円, 9, 800 yen
Searching transcripts...
Found 3 matching segment(s).
Generating answer...
========================================
「9,800円」と発言している動画は以下の通りです。
* [猟奇的なボケを連発「マンション」 (3:48)](https://youtu.be/fM_9ek5ItGc?t=228)
* [猟奇的なボケを連発「マンション」 (5:26)](https://youtu.be/fM_9ek5ItGc?t=326)
========================================
[~/sandbox/whi][main] % uv run python ask_agent.py "鰹節について発言している動画はどれですか?"
Question: 鰹節について発言している動画はどれですか?
Extracting search keywords...
Extracted Keywords: 鰹節
Searching transcripts...
Found 0 matching segment(s).
Generating answer...
========================================
申し訳ありません。保存されている動画の文字起こしデータから、ご質問に関連する情報を見つけることができませんでした。
========================================
[~/sandbox/whi][main] % uv run python ask_agent.py "かつおぶしについて発言している動画はどれですか?"
Question: かつおぶしについて発言している動画はどれですか?
Extracting search keywords...
Extracted Keywords: かつおぶし, katsuobushi, bonito flakes
Searching transcripts...
Found 0 matching segment(s).
Generating answer...
========================================
申し訳ありません。保存されている動画の文字起こしデータから、ご質問に関連する情報を見つけることができませんでした。
========================================
[~/sandbox/whi][main] % uv run python ask_agent.py "かつお節について発言している動画はどれですか?"
Question: かつお節について発言している動画はどれですか?
Extracting search keywords...
Extracted Keywords: かつお節, カツオ, bonito flakes
Searching transcripts...
Found 4 matching segment(s).
Generating answer...
========================================
かつお節について発言している動画は「猟奇的なボケを連発「マンション」」です。
この動画内でのかつお節に関する発言は以下の通りです。
* 「家にあったありったけのかつお節」 ([猟奇的なボケを連発「マンション」 (02:09)](https://youtu.be/fM_9ek5ItGc?t=129))
* 「うーわカツオブシ臭」 ([猟奇的なボケを連発「マンション」 (08:15)](https://youtu.be/fM_9ek5ItGc?t=495))
* 「お前がカツオブシ渡すからそうなってねえの」 ([猟奇的なボケを連発「マンション」 (08:17)](https://youtu.be/fM_9ek5ItGc?t=497))
* 「ありったけのかつお節入れとこ」 ([猟奇的なボケを連発「マンション」 (10:48)](https://youtu.be/fM_9ek5ItGc?t=648))
========================================
特徴的なキーワードであれば見つけられるものの、検索に使うキーワードと文字起こしファイルに保存しているキーワードが見つけられず、「かつおぶし」に関する結果を得るまでに数回失敗しました
Extracting search keywords...
Extracted Keywords: かつお節, カツオ, bonito flakes
鰹節でも上記のように検索するキーワードを見つけ出せるような拡張性が今後の課題になりそうです
おわりに
今回はRAGについてどういうものか、実際にやってみるという内容でした
大まかな流れは理解できたものの、まだまだ奥が深い分野ではあると思うので今後も継続して自分の中で活用できる物になるまで昇華させられればと思います