Few-shot Prompting によるタイトル分割

はじめに

こんにちは。ソリューション事業部データアーキテクトグループの山田です。
当グループでは、音楽業界に向けたデータソリューションの開発と、レコチョクの各サービスのデータ分析を行っています。
今回は前者の中から、メタデータ整備の自動化に向けたPoCとして、「トラックタイトルの自動分割」を LangChain を用いて Few-shot Prompting で実装した内容を紹介させていただきます。

やりたいこと

端的に言うと、トラックタイトルをタイトルとバージョン情報に分割したいということです。
DDEX規格という音楽業界標準のメタ形式にすることで、様々な音楽配信サービスに配信可能になるという利点があります。気になる方はこちらの記事を読んでみてください。
タイトルには「日本語メタ」「カタカナメタ」「海外メタ」が必要になるので、それぞれを適切に変換する必要があります。現状この作業は手作業で行っているのですが、非常に時間がかかるため自動化することで工数を削減したいです。
ルールベースでもある程度はできるのですが、バージョン情報が〜や括弧に囲まれていたりと一貫性がないので、LLMの力を借りてよしなに分割できないかと考えました。

内容としては、LLMに対して 元のタイトル「タイトルとバージョン情報に分割して」という旨のプロンプト、そして 少数のサンプル の3つを与えることで自動分割してもらうというものです。

今回はChatGPTで作成したダミーデータを使って自動分割を行いました。

実装内容

環境情報

  • MacOS Monterey 12.5
  • Python 3.9.13

事前にChatGPTでダミーの分割サンプルを作成します。
今回は50件のサンプルを用意しました。こちらから Few-shot のサンプルが選択されます。

ダミーデータの作成に使用したプロンプトは下記になります。

次に実装フェーズに入ります。
まずは Few-shot Prompting のテンプレートを作成します。

ExampleSelector は SemanticSimilarityExampleSelector を使用し、事前に準備した分割サンプルの中から、分割したいタイトルと類似度の高いサンプルを3つ取ってくるようにしました。

次にプロンプトをLLMに与えて実行し、結果をパースして返す関数を作成します。
LLMはOpenAIの gpt-4 を使用しました。

成功例

実際に分割した結果が下記です。

想定通りの分割ができています。

分割に使用されたプロンプト全体は下記です。

失敗例

一方でうまく分割できなかったタイトルもありました。

バージョン情報に加えてサブタイトルが含まれてるパターンではうまく分割ができませんでした。
このケースでは「カラオケバージョン」だけを分割してほしかったです。

プロンプト全体は下記です。

Few-shot のサンプルにおいてサブタイトルを含むものはありませんでした。
同じパターンのサンプルがあれば結果は違ったかもしれません。

むすび

今回は Few-shot Prompting によるタイトル分割を実装しました。
100%の精度とはいきませんでしたが、人手の作業の補助にはなるかなという感じでした。

分割サンプルの精査して、多様性を確保したり、ノイズになっているデータを除外すれば、少ないサンプルでもより精度の高い分割ができると思いました。
また、ExampleSelector を自作して、バージョンの表記形式が近いサンプルを取得しやすくすることも有効かと思います。
引き続きチューニングしていきたいと思います。

最後まで読んでいただきありがとうございます。

この記事を書いた人

山田航大
山田航大
データ分析をする人