エンベディング vs テキスト生成モデル
Embedding(エンべディング:埋め込み表現)がわからないので、ChatGPTに色々聞きました。素人が回答を元に文章を組み立てているため、質と精度についてはご容赦ください。
※さらに作成した文章をGoogle AI Studio(Gemini 1.5 Pro)に評価してもらい、コーディングの説明やコサイン類似度、LLM(大規模言語モデル)の説明を加えています。また、タイトルも考えてもらいました。
エンべディングとは?
エンべディングとは、データや情報を特定の形式で数値ベクトルに変換する手法です。テキストの意味を理解する自然言語処理や、画像や音声の特徴を捉える際に役立ちます。
例えば、Webニュースの文章をエンべディングする場合、以下のような役立ち方があります:
テキスト分類:
関連するニュースを特定のカテゴリー(例:経済、政策、マーケット)に分類するために、ニュース記事の内容を数値ベクトルに変換して分類モデルに入力します。
トピック分析:
複数のニュース記事を分析して、関連する主要なトピックやテーマを抽出するために使用できます。エンべディングを使って、似たようなトピックのニュースをグループ化できます。
感情分析:
ニュースがポジティブかネガティブかを判断するために、ニュース記事のテキストをベクトル化して感情分析モデルに入力します。
情報検索と要約:
大量のニュース記事から消関連する情報を効率的に検索したり、要約したりするために、ニュース記事のエンべディングを用いて、関連性の高い情報を抽出します。
文書間の類似度評価:
複数のニュース記事やレポートの間で類似性を評価し、どの記事が他の記事と関連しているかを見つける際に役立ちます。
エンべディングを使うことで、テキストデータを機械学習モデルが処理しやすい形式に変換し、データ分析や予測に役立てることができます。
テキスト全体と文ごとのエンべディング
記事の文章全体を1つのテキストとして一気にエンべディングする場合と、文ごとに分割し、各文を個別にエンべディングする場合に分けて考えます。
ドキュメント全体のエンべディング: ドキュメントレベルでの比較や、全体的なテーマやトピックの類似性を評価したい場合に向いています。たとえば、大量のドキュメントから関連性の高いものを素早く絞り込みたい場合に便利です。
文ごとのエンべディング: テキスト内の特定の情報を探す必要がある場合、特に質問に対して明確な答えを含む文を見つけたい場合に有効です。たとえば、質問に対してドキュメント内の特定の文や段落を返答として提供したい場合などが該当します。
1. ドキュメント全体をエンべディングする場合
# page_text 全体を一つのテキストとしてエンベディング
response = co.embed(texts=[page_text])
page_text_embedding = response.embeddings[0]
概要: page_text 全体を一つのテキストとしてエンべディングします。
出力: page_text 全体を表す1つのベクトルが生成されます。
用途:
ドキュメントレベルの類似性評価: ドキュメント全体の意味を把握し、他のテキストや質問と比較する場合に適しています。
検索システムの概要マッチング: 特定の質問に対して、どのドキュメントが関連性が高いかを大まかに判断する場合に利用できます。
メリット:
処理が比較的シンプルで高速です。
ドキュメント全体の意味を考慮するので、テキスト全体の流れやテーマを反映します。
デメリット:
質問に対して具体的な部分のみを探すには不向きです。
ドキュメント内の細部に対して、過剰に一般化された結果になる可能性があります。
2. 各文をエンべディングする場合
# page_textを文に分割
sentences = page_text.split('. ')
# 各文を個別にエンベディング
sentence_embeddings = co.embed(texts=sentences).embeddings
概要: page_text を文ごとに分割し、各文を個別にエンべディングします。
出力: 各文に対応する複数のベクトルが生成されます。それぞれの文が個別のベクトルとして表現されます。
用途:
文レベルの類似性評価: 特定の質問に対して、ドキュメント内の最も関連性の高い具体的な文を探す場合に適しています。
詳細な検索結果の提示: 質問に対して、ドキュメント内の特定の文や段落をユーザーに提示する場合に有効です。
メリット:
テキスト内の細かい部分まで分析可能で、質問に対する最適な文を見つけることができます。
複数の文から選択できるため、より正確なマッチングが可能です。
デメリット:
計算コストが高くなります(特に長いテキストの場合)。
ドキュメント全体の流れやコンテキストを無視する可能性があります。
CohereのAPIを使いPythonコード
米国消費支出のニュースの例です。
まず、米国消費支出のニュースのテキストをスクレイピングします。
エンべディングにはCohereのAPIを使用しています。
Cohereでは、無料枠でもエンべディングを(制限付きで)利用できます。
import cohere
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import requests
from bs4 import BeautifulSoup
# URLからテキストをスクレイピング
def get_text_from_url(url):
response = requests.get(url)
response.raise_for_status() # HTTP エラーが発生した場合、例外を送出する
soup = BeautifulSoup(response.text, 'html.parser')
# テキストのみを抽出する
text = soup.get_text()
return text
url = 'https://www.bea.gov/news/2024/personal-income-and-outlays-june-2024' # 取得したいURLを指定
page_text = get_text_from_url(url)
# Cohere API キーを設定
api_key = COHERE_API_KEY
co = cohere.Client(api_key)
記事全体を一つのテキストとしてエンべディング
ドキュメント全体を一つのエンべディングで表現すると、テキストの全体的な意味やテーマは捉えられますが、特定の詳細や具体的な情報が失われることがあります。例えば、消費支出に関する特定のデータポイントやトレンドの変化などが埋もれてしまう可能性があります。
例えば、以下の記事全体の概要を示すテキストと、記事全体のテキストとの類似度(コサイン類似度)を計算してみます。
# page_textをエンベディング
response = co.embed(texts=[page_text])
page_text_embedding = response.embeddings[0]
# 類似度を計算するために使うテキスト
doc = "The subject of this article is a report on personal income and spending in the United States for June 2024. The report shows changes in personal income, disposable income, personal consumption expenditures, price indexes, prices, and energy prices compared to the previous month and the same month last year. It also explains what factors contributed to these changes."
# テキストをエンベディング
doc_response = co.embed(texts=[doc])
doc_embedding = doc_response.embeddings[0]
# コサイン類似度を計算
'''
テキスト全体(page_text)と比較用のテキスト(doc)との間の近似度(コサイン類似度)を計算し、その類似度スコアを基に関連性を判断
'''
similarity = cosine_similarity(
[page_text_embedding],
[doc_embedding]
)[0][0]
# 閾値を設定して関連性を評価
threshold = 0.5 # 類似度の閾値
if similarity > threshold:
print("関連する情報が見つかりました:")
#print(page_text) # テキスト全体を出力するので省略
else:
print("関連する情報が見つかりませんでした。")
# 類似度のスコアを表示
print(f"類似度スコア: {similarity:.2f}")
類似度計算結果。
# doc = "The subject of this article is a report on personal income and spending in the United States for June 2024. The report shows changes in personal income, disposable income, personal consumption expenditures, price indexes, prices, and energy prices compared to the previous month and the same month last year. It also explains what factors contributed to these changes."
# 類似度計算結果
連する情報が見つかりました:
類似度スコア: 0.60
次に、具体的な内容を含むテキストと、記事全体のテキストとの類似度を計算してみます。
上述の通り特定の詳細や具体的な情報が失われたためか、低い類似度スコアとなりました。
# doc = "The PCE price index rose by 0.1%, or 0.2% when excluding food and energy costs."
# 類似度計算結果
関連する情報が見つかりませんでした。
類似度スコア: 0.14
記事の各文をエンべディング
ドキュメントを一文ずつエンべディングで表現すると、特定の質問に対して、ドキュメント内の最も関連性の高い具体的な文との類似度を計算します。細かい内容を記載した文章との類似度を向上できます。
# page_textを文に分割
sentences = page_text.split('. ') # 文の区切りとして ". " を使用
# 各文を個別にエンベディング
sentence_embeddings = co.embed(texts=sentences).embeddings
# 類似度を計算するために使うテキスト
doc = "The PCE price index rose by 0.1%, or 0.2% when excluding food and energy costs."
# テキストをエンベディング
doc_response = co.embed(texts=[doc])
doc_embedding = doc_response.embeddings[0]
# 各文とのコサイン類似度を計算
similarities = cosine_similarity(
sentence_embeddings,
[doc_embedding]
).flatten()
# 最も類似度の高い文を取得
most_similar_index = np.argmax(similarities)
most_similar_sentence = sentences[most_similar_index]
# 類似度のスコアを表示
similarity_score = similarities[most_similar_index]
threshold = 0.5 # 閾値を設定
if similarity_score > threshold:
print("関連する情報が見つかりました:")
print(most_similar_sentence)
else:
print("関連する情報が見つかりませんでした。")
print(f"最も関連性が高い文の類似度スコア: {similarity_score:.2f}")
先述の記事全体を1つのテキストとしてエンべディングした場合に低いスコアとなったテキストを使ってみます。
先ほどより高い類似度となりました。
# doc = "The PCE price index rose by 0.1%, or 0.2% when excluding food and energy costs."
# 類似度計算結果
関連する情報が見つかりました:
Excluding food and energy, the PCE price index increased 0.2 percent
最も関連性が高い文の類似度スコア: 0.92
テキスト生成モデル見出しが適したケース
次に、上記の1つのWebニュース記事内容をデータソースとして、「5つの要点を述べてください」という質問を使うケースを考えてみます。
こうした質問の場合、エンべディングを使わずにLLM(大規模言語モデル)を使った「テキスト生成モデル」が適しています。
「テキスト生成モデル」とは、エンベディングを使って類似度検索や関連情報の抽出を行うのではなく、直接LLMを使って文章を生成するという意味です。
エンベディングとテキスト生成モデルの違い
エンベディング: テキストを数値ベクトル(エンベディングベクトル)に変換し、そのベクトルを使って類似度検索やクラスタリングなどを行います。エンベディングは主に、テキスト間の類似性を評価したり、関連性の高い情報を検索するために使用されます。
テキスト生成モデル: LLM(例: GPT-3, GPT-4, Cohereなど)を使って、直接テキストを生成します。これには、入力されたプロンプトに基づいて新しい文章を作成したり、質問に対する回答を生成したりする処理が含まれます。この手法は、エンベディングベクトルを使わず、モデルが持つ文脈理解と生成能力に基づいてテキストを生成します。
まとめ
「テキスト生成モデル」を使うということは、LLMを活用してプロンプトや質問に対して直接的に文章を生成するということを指しています。このプロセスでは、エンベディングベクトルを用いず、モデルの言語生成能力をフルに活用します。
結論
したがって、「5つの要点を述べてください」という質問は、具体的な文脈がない場合、テキスト生成モデルのみを使う手段がより適していると言えます。文脈を明示することで埋め込みベクトルを活用する道も開けますが、文脈が不明瞭な場合にはテキスト生成モデルが有効です。
コーディング例
##### テキスト生成モデルのみが適しているケース
# テキスト生成を使って要点を抽出
def generate_summary_points(text, num_points=5):
prompt = f"以下のテキストに基づいて、{num_points}つの重要な要点を述べてください。\n\n{text}\n\n要点:"
response = co.generate(
model='command-r-plus', # 使用するCohereモデルを指定
prompt=prompt,
max_tokens=300 # 出力の最大トークン数を指定
)
return response.generations[0].text.strip()
# 生成された要点を取得
summary_points = generate_summary_points(page_text)
print("生成された要点:\n", summary_points)
生成結果です。
生成された要点:
1. 2024年6月の個人所得と支出:米経済分析局(BEA)の推計によると、6月の個人所得は504億ドル(月率0.2%)増加しました。
2. 処分可能個人所得(DPI)は377億ドル(0.2%)増加し、個人消費支出(PCE)は576億ドル(0.3%)増加しました。
3. PCE価格指数は0.1%上昇しました。食品とエネルギーを除くと、PCE価格指数は0.2%上昇しました。
4. 実質DPIは0.1%、実質PCEは0.2%増加しました。財は0.2%、サービスは0.2%増加しました。
5. 個人支出は593億ドル増加し、個人貯蓄は7030億ドル、個人貯蓄率は3.4%でした。
付記:コサイン類似度とLLM(大規模言語モデル)の説明
上記の文章をGoogle AI Studio(Gemini 1.5 Pro)に評価してもらい、コサイン類似度とLLMの説明をつけた方がよいと返事をもらいました。
以下、続けてGoogle AI Studioで生成してもらった文章です。
コサイン類似度
コサイン類似度は、2つのベクトル間の角度のコサインを使って、それらのベクトルがどれだけ似ているかを測る指標です。
分かりやすく説明するポイント
ベクトルとは何かを簡単に説明する: ベクトルは、方向と大きさを持つ量です。例えば、矢印で表すことができます。
角度が小さいほど類似度が高いことを説明する: 2つのベクトルが同じ方向を向いている場合、角度は0度になり、コサイン類似度は1になります。逆に、2つのベクトルが反対方向を向いている場合、角度は180度になり、コサイン類似度は-1になります。
具体的な例を挙げる: 例えば、2つの文章をベクトルに変換し、それらのコサイン類似度を計算することで、文章の類似性を評価することができます。
例:
「りんご」と「みかん」をベクトルで表すとします。これらのベクトルは、それぞれの果物の特徴(甘さ、酸味、色など)に基づいて計算されます。もし「りんご」と「みかん」のベクトルが近い方向を向いていれば、コサイン類似度は高くなり、これらの果物は似ていると判断できます。
図解があるとより理解しやすい: 2つのベクトルと角度の関係を図示することで、視覚的に理解を深めることができます。
LLM(大規模言語モデル)
LLM(Large Language Model)は、大量のテキストデータを使って学習した、人間のようなテキストを生成したり理解したりすることができる人工知能モデルです。
分かりやすく説明するポイント
大量のデータで学習していることを強調する: LLMは、インターネット上の膨大なテキストデータを使って学習することで、人間のような言語能力を獲得しています。
人間のようなテキストを生成・理解できることを説明する: LLMは、質問に答えたり、文章を要約したり、物語を作成したりすることができます。
身近な例を挙げる: 例えば、ChatGPTやBardはLLMの一種です。
例:
LLMに「日本の首都は?」と質問すると、「東京です」と答えることができます。また、「犬と猫の違いについて教えてください」と質問すると、犬と猫の特徴を比較した文章を生成することができます。
具体的な用途を説明する: LLMは、文章生成、翻訳、質問応答、チャットボットなど、様々な分野で活用されています。
この記事が気に入ったらサポートをしてみませんか?