46.6kデモを予約するログイン無料で始める

類似検索を利用する - ミートアップのコンテンツをインターネットで失わない方法

Mar 19, 20241 min read

Meetupで共有した素晴らしいアイデアを思い出しても、過去のイベントの迷路に迷い込んでしまい、挫折した経験はないだろうか。オーガナイザーとして、また参加者として、私はイベントが終了した後、貴重なコンテンツが隙間から抜け落ちていくのを感じたことがある。世界の片隅で共有された洞察がサイロ化されたまま、他の場所で利益を得ることができる人々がアクセスできないことがあまりにも多い。

この問題に取り組むため、私は膨大な数の非構造化データをふるいにかける類似検索技術に目をつけた。非構造化データは世界のデータの80%を占め、さまざまな機械学習モデルを用いてベクトルに変換することができる。このタスクのために私が選んだツールはMilvusである。Milvusは人気のあるオープンソースのベクトル・データベースで、複雑なデータ・ランドスケープの管理と検索に優れている。Milvusを使えば、根底にあるつながりや類似性を発見することができる。

Embeddings](https://zilliz.com/glossary/vector-embeddings)を計算するために、私はSentenceTransformersを使っている。SentenceTransformers]()はPythonのフレームワークで、最先端の文、テキスト、画像の埋め込みを実現する。このフレームワークを使うと、100以上の言語の文/テキスト埋め込みを計算することができます。これらの埋め込みは、例えばcosine similarityを使って比較し、似た意味を持つ文を見つけることができます。

データのダウンロード

Meetup.comは無料のパブリックAPIを持っていません。アクセスするにはProアカウントが必要で、自分でここで確認できる。

APIが公開されていないため、私が運営するMeetupグループからいくつかのデータを作成した。GitHub上のシンプルなデータ](https://github.com/stephen37/similarity_search_mlops/blob/abc1d91878320911f069fcb8a2949b0d7d592370/data/data_meetup.csv)を見つけ、Pandasで読み込むことができる。

import pandas as pd
df = pd.read_csv('data/data_meetup.csv')

技術スタックMilvusとSentenceTransformers

ベクターデータベース](https://zilliz.com/learn/what-is-vector-database)にMilvus、テキスト埋め込み生成にSentenceTransformers、Meetupのエッセンス要約にOpenAI GPT 3.5-turboを使います。通常、イベントの説明にはノイズが多いので、要約することはその助けになる。

ミルバスライト

Milvusは様々なニーズに合わせて異なる導入オプションを提供しています。軽量で簡単なセットアップにはMilvus Liteが理想的です。PyPiの pip install Milvus を使って簡単にインストールでき、Jupyterノートブックで直接実行することができます。

Docker/DockerコンポーズとMilvus

より堅牢なニーズに対しては、Milvusは分散システムであるため、Docker Composeを使用してデプロイすることができます。 Docker ComposeファイルはMilvus StandaloneのインストールページおよびMilvus GitHubにあります。Docker ComposeでMilvusを起動すると、3つのコンテナが表示され、デフォルトではポート19530からMilvusに接続されます。

センテンストランスフォーマー

SentenceTransfomersはエンベッディングを作成するために使用され、PyPiから pip install sentence-transformers でインストールできる。all-MiniLM-L6-v2`というモデルを使用する。

類似検索クエリの実行

ミルバス開始

類似検索の実行にはVector Databaseが必要である。これを起動するには、 default_server をインポートして start() 関数を呼び出すだけでよい。

from milvus import default_server
default_server.start()

データをMilvusに取り込む

Milvusにデータを追加する前に、コレクションを作成し、スキーマを準備する必要がある。 まず、フィールドスキーマ、コレクションスキーマ、コレクション名などの必要なパラメータを準備する。

from pymilvus import FieldSchema, CollectionSchema, DataType, Collection

# タイトル、日付、内容、埋め込み内容のフォーマットでオブジェクトを挿入する。
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True)、
    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=500)、
    FieldSchema(name="日付", dtype=DataType.VARCHAR, max_length=100)、
    FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=10000)、
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384)
]
schema = CollectionSchema(fields=fields)
コレクション = コレクション(name="mlops_meetups", schema=schema)

コレクションとスキーマが作成されたので、embeddingフィールドのインデックスを作成し、load()関数でデータをメモリにロードします。

collection.create_index(フィールド名="embedding")
コレクション.load()

SentenceTransformerでエンベッディングを作成する

前述の通り、SentenceTransformerとモデル'all-MiniLM-L6-v2'を使って埋め込みデータを作成します。そのために必要なものをインポートしましょう。

from sentence_transformers import SentenceTransformer

transformer = SentenceTransformer('all-MiniLM-L6-v2')
content_detail = df['content'].
content_detail = content_detail.tolist()
embeddings = [transformer.encode(c) for c in content_detail].

# Dataframeに埋め込みカラムを作成する
df['embedding'] = embeddings

# コレクションにデータを挿入
collection.insert(data=df)

ミートアップの内容を要約する

Meetupの説明文は有益である一方、かなり騒々しいこともあります。通常、スケジュール情報、誰がイベントのスポンサーなのか、会場やイベントに関するさまざまなルールなどが書かれています。これらはMeetupに参加する際にはとても重要ですが、私たちのユースケースでは重要ではありません。OpenAI GPT-3.5-turboを使って内容を要約しています。

def summarise_meetup_content(content: str) -> str:
    response = openai.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {
          "role":"system"、
          "content":"提供されるコンテンツを要約する。"
        },
        {
          "role":"ユーザー"、
          "content": f"{コンテンツ}"
        }
    ],
        temperature=0、
        max_tokens=1024、
        top_p=1、
        frequency_penalty=0、
        presence_penalty=0
    )
    要約 = response.choices[0].message.content
    要約を返す

類似コンテンツを返す

類似検索を機能させるためには、ベクター・データベースが検索語を理解できるようにする必要がある。

search_terms = "講演者はオープンソースとMLプラットフォームについて話す"
search_data = [transformer.encode(search_terms)] # リストでなければならない。

Milvusコレクションから類似コンテンツを検索する

res = collection.search(
    data=search_data, # 埋め込み検索値
    anns_field="embedding", # エンベッディングを横断して検索する
    param={"metric_type":"IP"}、
    limit = 3, # 1回の検索で得られる結果をtop_k件に制限する
    output_fields=["title", "content"] # 結果にタイトルフィールドを含める
)
for hits_i, hits in enumerate(res):
    print("Search Terms:", search_terms)
    print("検索結果:")
    for hit in hits:
        content_test = hit.entity.get("コンテンツ")
        print(hit.entity.get("title"), "----", hit.distance)
        print(f'{summarise_meetup_content(hit.entity.get("content"))}.\n')

結果

Milvusは、MLOps.communityとNeptune.aiが主催するオープンソースとMLプラットフォームに関する3つのミートアップを返しました。

詳細は以下の通り:

検索キーワードオープンソースとMLプラットフォームについて語る

結果

第1回MLOps.community ベルリン・ミートアップ ---- 0.5537542700767517
6月30日にベルリンで開催されるMLOps.community Meetupは、WoltのStephen Batifol氏によるメイントーク「Scaling Open-Source Machine Learning」を予定している。また、ライトニングトーク、ネットワーキング、フード&ドリンクも予定されている。アジェンダは、6:00pmの開場、7:00pmのStephenの講演、7:50pmのライトニングトーク、8:15pmの交流会です。参加者はMeetup.comでライトニングトークに申し込むことができる。このイベントは<a href="https://neptune.ai/>neptune.ai</a>とのコラボレーションです。

MLOps.community Berlin 04:プレイベント Women+ In Data and AI Festival ---- 0.4623506963253021
MLOps.communityベルリンは、6月29日と30日にThoughtworksで特別版のイベントを開催する。このイベントはWomen+ In Data and AIフェスティバルのウォームアップです。ミートアップでは、監視資本主義について語るFiona Coathと、機械学習のカーボンフットプリントについて語るMagdalena Steniusがスピーカーとして登場する。アジェンダには、講演、ライトニングトーク、ネットワーキングの機会が含まれる。参加者は、包括的で尊重された環境のために、イベントの行動規範を確認し、遵守することが推奨されます。

MLOps.community ベルリン ミートアップ 02 ---- 0.41342616081237793
10月6日にベルリンで開催されるMLOps.community Meetupでは、Lina WeichbrodtによるMLモニタリングに関するメイントーク、ライトニングトーク、ネットワーキングの機会が提供されます。イベントはWoltのオフィスで開催され、定員は150名です。リナはスケーラブルな機械学習モデルの開発で豊富な経験を持ち、ZalandoやDKBなどの企業で働いた経験があります。アジェンダには、食事、ボンディング・アクティビティ、メイン・トーク、ライトニング・トーク、交流会などが含まれる。参加者は、MLOps関連の様々なトピックに関するライトニングトークにサインアップすることもできる。このイベントはneptune.aiとのコラボレーションによるものだ。

Github](https://github.com/stephen37/similarity_search_mlops/)にあるコードを自由にチェックしてほしい。

Updated on Jul 09, 2026