大規模言語モデルとベクトルデータベースに基づくニュース推奨システムの開発

大規模言語モデルとベクトルデータベースに基づくニュース推奨システムの開発

翻訳者|朱 仙中

レビュー | Chonglou

近年 ChatGPTやBardなどの生成AIツールリリースにより大規模言語モデル(LLM)は機械学習コミュニティで世界的に激しい議論を巻き起こしています。これらのソリューションの背後にある中心的なアイデアの 1 つは、テキストや画像などの非構造化データの数値表現を計算し、これらの表現間の類似点を見つけることです。

ただし、これらすべての概念を本番環境に適用すると、独自の機械学習エンジニアリングの課題が生じます

  • これらの表現をどうやって素早く生成できるのでしょうか?
  • どうすれば適切なデータベースに保存できるでしょうか?
  • 実稼働環境の類似性を素早く計算するにはどうすればよいでしょうか?この記事では、これらの問題を解決することを目的とした2 つのオープン ソース ソリューションを紹介します
  • Sentence Transformer (https://www.sbert.net/ ; 引用1 ) : テキストベースの埋め込み生成技術。
  • Qdrant (https://qdrant.tech/) :埋め込みを保存し、シンプルなクエリ インターフェイスを提供できるベクターデータベース両方のツールは、本論文のニュースポータル推奨システムの開発に使用されます参考文献2 ニュースポータル推奨データセットであるNPR (News Portal Recommendation) (Kaggleネットワーク公開されており、無料で使用できます: https://www.kaggle.com/datasets/joelpl/news-portal-recommendations-npr-by-globo ) は、推奨アルゴリズムの開発において学術コミュニティをサポートすることを目的としています。この記事を読み終える頃には以下の方法がわかるようになります:
  • センテンストランスフォーマーを使用したニュース埋め込みの生成
  • Qdrantデータベースを使用して埋め込みを保存する
  • ニュース記事を推奨するためのクエリ埋め込みこの記事のすべてのコードはGithub のWeb サイト入手できることに注意してください

1. 文変換子を使用して埋め込みを生成する

まず、入力データをベクトルに変換する方法を見つける必要があります。これを埋め込みと呼びます (埋め込みの概念について詳しく知りたい場合は、 Boykis の記事「埋め込みとは何か? 」、参考文献3 : https://vickiboykis.com/what_are_embeddings/about.html読むことをお勧めします)。

まず NPR データセットを使用してどのようなデータを処理できるかを見てみましょう。

 import pandas as pd df = pd.read_parquet("articles.parquet") df.tail()

NPRデータセットから提供されたサンプルデータ(画像は著者が生成)

NPRデータセットは、記事のタイトルや本文などの興味深いテキスト データを提供します。以下に示すように、埋め込み生成中にこれらを使用できます。

埋め込み生成プロセス(画像は著者提供)

したがって、入力データからテキスト機能を定義したら、数値表現を生成するための埋め込みモデルを構築する必要があります。幸いなことに、 HuggingFaceのようなサイトがあり、特定の言語やタスク向けに事前トレーニングされたモデルを探すことができます。私たちの場合、ブラジル系ポルトガル語でトレーニングされたneuralmind/bert-base-portuguese-casedモデルを次のタスクに使用できます。

  • 名前付きエンティティ認識
  • 文章テキストの類似性
  • テキスト含意の識別次の実装コードは、埋め込み生成プロセスをどのように変換する示しています
 from sentence_transformers import SentenceTransformer model_name = "neuralmind/bert-base-portuguese-cased" encoder = SentenceTransformer(model_name_or_path=model_name) title = """ Paraguaios vão às urnas neste domingo (30) para escolher novo presidente """ sentence = title sentence_embedding = encoder.encode(sentence) print (sentence_embedding) # output: np.array([-0.2875876, 0.0356041, 0.31462672, 0.06252239, ...])

ここでのコード ロジックによればサンプル入力データが与えられると、タイトルとラベルの内容を 1 つのテキストに連結、それをエンコーダーに渡してテキスト埋め込みを生成できます。
上記と同じプロセスNPR データセット内の他のすべての記事適用できます。

 def generate_item_sentence(item: pd.Series, text_columns=["title"]) -> str: return ' '.join([item[column] for column in text_columns]) df["sentence"] = df.apply(generate_item_sentence, axis=1) df["sentence_embedding"] = df["sentence"].apply(encoder.encode)

注意:上記のプロセスはマシンの処理能力に応じて時間がかかる場合があります。

すべてのニュース記事の埋め込みが完了したら、次に、それらを保存するための戦略を定義できます

2. ストレージの埋め込み

埋め込みの生成はコストのかかるプロセスになる可能性があるためベクターデータベースを使用してこれら埋め込みを保存し、さまざまな戦略に基づいてクエリを実行することができます

このタスクを実行できるベクターデータベース ソフトウェアはいくつかありますが、この記事では、 Python、Go、Typescript などのいくつかの一般的なプログラミング言語の APIサポートを提供するオープン ソース ソリューションである Qdrant を使用することにします。これらのベクターデータベースをより詳細に比較するには、引用文献4 を参照してください

Qdrant セットアップの準備

すべての Qdrant 操作を処理するには、ベクター データベースを指すクライアント オブジェクトを作成する必要があります。 Qdrant では、データベースへのリモート接続をテストするための無料レベルのサービスを作成できますが、簡単にするために、データベースをローカルに作成して永続化することを選択しました

 from qdrant_client import QdrantClient client = QdrantClient(path="./qdrant_data")

この接続が確立されると、ニュース記事の埋め込みを保存するためのコレクションをデータベースに作成できます。

 from qdrant_client import models from qdrant_client.http.models import Distance, VectorParams client.create_collection( collection_name = "news-articles", vectors_config = models.VectorParams( size = encoder.get_sentence_embedding_dimension(), distance = models.Distance.COSINE, ), ) print (client.get_collections()) # output: CollectionsResponse(collectinotallow=[CollectionDescription(name='news-articles')])

コード内のベクトル構成パラメータはコレクションの作成に使用されることに注意してくださいこれらのパラメーターは、ベクトルのサイズや、ベクトルを比較するときに使用する距離メトリックなど、ベクトルのいくつかの特性を Qdrant に伝えます(ここではコサイン類似度を使用します内積やユークリッド距離など計算戦略を使用することもできます)。

ベクトルポイントを生成する

最終的にデータベースに保存する前に、適切なアップロード オブジェクトを作成する必要があります。 Qdrantデータベースでは PointStruct クラスを使用してベクトルを保存できます。このクラスでは、次のプロパティを定義できます。

  • id:ベクターのID (NPRの場合はnewsId)
  • ベクトル:ベクトルを表す 1 次元配列(埋め込みモデルによって生成)
  • ペイロード: コレクション内のベクターを照会するために後で使用できるその他の関連メタデータを含む辞書 (NPR の場合は、記事のタイトル、本文、タグ)
 from qdrant_client.http.models import PointStruct metadata_columns = df.drop(["newsId", "sentence", "sentence_embedding"], axis=1).columns def create_vector_point(item:pd.Series) -> PointStruct: """Turn vectors into PointStruct""" return PointStruct( id = item["newsId"], vector = item["sentence_embedding"].tolist(), payload = { field: item[field] for field in metadata_columns if (str(item[field]) not in ['None', 'nan']) } ) points = df.apply(create_vector_point, axis=1).tolist()

ベクターをアップロード

最後に、すべての情報をポイント構造変換した後、それらをチャンク単位でデータベースにアップロードできます

 CHUNK_SIZE = 500 n_chunks = np.ceil(len(points)/CHUNK_SIZE) for i, points_chunk in enumerate(np.array_split(points, n_chunks)): client.upsert( collection_name="news-articles", wait=True, points=points_chunk.tolist() )

3. クエリベクトル

ベクターコレクション入ったのでデータベースのクエリを開始できますデータベースを照会するために情報を入力する方法は多数ありますが、次の2 つが非常に便利だと思います。

  • テキストを入力
  • 入力ベクトルID

3.1 入力ベクトルを使用してベクトルを照会する

上記の検索エンジン用のベクトルデータベースを正常に構築できたと仮定すると、ユーザーの入力を入力テキストにして、最も関連性の高いコンテンツを返す必要があります

ベクトルデータベース内のすべての操作はベクトルを使用して実装されているため、まずユーザーの入力テキストをベクトルに変換して、入力に基づいて類似のコンテンツを見つける必要がありますテキストデータを埋め込みにエンコードするために文変換器を使用したことを思い出してくださいしたがって同じエンコーダーを使用して、ユーザーの入力テキストの数値表現を生成することできます

NPR にはニュース記事が含まれているので、ユーザーが米国の選挙について知るために「ドナルド・トランプと入力すると仮定します

 query_text = "Donald Trump" query_vector = encoder.encode(query_text).tolist() print (query_vector) # output: [-0.048, -0.120, 0.695, ...]

入力クエリ ベクトルが計算されると、コレクション内で最も近いベクトルを検索し、newsId、タイトル、件名など、これらのベクトルからどのような出力を得たいかを定義できます。

 from qdrant_client.models import Filter from qdrant_client.http import models client.search( collection_name="news-articles", query_vector=query_vector, with_payload=["newsId", "title", "topics"], query_filter=None )

注: デフォルトでは、Qdrant は近似最近傍アルゴリズムを使用して埋め込みをすばやくスキャンします完全スキャンを実行して正確な最近傍データを取り込むこともできます。ただし、これはよりコストのかかる操作であることに注意してください。

上記を実行する、次の出力ヘッダーが生成されます (理解しやすいように英語翻訳されています)。

  • 入力:ドナルド・トランプ
  • 成果1:パラグアイ人は今週日曜日 30日)に新しい大統領を選ぶために投票に行く。
  • 結果2:有権者はバイデンとトランプは2024年に立候補すべきではないと回答、ロイター/イプソスの世論調査で判明
  • アウトプット3:作家がトランプ氏から1990年代に性的虐待を受けたと告発
  • 出力4:ドナルド・トランプ大統領の元副大統領マイク・ペンス氏が前大統領を複雑にする可能性のある証言を法廷で行っている埋め込みモデルは、トランプ大統領自身に関連するニュースを伝えるだけでなく、大統領選挙に関連するトピックもうまく説明しているようだ。最初の出力では、大統領選挙以外に入力用語「ドナルド トランプ」への直接的な参照がないことに注意してください。
    また、query_filterパラメータを省略しました。出力が特定の条件を満たす必要があることを指定する場合に、これは非常に便利なツールです。たとえば、ニュース ポータルでは、最近の記事 (たとえば、過去 7 日間の記事) のみをフィルターすることが重要になることがよくありますしたがって、最小の公開タイムスタンプを満たすニュース記事をクエリできます。
    : ニュース推奨シナリオでは公平性や多様性など考慮する必要がある側面が複数ありますもちろん、これは議論の余地のあるトピックですこの分野に興味がある場合は NORMalize ワークショップの論文確認することをお勧めします

3.2 入力ベクトルIDを使用してベクトルを照会する

最後に、ベクターデータベースに、特定の望ましいベクターIDに近いが、望ましくないベクターIDからは遠いコンテンツを「推奨」するように要求できます期待される ID と予期しない ID はそれぞれポジティブサンプルとネガティブサンプルと呼ばれ、推奨されるシードサンプルと見なされます

たとえば、次の陽性サンプルID があるとします。

 seed_id = '8bc22460-532c-449b-ad71-28dd86790ca2' # title (translated): 'Learn why Joe Biden launched his bid for re-election this Tuesday'

次に、このサンプル似たものをリクエストます

 client.recommend( collection_name="news-articles", positive=[seed_id], negative=None, with_payload=["newsId", "title", "topics"] )

上記を実行した後、翻訳された出力タイトルは次のようになります。

  • 入力:ジョー・バイデンが今週火曜日再選を目指して出馬した理由を知る
  • 成果1: バイデン氏再選目指すと発表
  • アウトプット2: 米国:バイデン氏が再選目指す4つの理由
  • アウトプット3:有権者はバイデンとトランプは2024年に立候補すべきではないと回答、ロイター/イプソスの世論調査で判明
  • 成果4:選挙後の第2次政権の可能性に疑問を投げかけたバイデン顧問の失言

結論は

この記事では、 LLM とベクトルデータベースを組み合わせてニュース推奨システムを構築する方法を説明します。特に NPRデータセット内のテキストニュース記事から数値表現(埋め込み)を生成するため文変換器の使用について言及されています。これらの埋め込みが計算されると、 Qdrant などのベクトルデータベースにデータを入力するのに使用できるようになります。これは、さまざまな戦略を通じてベクトルクエリを実装するのに非常役立ちます

最後に、この記事提供されている基本的なに基づいて、次のような多くの改善を行うことができます

  • 他の埋め込みモデルのテスト
  • その他の距離測定基準のテスト
  • 他のベクターデータベースのテスト
  • パフォーマンスを向上させるには、 Goなどのコンパイル型プログラミング言語を使用する
  • APIを利用した推奨システムの構築

つまり、 LLM 推奨技術に基づいて機械学習エンジニアリングを改善するためのアイデアは数多く考えられますしたがって、これらの改善についての意見を共有したい場合、遠慮なくメッセージお送りください

私について

私はブラジルのメディアテクノロジー企業、Globoのシニアデータサイエンティストです。会社のレコメンデーション チームで働いている私は、G1、GE、Globoplay などのデジタル製品を通じて何百万人ものユーザーにパーソナライズされたコンテンツを届けるために懸命に働く、素晴らしい才能のあるチームに囲まれています。彼らの不可欠な助けがなければ、この記事を読者の皆さんにお届けすることは不可能だったでしょう

参考文献

[ 1 ] N. reimersとI. Gurevych、「Sentence-BERT:Siamese BERTネットワークを使用した文の埋め込み」(2019年)、計算言語学協会

2 J. Pinho、J. Silva、L. Figueiredo、「NPR:ニュースポータル推奨データセット(2023)」、ACM Conference on Recommender Systems

[ 3 ] V. Boykis、「埋め込みとは何か?」個人ブログ

[ 4 ] M. Ali、「ベクターデータベースのトップ5(2023)」 DataCampブログ

翻訳者紹介

Zhu Xianzhong 氏は、51CTO のコミュニティ エディターであり、51CTO の専門ブロガー兼講師であり、濰坊の大学のコンピューター教師であり、フリーランス プログラミング コミュニティのベテランです。

原題:ニュース推奨のための大規模言語モデルとベクトルデータベース、著者: João Felipe Guedes

<<:  自動生成された小さなデータセットを使用してエンコーディング LLM をトレーニングする方法

>>: 

ブログ    

推薦する

MITのコンピューターの先駆者ジョエル・モーゼス氏が死去! 50年前にコンピューターに微積分を教えた

コンピューターの専門家がまた一人亡くなりました! 著名なコンピューター科学者で、MITのコンピュータ...

プログラマのための基本アルゴリズム: 再帰の説明

[[346111]]序文再帰は非常に重要なアルゴリズムの考え方です。フロントエンド開発者であっても、...

人間や魚を認識するAIは人魚も認識できるのか? Alibaba CVPR 論文における因果推論法の回答

[[399013]]人間と魚の写真で訓練された AI は、初めて人魚の写真を見たときにどのように反応...

大企業に必須の、偉大な神からのオープンソースアルゴリズムツールブック

近年、大企業への入社要件はますます高くなり、アルゴリズムに対する要求も徐々に高まっています。アルゴリ...

CAPとPaxosコンセンサスアルゴリズムについての簡単な説明

CAPとはCAP理論についてはすでに多くの背景情報が語られているので、ここでは詳しくは触れません。ど...

...

3月にGithubで最も人気のあるデータサイエンスと機械学習のプロジェクト

Analytics Vidhya は最近、3 月の GitHub で上位 5 つのデータ サイエンス...

マシンビジョンを超えて、ロボット認識完成計画

人工知能の目標の 1 つは、コンピューターが人間の視覚、聴覚、触覚などの知覚能力をシミュレートし、画...

この敵対的アルゴリズムは顔認識アルゴリズムを失敗させ、WeChatやWeiboの写真圧縮にも抵抗できる。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

誰もが知っておくべき 3 つの機械学習アルゴリズム

解決すべきデータ関連の問題があるとします。機械学習アルゴリズムの素晴らしさについて聞いたことがあるの...

...

これでブリッジで腹筋運動ができるようになりました!中国初の3Dプリント橋が上海で公開

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

ロボットはサービス業界に参入できるのか?事実が教えてくれる

有名なアニメーション会社ディズニーは、近々人工知能とロボット工学の分野に参入すると発表しました。ディ...