我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。
回顧目前有的素材:
為了進行兩個 Embedding 的相似度計算,我們先撰寫一函數來處理此事宜:
def strings_ranked_by_relatedness(query: str,
df: pd.DataFrame,
relatedness_fn = lambda x, y: 1 - spatial.distance.cosine(x, y),
top_n: int = 100) -> tuple[list[str], list[float]]:
接著我們的 Query 也需要匯入相同的 Embedding Model:
client = OpenAI()
query_embedding_response = client.embeddings.create(model = EMBEDDING_MODEL,
input = query)
query_embedding = query_embedding_response.data[0].embedding
同時資料庫中的資料也需要經過 Embedding Model,並逐一計算相似度:
strings_and_relatednesses = [(row["text"], relatedness_fn(query_embedding, row["embedding"])) for i, row in df.iterrows()]
再進行相似度排序,並擷取前 n 筆資料:
strings_and_relatednesses.sort(key = lambda x: x[1], reverse = True)
strings, relatednesses = zip(*strings_and_relatednesses)
return strings[:top_n], relatednesses[:top_n]
整體程式拼湊起來為: