# **【AI Agent 客服問答助手】**
openai api 儲值時效快到了,之前不小心儲太多(?)
無聊做來玩玩。工作上做過類似的,這裡請gpt給我點假資料
先設置一些基本問答
ecom_faq_data.py
```=
faq_data = [
{
"question": "如何查詢我的訂單?",
"answer": "您可以登入會員後,點選「我的帳戶」→「訂單查詢」查看訂單詳情。"
},
{
"question": "我可以多久內退貨?",
"answer": "自收到商品起 7 天內皆可辦理退貨,請保持商品完整。"
},
{
"question": "如何使用折價券?",
"answer": "在結帳頁面輸入折價券代碼後,系統將自動折抵金額。"
},
{
"question": "出貨需要幾天?",
"answer": "一般商品會在 1-3 個工作天內出貨,預購商品依照商品頁說明為準。"
},
{
"question": "商品有保固嗎?",
"answer": "視品牌與商品而定,部分商品提供原廠保固,可參考商品頁面說明。"
}
]
```
問答轉成embedding,存到資料庫
```=
import os
import numpy as np
import pandas as pd
import faiss
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.docstore.document import Document
```
設 page_content + metadata,題目答案分開,不會影響到後面相似度判斷
參考 [LangChain : How to create a custom Document Loader](https://python.langchain.com/docs/how_to/document_loader_custom/)
```=
os.environ["OPENAI_API_KEY"] = MY_OPENAI_API_KEY
# 將資料轉成 Document 格式
from ecom_faq_data import faq_data
docs = [Document(page_content=item["question"], metadata={"answer": item["answer"]})
for item in faq_data]
# Embedding model
embedding_model = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embedding_model, normalize_L2=True)
vectorstore.save_local("faq_vectorstore")
```
客戶問題對比資料庫問題,判斷相似度,過低轉接人工客服
```=
# 查詢內容
query = "客服電話"
# 查詢前 3 筆最相似的文件(含相似度)
docs_and_scores = vectorstore.similarity_search_with_score(query, k=3)
# 設定閾值
threshold = 0.65
threshold_min = 0.35
# 取第一筆最高相似度
doc, distance = docs_and_scores[0]
cosine_similarity = 1 - distance
if cosine_similarity >= threshold:
matched_question = doc.page_content
matched_answer = doc.metadata["answer"]
print(f"相似度 : {cosine_similarity:.4f}")
print(f"我的問題 : {query}")
print(f"最接近的資料庫問句:{matched_question}")
print(f"回答:{matched_answer}")
elif threshold_min < cosine_similarity < threshold:
print(f"我的問題 : {query}")
print(f"相似度 : {cosine_similarity:.4f}")
print("我沒找到完全符合的答案,這些是否是您想了解的?")
for i, (doc, dist) in enumerate(docs_and_scores):
sim = 1 - dist
question = doc.page_content
answer = doc.metadata["answer"]
print(f"\n候選答案 {i+1}(相似度: {sim:.4f})")
print(f"問句:{question}")
else:
print(f"我的問題 : {query}")
print(f"相似度 : {cosine_similarity:.4f},幫您轉接人工客服")
```


