ステップ4: 読み取ったテキストをEmbeddingにしよう
さて、PDFからテキストを抜き出して、適切な長さに分割することができました。次は、このテキストを数値化して、Embedding(ベクトル)にしましょう。
Embeddingについてもう少し詳しく
Embeddingって最初は意味不明ですよね。私も最初はそうでした。でも、こう考えると分かりやすいです:
コンピュータは文字が読めません。でも数字なら理解できます。だから、文章を数字の列に変換してあげるんです。しかも、ただ適当に数字にするんじゃなくて、意味が似ている文章は似た数字になるように変換するんです。
例えば: - 「犬が走る」→ [0.1, 0.8, -0.3, ...] (1536個の数字) - 「猫が走る」→ [0.2, 0.7, -0.2, ...] (似た数字!) - 「飛行機が飛ぶ」→ [0.9, -0.1, 0.5, ...] (全然違う数字)
これがEmbeddingの魔法です!
OpenAI Embeddings APIを使った実装
今回はOpenAIが提供しているEmbeddings APIを使います。2025年現在、text-embedding-3-smallというモデルが最もコストパフォーマンスが良いです。
from openai import OpenAI
import os
def create_embeddings(texts):
"""
テキストのリストをEmbeddingに変換する関数
texts: Embeddingに変換したいテキストのリスト
返り値: Embedding(数値のリスト)のリスト
"""
# APIキーの確認
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
st.error("⚠️ OpenAI APIキーが設定されていません")
return None
try:
# OpenAIクライアントを初期化
client = OpenAI(api_key=api_key)
# Embeddingを作成
response = client.embeddings.create(
model="text-embedding-3-small", # 使用するモデル
input=texts # 変換したいテキストのリスト
)
# レスポンスからEmbeddingを取り出す
embeddings = []
for item in response.data:
embeddings.append(item.embedding)
return embeddings
except Exception as e:
st.error(f"エラーが発生しました: {e}")
return None
実際に使ってみましょう:
# 例:3つのチャンクをEmbeddingに変換
sample_chunks = [
"トヨタの2023年の売上は...",
"日産の電気自動車戦略は...",
"ホンダの研究開発費は..."
]
embeddings = create_embeddings(sample_chunks)
if embeddings:
st.write(f"✅ {len(embeddings)}個のEmbeddingを作成しました!")
st.write(f"各Embeddingは{len(embeddings[0])}次元のベクトルです")
料金について心配な方もいると思うので、説明しておきますね。2025年9月時点で、text-embedding-3-smallの料金は1000トークンあたり約$0.00002です。つまり、10ページのPDFでも1円程度。ほとんどタダみたいなものです!