iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0
佛心分享-IT 人自學之術

學習 LLM系列 第 16

Day16 安裝並測試向量 DB

  • 分享至 

  • xImage
  •  

i> 安裝 :

!pip install -q sentence-transformers faiss-cpu chromadb

ii> 準備資料 : 先讀取 CSV 並把問題或答案載入變成 list

# 讀檔 & 產生 embeddings(Colab)
import os
import pandas as pd
from sentence_transformers import SentenceTransformer
import numpy as np
# 讀入 CSV
df = pd.read_csv("faqs.csv", encoding="utf-8-sig")
print("FAQ 筆數:", len(df))
print(df.head())


# 選要 embed 的欄位(通常用 question 或 question+answer)
texts = df["question"].astype(str).tolist()


# 載入 sentence-transformers model
model_name = "paraphrase-multilingual-MiniLM-L12-v2"  # 小且支援中文
embedder = SentenceTransformer(model_name)


# 產生 embeddings(轉成 numpy float32)
embeddings = embedder.encode(texts, convert_to_numpy=True, show_progress_bar=True)
embeddings = embeddings.astype("float32")
print("embeddings shape:", embeddings.shape)

https://ithelp.ithome.com.tw/upload/images/20250930/201691731lo7LVXN1M.png
iii> FAISS (提供高效算法來快速搜索和聚類嵌入向量的庫):建立索引、查詢、儲存/讀取

import faiss


# 取得 embedding 維度
d = embeddings.shape[1]


# 1) L2 normalize(必要:使 inner-product 等同 cosine)
faiss.normalize_L2(embeddings)


# 建立 Index(這裡用 L2 距離,可以換 inner product / cosine)
index = faiss.IndexFlatL2(d)




# 加入向量
index.add(embeddings)


print("FAISS 資料庫筆數:", index.ntotal)


# 3) 一個 query 的測試
def faiss_search(query_text, k=3):
    q_emb = embedder.encode([query_text], convert_to_numpy=True).astype("float32")
    faiss.normalize_L2(q_emb)
    D, I = index.search(q_emb, k)  # D: scores, I: indices
    results = []
    for score, idx in zip(D[0], I[0]):
        results.append({
            "score": float(score),
            "id": df.iloc[idx]["id"],
            "question": df.iloc[idx]["question"],
            "answer": df.iloc[idx]["answer"]
        })
    return results


# 範例查詢
q = "我要退貨要怎麼做?"
print("Query:", q)
for r in faiss_search(q, k=3):
    print(r)


# 4) 儲存 index(及 metadata)
faiss.write_index(index, "faiss_index.bin")
np.save("faq_embeddings.npy", embeddings)
df.to_csv("faqs_with_index.csv", index=False, encoding="utf-8-sig")
print("已儲存 faiss_index.bin / faq_embeddings.npy / faqs_with_index.csv")

結果 :
FAISS 資料庫筆數: 10
Query: 我要退貨要怎麼做?
{'score': 0.37788718938827515, 'id': 'q1', 'question': '如何申請退貨?', 'answer': '請於訂單頁點選退貨申請並上傳商品照片,客服將於 3 個工作天內處理。'}
{'score': 0.883316159248352, 'id': 'q4', 'question': '付款方式有哪些?', 'answer': '我們支援信用卡、LINE Pay 與貨到付款。'}
{'score': 1.202573537826538, 'id': 'q10', 'question': '如何使用優惠券?', 'answer': '在結帳頁面輸入優惠碼,系統會自動折抵。'}
已儲存 faiss_index.bin / faq_embeddings.npy / faqs_with_index.csv


上一篇
Day15 設計 10 條 FAQ
下一篇
Day17 產生句子 Embeddings(sentence-transformers)
系列文
學習 LLM18
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言