PDFに質問しよう5 ~ 読み取ったテキストをEmbeddingにしよう | SkillhubAI(スキルハブエーアイ)

PDFに質問しよう5 ~ 読み取ったテキストをEmbeddingにしよう

ステップ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円程度。ほとんどタダみたいなものです!