# **【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},幫您轉接人工客服") ``` ![截圖 2025-06-08 00.40.43](https://hackmd.io/_uploads/rJ0hjkfmeg.png) ![截圖 2025-06-08 00.41.15](https://hackmd.io/_uploads/ryUTiJfQgg.png) ![截圖 2025-06-08 13.51.41](https://hackmd.io/_uploads/SJIZBozQgx.png)