到目前為止,我們玩了 聊天、Function Calling,甚至還做了小計算機。
今天要進入新的領域 —— Embeddings。
Embeddings 聽起來很專業,其實可以把它想成:
把一段文字轉換成一組數字向量,讓電腦能「理解」這段文字的意思。
AI 模型平常看不懂文字,它需要用數字來表示語意。
例如:
「貓」對電腦來說是[0.12, -0.85, 0.33, ...]
「狗」[0.10, -0.80, 0.29, ...]
這樣一來:
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])
可以看到一段文字被轉換成一個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))
可以看到,語意相關的句子(蘋果 vs 水果)分數比較高
今天我們認識了 Embeddings,學會文字如何轉換成向量跟如何比較兩段文字的相似度
明天的 Day 12 我們要進一步用 Embeddings 建立一個小小的 FAQ 知識庫,讓 AI 能從裡面找到最相關的答案!