文のトランスフォーマーを使用してプレイリスト生成器を構築する

Using sentence transformers to build a playlist generator.

数時間前に、Sentence TransformersとGradioを使用して構築したプレイリスト生成器を公開しました。それに続いて、プロジェクトを効果的な学習体験として活用する方法について考察しました。しかし、実際にプレイリスト生成器をどのように構築したのでしょうか?この投稿では、そのプロジェクトを解説し、埋め込みの生成方法と多段階のGradioデモの構築方法について説明します。

以前のHugging Faceブログの記事でも探求したように、Sentence Transformers(ST)は文の埋め込みを生成するためのツールを提供するライブラリです。使用できる歌詞のデータセットにアクセスできたため、STの意味的検索機能を活用して与えられたテキストプロンプトからプレイリストを生成することにしました。具体的には、プロンプトから埋め込みを作成し、その埋め込みを事前生成された歌詞の埋め込みセット全体で意味的検索に使用し、関連するソングのセットを生成することでした。これはすべて、Hugging Face Spacesでホストされた新しいBlocks APIを使用したGradioアプリに包括されます。

Gradioのやや高度な使用方法について説明しますので、ライブラリに初めて取り組む方は、この投稿のGradio固有の部分に取り組む前に、Blocksの紹介を読むことをお勧めします。また、歌詞のデータセットは公開しませんが、Hugging Face Hubで歌詞の埋め込みを試すことができます。それでは、始めましょう! 🪂

埋め込みはSentence Transformersの鍵です!以前の記事で埋め込みが何であり、どのように生成するかについて学びましたので、この投稿を続ける前にそれをチェックすることをお勧めします。

Sentence Transformersには、事前学習された埋め込みモデルの大規模なコレクションがあります!独自のトレーニングデータを使用してこれらのモデルを微調整するチュートリアルも用意されていますが、多くのユースケース(歌詞のコーパスを対象とした意味的検索など)では、事前学習されたモデルが問題なく機能します。ただし、利用可能な埋め込みモデルが非常に多いため、どれを使用するかをどのように知ることができるのでしょうか?

STのドキュメントでは、多くの選択肢が強調されており、評価メトリックといくつかの使用ケースの説明も示されています。MS MARCOモデルはBing検索エンジンのクエリでトレーニングされていますが、他のドメインでも優れたパフォーマンスを発揮するため、このプロジェクトではこれらのいずれかを選択することができると判断しました。プレイリスト生成器に必要なのは、いくつかの意味的な類似性を持つ曲を見つけることであり、特定のパフォーマンス指標に達成することにはあまり興味がないため、sentence-transformers/msmarco-MiniLM-L-6-v3を任意に選びました。

STの各モデルには、設定可能な入力シーケンス長があります(最大値まで)。その後、入力は切り捨てられます。私が選んだモデルは最大シーケンス長が512ワードピースであり、これは歌を埋め込むのに十分ではないことがわかりました。幸いなことに、歌詞をモデルが解析できるように小さなチャンクに分割する簡単な方法があります。それは、詩です!歌を詩に分割し、各詩を埋め込んだ後、検索がはるかに優れた結果を示すことになります。

歌は詩に分割され、それぞれの詩は埋め込まれます。

実際に埋め込みを生成するには、Sentence Transformersモデルの.encode()メソッドを呼び出し、文字列のリストを渡すだけです。その後、埋め込みを好きな方法で保存できます。この場合は、pickle形式で保存することにしました。

from sentence_transformers import SentenceTransformer
import pickle

embedder = SentenceTransformer('msmarco-MiniLM-L-6-v3')
verses = [...] # 文字列のリストでデータを読み込む
corpus_embeddings = embedder.encode(verses, show_progress_bar=True)

with open('verse-embeddings.pkl', "wb") as fOut:
    pickle.dump(corpus_embeddings, fOut)

他の人と埋め込みを共有するためには、PickleファイルをHugging Faceのデータセットにアップロードすることもできます。詳しくは、このチュートリアルを読んで学んだり、Datasetsのドキュメントを訪れて自分で試してみてください!簡単に言うと、Hubで新しいデータセットを作成した後、以下に示す「ファイルを追加」ボタンをクリックしてPickleファイルを手動でアップロードするだけです。

Hubに手動でデータセットファイルをアップロードすることができます。

最後に、埋め込みを実際に意味的検索に使用する必要があります!以下のコードは埋め込みをロードし、特定の文字列のために新しい埋め込みを生成し、歌詞の埋め込みを意味的検索して最も近い結果を見つけます。結果を扱いやすくするために、PandasのDataFrameに格納することもよく行います。

from sentence_transformers import util
import pandas as pd

prompt_embedding = embedder.encode(prompt, convert_to_tensor=True)
hits = util.semantic_search(prompt_embedding, corpus_embeddings, top_k=20)
hits = pd.DataFrame(hits[0], columns=['corpus_id', 'score'])
# "corpus_id"は埋め込みの詩のインデックスです
# "corpus_id"を使って元の曲を参照できます

テキストプロンプトに一致する詩を検索するため、同じ曲から複数の詩が見つかる可能性が高いです。重複を削除すると、いくつかの異なる曲しか残らないかもしれません。 util.semantic_searchでフェッチする詩の埋め込みの数をtop_kパラメータで増やすと、見つける曲の数を増やすことができます。実験的にtop_k=20と設定すると、ほとんど常に少なくとも9つの異なる曲が見つかることがわかりました。

マルチステップGradioアプリの作成

デモでは、ユーザーがテキストプロンプトを入力(またはいくつかの例から選択)し、関連性が高いトップ9の曲を検索できるようにしたいと思います。その後、ユーザーは検索結果から選択して歌詞を表示できるようにする必要があります。これにより、なぜ特定の曲が選ばれたのかについての洞察が得られるかもしれません。次に、それをどのように行うかを見てみましょう!

Gradioデモのトップで、アプリが起動するときにHugging Faceデータセットから埋め込み、マッピング、歌詞をロードします。

from sentence_transformers import SentenceTransformer, util
from huggingface_hub import hf_hub_download
import os
import pickle
import pandas as pd

corpus_embeddings = pickle.load(open(hf_hub_download("NimaBoscarino/playlist-generator", repo_type="dataset", filename="verse-embeddings.pkl"), "rb"))
songs = pd.read_csv(hf_hub_download("NimaBoscarino/playlist-generator", repo_type="dataset", filename="songs_new.csv"))
verses = pd.read_csv(hf_hub_download("NimaBoscarino/playlist-generator", repo_type="dataset", filename="verses.csv"))

# 歌詞は私のプライベートデータセットからロードしています
auth_token = os.environ.get("TOKEN_FROM_SECRET") 
lyrics = pd.read_csv(hf_hub_download("NimaBoscarino/playlist-generator-private", repo_type="dataset", filename="lyrics_new.csv", use_auth_token=auth_token))

Gradio Blocks APIを使用すると、マルチステップインタフェースを構築できます。つまり、デモのためにかなり複雑なシーケンスを作成することができます。ここではいくつかのコードスニペットを見てみますが、すべてを実際に動作させるにはプロジェクトのコードを確認してください。このプロジェクトでは、ユーザーがテキストプロンプトを選択した後、セマンティックサーチが完了すると、結果から曲を選択できるようにしたいです。Gradioを使用すると、最初の入力コンポーネントを定義して、ボタン上のclickイベントを登録することで、反復的に構築できます。また、プレイリストの曲の名前を表示するためにRadioコンポーネントも更新されます。

import gradio as gr

song_prompt = gr.TextArea(
    value="Running wild and free",
    placeholder="曲のプロンプトを入力するか、例を選択してください"
)

fetch_songs = gr.Button(value="プレイリストを生成する!")

song_option = gr.Radio()

fetch_songs.click(
    fn=generate_playlist,
    inputs=[song_prompt],
    outputs=[song_option],
)

この方法では、ボタンがクリックされると、GradioはTextAreaの現在の値を取得し、以下の関数に渡します:

def generate_playlist(prompt):
    prompt_embedding = embedder.encode(prompt, convert_to_tensor=True)
    hits = util.semantic_search(prompt_embedding, corpus_embeddings, top_k=20)
    hits = pd.DataFrame(hits[0], columns=['corpus_id', 'score'])
    # ... verse IDから曲名へのマッピングのコード
    song_names = ... # 例:["Thank U, Next", "Freebird", "La Cucaracha"]
    return (
        gr.Radio.update(label="曲", interactive=True, choices=song_names)
    )

その関数では、テキストプロンプトを使用してセマンティックサーチを実行します。上記のように、アプリのGradioコンポーネントに更新をプッシュするためには、関数は.update()メソッドで作成されたコンポーネントを返すだけです。 song_option Radioコンポーネントをfetch_songs.clickoutputパラメータに接続したため、generate_playlistRadioコンポーネントの選択肢を制御できます!

ユーザーが表示する歌詞を選択できるようにするために、Radioコンポーネントに似たことができます。詳細はHugging Face Spacesのコードをご覧ください!

いくつかの考え

Sentence TransformersとGradioは、このようなプロジェクトには素晴らしい選択肢です!STには、埋め込みを素早く生成するために必要なユーティリティ関数や、最小限のコードでセマンティック検索を実行するためのユーティリティ関数があります。事前学習済みモデルの大規模なコレクションにアクセスできることも非常に役立ちます。このようなものについては、自分自身でモデルを作成してトレーニングする必要はありません。Gradioでデモを作成することは、Pythonでコーディングに集中するだけで済むため、非常にシンプルです。また、GradioプロジェクトをHugging Face Spacesにデプロイすることも非常に簡単です!

このプロジェクトに組み込む時間があれば、他にもいくつかのアイデアがあります。将来的に検討するかもしれない次のようなアイデアがあります:

  • Spotifyと統合して自動的にプレイリストを生成し、Spotifyの埋め込みプレーヤーを使用してユーザーがすぐに曲を聴けるようにする。
  • セマンティック検索で見つかった特定の節を特定するために、** HighlightedText** Gradioコンポーネントを使用する。
  • Radamés AjnaのこのSpaceのように、埋め込み空間の可視化を作成する。

歌詞は公開されていませんが、各曲へのマッピングと共にバースの埋め込みを公開しているため、自由に遊んで創造的な作業をしてください!

質問をするためにDiscordに立ち寄り、作業成果を共有してください! Sentence Transformersの埋め込みに何をするか楽しみにしています 🤗

追加リソース

  • Omar Espejelによる埋め込みの始め方
    • Omar SansevieroによるTwitterスレッドとしても
  • Hugging Face + Sentence Transformersドキュメント
  • Gradio Blocksパーティー – Gradio Blocksを使った素晴らしいコミュニティプロジェクトをご覧ください!

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

「Zenの共同創設者兼CTO、イオン・アレクサンドル・セカラ氏によるインタビューシリーズ」

創業者兼CTOであるIon-Alexandru Secaraは、Zen(PostureHealth Inc.)の開発を牽引しており、画期的な姿勢矯正ソフトウェア...

人工知能

「マーシャンの共同創設者であるイータン・ギンスバーグについてのインタビューシリーズ」

エタン・ギンズバーグは、マーシャンの共同創業者であり、すべてのプロンプトを最適なLLMに動的にルーティングするプラットフ...

人工知能

「ElaiのCEO&共同創業者、Vitalii Romanchenkoについてのインタビューシリーズ」

ヴィタリー・ロマンチェンコは、ElaiのCEO兼共同創設者であり、マイク、カメラ、俳優、スタジオの必要なく、個人が一流のビデ...

人工知能

『DeepHowのCEO兼共同創業者、サム・ジェン氏によるインタビューシリーズ』

ディープハウのCEO兼共同創設者であるサム・ジェンは、著名な投資家から支持される急速に進化するスタートアップを率いていま...

人工知能

ムーバブルインクのCEO兼共同創設者であるヴィヴェク・シャルマ氏についてのインタビュー・シリーズ

ビヴェクは2010年にムーバブルインクを共同設立し、急速な成長を遂げながら、600人以上の従業員を擁し、世界有数の革新的なブ...

AIニュース

Q&A:ブラジルの政治、アマゾンの人権、AIについてのGabriela Sá Pessoaの見解

ブラジルの社会正義のジャーナリストは、MIT国際研究センターのフェローです