iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0

到目前為止,我們玩了 聊天Function Calling,甚至還做了小計算機。
今天要進入新的領域 —— Embeddings

Embeddings 聽起來很專業,其實可以把它想成:
把一段文字轉換成一組數字向量,讓電腦能「理解」這段文字的意思。

為什麼需要 Embeddings?

AI 模型平常看不懂文字,它需要用數字來表示語意。
例如:
「貓」對電腦來說是[0.12, -0.85, 0.33, ...]
「狗」[0.10, -0.80, 0.29, ...]

這樣一來:

  • 相似的詞(貓、狗)向量距離會比較近
  • 完全不同的詞(貓、電腦)向量距離會很遠
    所以 Embeddings 很常用在文件搜尋,推薦系統,文字分類

Step 1:基本程式

import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

text = "我喜歡貓咪"

response = client.embeddings.create(
    model="text-embedding-3-small",
    input=text
)

embedding_vector = response.data[0].embedding
print("向量長度:", len(embedding_vector))
print("前 5 個數字:", embedding_vector[:5])

https://ithelp.ithome.com.tw/upload/images/20250925/20169376vwC2ftJazj.png
可以看到一段文字被轉換成一個1536維度的數字陣列

再來我們來比較「相似的句子」和「不相似的句子」

def get_embedding(text):
    return client.embeddings.create(
        model="text-embedding-3-small",
        input=text
    ).data[0].embedding

# 兩句話
t1 = "我喜歡吃蘋果"
t2 = "我喜歡水果"
t3 = "天空中有很多星星"

e1, e2, e3 = get_embedding(t1), get_embedding(t2), get_embedding(t3)

# 計算餘弦相似度
from numpy import dot
from numpy.linalg import norm

def cosine_similarity(a, b):
    return dot(a, b) / (norm(a) * norm(b))

print("蘋果 vs 水果:", cosine_similarity(e1, e2))
print("蘋果 vs 星星:", cosine_similarity(e1, e3))

https://ithelp.ithome.com.tw/upload/images/20250925/20169376rk92ks9wAg.png
可以看到,語意相關的句子(蘋果 vs 水果)分數比較高

今天我們認識了 Embeddings,學會文字如何轉換成向量跟如何比較兩段文字的相似度
明天的 Day 12 我們要進一步用 Embeddings 建立一個小小的 FAQ 知識庫,讓 AI 能從裡面找到最相關的答案!


上一篇
Day 10:數學不會算?用 Function Calling 做小計算機
系列文
AI 三十天,哎呀每天都很難:OpenAI API 生存指南11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言