Pinecone 作為向量資料函式庫,在處理大規模向量資料時展現出優異的效能。然而,在實際應用中,批次更新的效率至關重要。本文除了介紹如何有效管理批次大小和進行批次更新外,更進一步探討如何結合 OpenAI 的嵌入模型和生成模型,構建根據 RAG 的生成式推薦系統,以提升客戶忠誠度和提供個人化推薦服務。此係統涵蓋客戶資料查詢、客製化行銷訊息生成,並著重於效能測試與最佳化,確保系統在實際應用中的效率和穩定性。
Pinecone 是一種強大的向量資料函式庫,能夠高效地儲存和查詢大規模的向量資料。在進行批次更新時,需要注意批次大小的限制,以避免超出 Pinecone 的上限。以下將介紹如何實作批次更新,並提供了一個計算批次大小的函式,以確保更新過程的順暢。
計算批次大小
為了避免超出 Pinecone 的批次大小限制,我們需要計算每個批次的大小。以下是計算批次大小的函式:
import sys
def get_batch_size(data, limit=4000000):
"""
計算批次大小,以確保不超出 Pinecone 的上限。
:param data: 資料列表
:param limit: 大小限制(預設為 4 MB)
:return: 批次大小
"""
total_size = 0
batch_size = 0
for item in data:
item_size = sum([sys.getsizeof(v) for v in item.values()])
if total_size + item_size > limit:
break
total_size += item_size
batch_size += 1
return batch_size
批次更新函式
現在,我們可以建立一個批次更新函式,使用計算出的批次大小:
def batch_upsert(data):
"""
批次更新 Pinecone 資料函式庫。
:param data: 資料列表
"""
total = len(data)
i = 0
while i < total:
batch_size = get_batch_size(data[i:])
batch = data[i:i+batch_size]
index.upsert(vectors=batch)
# time.sleep(1) # Optional: 新增延遲以避免超出率限
i += batch_size
測試和最佳化
為了測試和最佳化批次更新過程,我們可以測量更新所需的時間:
import time
start_time = time.time()
batch_upsert(data)
end_time = time.time()
print(f"更新時間:{end_time - start_time} 秒")
透過這些最佳實踐和函式,你可以高效地更新 Pinecone 資料函式庫,並避免超出批次大小限制。
內容解密:
上述程式碼中,我們定義了兩個函式:get_batch_size
和 batch_upsert
。get_batch_size
函式計算批次大小,以確保不超出 Pinecone 的上限。batch_upsert
函式使用計算出的批次大小進行批次更新。我們還測量了更新所需的時間,以便最佳化更新過程。
圖表翻譯:
flowchart TD A[開始] --> B[計算批次大小] B --> C[批次更新] C --> D[測試和最佳化] D --> E[結束]
此圖表展示了批次更新過程的流程,從計算批次大小到批次更新和測試最佳化。
Pinecone 資料批次上傳
簡介
Pinecone 是一種強大的向量資料函式庫,允許您高效地儲存和查詢大型資料集。在本文中,我們將探討如何使用 Pinecone 上傳資料的批次處理過程。
資料準備
首先,您需要準備好要上傳的資料。這些資料應該是嵌入向量(embedded vectors),通常是由自然語言處理(NLP)模型或其他機器學習演算法生成的。在這個例子中,我們假設您有一個名為 duplicated_chunks
的列表,包含了要上傳的資料。
生成唯一 ID
為了確保每個資料點都有唯一的 ID,我們可以使用以下方法生成 ID:
ids = [str(i) for i in range(1, len(duplicated_chunks) + 1)]
這會生成一個與 duplicated_chunks
列表相同長度的 ID 列表。
準備上傳資料
接下來,我們需要準備上傳資料。這涉及到建立一個包含 ID、嵌入向量和元資料的列表:
data_for_upsert = [
{"id": str(id), "values": emb, "metadata": {"text": chunk}}
for id, (chunk, emb) in zip(ids, zip(duplicated_chunks, embeddings))
]
在這裡,embeddings
是嵌入向量列表,與 duplicated_chunks
列表中的每個元素相對應。
批次上傳
現在,我們可以使用 Pinecone 的批次上傳功能來上傳資料:
batch_upsert(data_for_upsert)
這個函式會將資料分成批次,並逐一上傳到 Pinecone 中。
執行時間測量
為了測量上傳過程的執行時間,我們可以使用以下方法:
start_time = time.time()
batch_upsert(data_for_upsert)
response_time = time.time() - start_time
print(f"Upsertion response time: {response_time:.2f} seconds")
這會顯示上傳過程的執行時間。
Pinecone 索引統計
最後,我們可以檢視 Pinecone 索引的統計資訊,以確認上傳過程是否成功:
print("Index stats")
print(index.describe_index_stats(include_metadata=True))
這會顯示索引的統計資訊,包括維度、索引完整性、名稱空間和向量計數等。
結果
上傳過程的結果應該類別似於以下:
Upserted 316/50000 items...
Upserted 632/50000 items...
Upserted 948/50000 items...
...
Upserted 49612/50000 items...
Upserted 49928/50000 items...
Upserted 50000/50000 items...
Upsert complete.
Upsertion response time: 560.66 seconds
這表明上傳過程已經完成,並且顯示了執行時間。
查詢 Pinecone 索引
現在,我們的任務是驗證大型 Pinecone 索引的回應時間。為了達到這個目的,我們將建立一個函式來查詢向量儲存並顯示結果。
顯示查詢結果
首先,我們定義一個函式 display_results
來列印查詢結果及其相關的後設資料:
def display_results(query_results):
for match in query_results['matches']:
print(f"ID: {match['id']}, Score: {match['score']}")
if 'metadata' in match and 'text' in match['metadata']:
print(f"Text: {match['metadata']['text']}")
else:
print("No metadata available.")
取得嵌入
為了查詢向量儲存,我們需要使用相同的嵌入模型來嵌入查詢文字。這裡,我們定義一個函式 get_embedding
來完成這個任務:
embedding_model = "text-embedding-3-small"
def get_embedding(text, model=embedding_model):
text = text.replace("\n", " ")
response = client.embeddings.create(input=[text], model=model)
embedding = response.data[0].embedding
return embedding
查詢 Pinecone 向量儲存
現在,我們可以使用 get_embedding
函式來查詢 Pinecone 向量儲存,並測試其回應時間。首先,我們初始化 OpenAI 客戶端並記錄開始時間:
import openai
import time
client = openai.OpenAI()
print("Querying vector store")
start_time = time.time() # 記錄查詢開始時間
接下來,我們將實作查詢 Pinecone 索引的邏輯,包括構建查詢、執行查詢、計算回應時間以及顯示結果。
內容解密:
- 初始化 OpenAI 客戶端:我們使用
openai
函式庫初始化一個 OpenAI 客戶端例項。 - 定義嵌入函式:
get_embedding
函式負責將輸入文字嵌入為向量,使用指定的嵌入模型。 - 查詢 Pinecone 索引:使用嵌入的向量查詢 Pinecone 索引,取得匹配結果。
- 顯示結果:使用
display_results
函式列印查詢結果,包括 ID、Score 和相關後設資料。
圖表翻譯:
flowchart TD A[初始化 OpenAI 客戶端] --> B[定義嵌入函式] B --> C[查詢 Pinecone 索引] C --> D[顯示查詢結果] D --> E[計算回應時間]
此流程圖描述了查詢 Pinecone 索引的步驟,從初始化客戶端開始,到顯示查詢結果和計算回應時間。
Pinecone 索引查詢與 RAG 生成式 AI
在本文中,我們將使用 Pinecone 索引查詢和 RAG 生成式 AI 自動化客製化和吸引人的行銷訊息,以鼓勵銀行客戶保持忠誠。首先,我們需要準備好 Pinecone 索引和相關的環境設定。
Pinecone 索引查詢
首先,我們需要查詢 Pinecone 索引以獲得相關的市場段資訊。以下是查詢過程:
query_text = "Customer Robertson CreditScore 632 Age 21 Tenure 2"
query_embedding = get_embedding(query_text, model=embedding_model)
query_results = index.query(vector=query_embedding, top_k=1)
查詢結果如下:
ID: 46366, Score: 0.823366046
Text: CustomerId: 15740160 CreditScore: 616 Age: 31 Tenure: 1 Balance: 1000
查詢時間為 0.74 秒,表明 Pinecone 索引的查詢效率非常高。
RAG 生成式 AI
接下來,我們將使用 RAG 生成式 AI 來生成客製化的行銷訊息。首先,我們需要定義目標向量,代表市場段的特徵。然後,我們將查詢 Pinecone 索引以獲得相關的市場段資訊,並將其用於生成行銷訊息。
target_vector = get_target_vector()
query_results = index.query(vector=target_vector, top_k=1)
user_input = "Generate a marketing message for the target market segment"
response = openai.Completion.create(
model="text-davinci-003",
prompt=user_input,
max_tokens=1024,
temperature=0.7,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
生成的行銷訊息如下:
"Dear valued customer,
We are excited to offer you an exclusive promotion on our latest products and services. As a loyal customer, you deserve the best, and we are committed to providing you with the highest quality products and services.
Please visit our website to learn more about our latest offers and take advantage of this amazing opportunity.
Best regards,
[Your Name]"
結果分析
透過 Pinecone 索引查詢和 RAG 生成式 AI,我們成功地生成了客製化的行銷訊息,針對特定的市場段。查詢時間和生成時間都非常短,表明這個方法非常高效。
圖表翻譯:
以下是 Pinecone 索引查詢和 RAG 生成式 AI 的流程圖:
flowchart TD A[開始] --> B[定義目標向量] B --> C[查詢 Pinecone 索引] C --> D[生成行銷訊息] D --> E[輸出結果]
這個流程圖顯示了我們如何使用 Pinecone 索引查詢和 RAG 生成式 AI 來生成客製化的行銷訊息。
客戶個人資料查詢系統
在本文中,我們將探討如何使用嵌入式查詢系統來查詢客戶個人資料。首先,我們需要定義一個函式 get_embedding
,該函式接收一段文字和一個模型作為輸入,傳回該文字的嵌入式表示。
def get_embedding(text, model=embedding_model):
text = text.replace("\n", " ")
response = client.embeddings.create(input=[text], model=model)
embedding = response.data[0].embedding
return embedding
查詢目標向量
目標向量代表了一個市場細分,行銷團隊希望針對此細分進行推薦,以提高客戶忠誠度。下面,我們定義了一個查詢文字 query_text
,代表了我們要查詢的客戶個人資料。
query_text = "Customer Henderson CreditScore 599 Age 37 Tenure 2 Balance 100000"
query_embedding = get_embedding(text=query_text, model=embedding_model)
執行查詢
現在,我們可以使用 index.query
方法執行查詢,傳入嵌入式表示 query_embedding
、top_k
引數設為 5 以傳回最相似的 5 個結果,以及 include_metadata=True
以包含相關的中繼資料。
query_results = index.query(
vector=query_embedding,
top_k=5,
include_metadata=True,
)
輸出查詢結果
最後,我們列印預出查詢結果和相關中繼資料。
# Print the query results along with metadata
print(query_results)
內容解密:
在這個過程中,我們首先定義了 get_embedding
函式,用於計算輸入文字的嵌入式表示。然後,我們定義了 query_text
,代表了我們要查詢的客戶個人資料,並使用 get_embedding
函式計算其嵌入式表示。接下來,我們使用 index.query
方法執行查詢,傳入嵌入式表示和相關引數,以獲得最相似的結果。最終,我們列印預出查詢結果和中繼資料。
圖表翻譯:
flowchart TD A[輸入查詢文字] --> B[計算嵌入式表示] B --> C[執行查詢] C --> D[獲得查詢結果] D --> E[列印結果和中繼資料]
此圖表描述了整個查詢過程,從輸入查詢文字到列印結果和中繼資料的每一步驟。
自然語言處理與生成模型
自然語言處理(NLP)是一個結合了電腦科學、人工智慧和語言學的領域,旨在使電腦能夠理解、解釋和生成自然語言。近年來,隨著深度學習技術的發展,NLP領域取得了巨大的進步,尤其是在語言模型的研究上。
排名和評分
在進行搜尋或推薦時,排名和評分是非常重要的步驟。透過計算每個結果的相關性評分,可以對結果進行排名,以便使用者快速找到最相關的資訊。以下是排名和評分的示例:
# 定義搜尋結果
query_results = [
{'id': 1, 'score': 0.8, 'metadata': {'text': '這是一個相關的結果'}},
{'id': 2, 'score': 0.6, 'metadata': {'text': '這是另一個相關的結果'}},
#...
]
# 對結果進行排名
ranked_results = sorted(query_results, key=lambda x: x['score'], reverse=True)
# 列印排名結果
for result in ranked_results:
print(f"ID: {result['id']}, Score: {result['score']}")
if 'metadata' in result and 'text' in result['metadata']:
print(f"Text: {result['metadata']['text']}")
else:
print("No metadata available.")
文字提取和合併
在某些情況下,需要從搜尋結果中提取相關文字並合併成一個單一的字串。以下是文字提取和合併的示例:
# 定義搜尋結果
query_results = [
{'id': 1, 'metadata': {'text': '這是一個相關的結果'}},
{'id': 2, 'metadata': {'text': '這是另一個相關的結果'}},
#...
]
# 提取文字並合併成一個單一的字串
relevant_texts = [result['metadata']['text'] for result in query_results]
combined_text = '\n'.join(relevant_texts)
# 列印預合併後的文字
print(combined_text)
增強提示
在生成模型中,增強提示是一種重要的技術,用於提高模型的效能和準確性。以下是增強提示的示例:
# 定義提示和文字
query_prompt = "我有一個客戶銀行記錄,需要生成一封郵件"
query_text = "這是一個相關的文字"
combined_context = "\n".join([query_prompt, query_text])
# 增強提示
itext = combined_context
# 列印增強後的提示
print("Prompt for the Generative AI model:", itext)
生成模型
在這個示例中,我們使用OpenAI的GPT-4模型來生成一封郵件。以下是生成模型的示例:
# 匯入OpenAI函式庫
from openai import OpenAI
# 建立OpenAI客戶端
client = OpenAI()
# 定義生成模型的輸入
input_text = "我有一個客戶銀行記錄,需要生成一封郵件"
# 生成郵件
response = client.generate(input_text, model="gpt-4")
# 列印生成的郵件
print(response)
圖表翻譯:
graph LR A[搜尋結果] --> B[排名和評分] B --> C[文字提取和合併] C --> D[增強提示] D --> E[生成模型] E --> F[生成郵件]
內容解密:
以上程式碼示例展示瞭如何使用自然語言處理和生成模型來生成一封郵件。首先,我們定義了搜尋結果、排名和評分、文字提取和合併、增強提示和生成模型等步驟。然後,我們使用OpenAI的GPT-4模型來生成一封郵件。最終,我們列印預出了生成的郵件。
使用GPT模型進行文字生成和效能測試
引入時間效能測量
import time
start_time = time.time() # 在請求之前啟動計時
在這種情況下,回應時間應該相對恆定,因為我們一次只傳送一個請求。現在,我們開始建立完成請求:
model = "gpt-4"
messages = [
{
"role": "system",
"content": "您是社群經理,可以撰寫引人入勝的內容"
},
{
"role": "user",
"content": itext # itext為我們設計的工程化文字提示
}
]
接下來,我們設定請求的引數:
temperature = 0,
max_tokens = 300,
top_p = 1,
frequency_penalty = 0,
presence_penalty = 0
這些引數旨在獲得低隨機性但仍然“創造性”的輸出:
temperature=0
:回應的隨機性低max_tokens=300
:限制回應長度為300個令牌top_p=1
:考慮所有可能的令牌,以實作全部多樣性frequency_penalty=0
:不懲罰詞彙重複,以允許回應保持開放presence_penalty=0
:不懲罰引入新主題,以允許回應找到新的想法
傳送請求和顯示回應
response = model.generate(messages, temperature, max_tokens, top_p, frequency_penalty, presence_penalty)
print(response)
輸出結果令人滿意,適合此市場段:
主題:在我們的銀行等待您的專屬福利! 親愛的尊貴客戶, 希望這封郵件能讓您一切安好。在我們的銀行,我們始終致力於為您提供最好的服務。根據您的個人檔案,我們已經為您識別出以下幾個機會:
- 個人化財務諮詢:我們的財務顧問團隊隨時準備為您提供專業的建議,以幫助您做出明智的財務決策。
- 專屬獎勵和優惠:作為鑽石卡持卡人,您將享受一系列專屬的獎勵和優惠,讓您的生活更加豐富多彩。
- 增強信用選項:根據您的當前信用評分,我們可以提供更好的信用選項,幫助您實作您的財務目標。
- 免費財務健康檢查:我們瞭解財務健康對您的重要性,因此提供免費的財務健康檢查服務,幫助您評估和改善您的財務狀況。
- 忠誠計劃:參與我們的忠誠計劃,您將有機會贏得更多獎勵和優惠,讓您的忠誠獲得回報。
要探索這些新優勢和更多資訊,請存取以下連結:[連結地址]
圖表翻譯:
flowchart TD A[開始] --> B[傳送請求] B --> C[顯示回應] C --> D[評估回應] D --> E[根據評估結果進行後續動作]
圖表描述了從傳送請求到顯示回應並進行評估的過程。每一步驟都對應著一個特定的動作或狀態,從而清晰地展示了整個流程。
個人化推薦系統的實作
在本章中,我們成功地建立了一個根據RAG(Retrieval-Augmented Generation)的生成式推薦系統,利用Pinecone索引和OpenAI模型來減少銀行客戶流失。透過Kaggle資料集,我們展示瞭如何識別和解決客戶不滿意和關閉帳戶的因素。我們的方法涉及三個主要管道。
從商業價值視角來看,構建根據 Pinecone 和 OpenAI 的 RAG 生成式推薦系統,展現了其在提升客戶忠誠度和降低流失率方面的巨大潛力。透過向量資料函式庫技術和深度學習模型的整合,系統能有效地針對個別客戶需求,提供個人化的行銷訊息和產品推薦。深入剖析此係統的三個主要管道:資料處理與索引、向量查詢和相似性搜尋、以及根據上下文的內容生成,可以發現,其核心價值在於將客戶屬性轉化為可操作的商業洞察。然而,系統的效能瓶頸和模型訓練成本仍是需要持續最佳化的挑戰。技術團隊應著重於提升向量搜尋效率和模型推理速度,才能最大化釋放此係統的商業價值。展望未來,隨著向量資料函式庫技術和生成式 AI 的持續發展,預見這套根據 RAG 的個人化推薦系統將成為金融服務業提升客戶體驗和營運效率的關鍵利器。玄貓認為,此技術路線已展現足夠成熟度,適合關注客戶關係管理的企業採用。