隨著資料規模的增長,傳統資料函式庫在處理高維向量資料時的效率逐漸下降。向量資料函式庫因其高效的相似性搜尋能力,成為處理嵌入向量等非結構化資料的首選方案。Pinecone 作為一個雲端向量資料函式庫服務,提供便捷的 API 和可擴充套件的架構,方便開發者快速構建和佈署向量搜尋應用。本文將詳細介紹如何使用 Pinecone 構建向量資料函式庫,並結合 OpenAI 的嵌入模型和 GPT-4o 生成式 AI 模型,實作更進階的應用,例如客製化行銷訊息生成。
大規模向量資料函式庫的構建與擴充套件:以Pinecone為例
在人工智慧與機器學習領域,向量資料函式庫(Vector Database)扮演著至關重要的角色,尤其是在處理大規模嵌入向量(Embedding)資料時。本文將探討如何利用Pinecone構建與擴充套件向量資料函式庫,實作高效的相似性搜尋與資料管理。
資料準備與嵌入向量生成
首先,我們需要準備資料並將其轉換為嵌入向量。在本例中,我們使用OpenAI的嵌入模型將客戶記錄轉換為向量表示。
# 生成嵌入向量
embeddings = []
for chunk in chunks:
embedding = openai.Embedding.create(input=chunk, model="text-embedding-ada-002")
embeddings.append(embedding['data'][0]['embedding'])
內容解密:
這段程式碼負責生成嵌入向量。首先,我們初始化一個空列表embeddings來儲存生成的向量。接著,遍歷每個文字區塊(chunk),利用OpenAI的嵌入模型將其轉換為向量。生成的向量被新增至embeddings列表中。這樣的處理方式使得我們能夠將原始文字資料轉換為機器學習模型可理解的數值表示。
資料擴充套件以模擬大規模場景
為了模擬大規模資料場景,我們需要擴充套件現有的資料集。在本例中,我們將資料集擴充套件五倍,以達到50,000筆資料的規模。
# 定義資料擴充套件函式
def duplicate_data(chunks, embeddings, dsize):
duplicated_chunks = []
duplicated_embeddings = []
for i in range(len(chunks)):
for _ in range(dsize):
duplicated_chunks.append(chunks[i])
duplicated_embeddings.append(embeddings[i])
return duplicated_chunks, duplicated_embeddings
# 擴充套件資料
dsize = 5
duplicated_chunks, duplicated_embeddings = duplicate_data(chunks, embeddings, dsize)
內容解密:
這段程式碼實作了資料擴充套件的功能。首先,我們定義了一個duplicate_data函式,該函式接受原始資料區塊列表chunks、嵌入向量列表embeddings以及擴充套件倍數dsize。函式內部透過雙重迴圈,將每個原始資料區塊和對應的嵌入向量重複dsize次,從而實作資料擴充套件。最後,傳回擴充套件後的資料區塊列表和嵌入向量列表。
Pinecone索引的建立
接下來,我們需要在Pinecone上建立一個新的索引(Index),用於儲存和管理我們的向量資料。
# 初始化Pinecone客戶端
import os
from pinecone import Pinecone, ServerlessSpec
api_key = os.environ.get('PINECONE_API_KEY')
pc = Pinecone(api_key=api_key)
# 定義索引名稱、雲端服務提供商和區域
index_name = 'bank-index-50000'
cloud = 'aws'
region = 'us-east-1'
spec = ServerlessSpec(cloud=cloud, region=region)
# 建立索引
if index_name not in pc.list_indexes().names():
pc.create_index(
index_name,
dimension=1536,
metric='cosine',
spec=spec
)
內容解密:
這段程式碼負責在Pinecone上建立一個新的索引。首先,我們初始化Pinecone客戶端並設定API金鑰。接著,定義索引名稱、雲端服務提供商(本例中使用AWS)和區域。最後,如果索引名稱不存在,則呼叫create_index方法建立新的索引,指定向量維度為1536,相似性度量使用餘弦相似度(cosine)。
向量資料的上傳(Upsert)
建立索引後,我們需要將生成的嵌入向量上傳至Pinecone索引中。
# 定義上傳函式
def upsert_to_pinecone(index, data, batch_size):
for i in range(0, len(data), batch_size):
batch = data[i:i+batch_size]
index.upsert(vectors=batch)
# 準備上傳資料
vectors = [
{'id': str(i), 'values': duplicated_embeddings[i], 'metadata': {'chunk': duplicated_chunks[i]}}
for i in range(len(duplicated_embeddings))
]
# 上傳資料
index = pc.Index(index_name)
batch_size = 100
upsert_to_pinecone(index, vectors, batch_size)
內容解密:
這段程式碼實作了向量資料的上傳。首先,我們定義了一個upsert_to_pinecone函式,該函式接受Pinecone索引物件、待上傳資料列表以及批次大小。函式內部透過迴圈,以批次方式將資料上傳至Pinecone索引中。接著,我們準備了待上傳的向量資料列表,每個向量包含唯一ID、嵌入向量值以及對應的元資料(原始文字區塊)。最後,呼叫upsert_to_pinecone函式將資料上傳至Pinecone索引中。
Pinecone 向量資料函式庫的高效能查詢與 RAG 生成式 AI 應用
在現代化的資料驅動應用中,向量資料函式庫扮演著至關重要的角色。Pinecone 作為一個高效能的向量資料函式庫,能夠支援大規模的相似性搜尋與高效的資料檢索。本文將探討如何使用 Pinecone 進行高效的向量資料管理,以及如何結合 RAG(檢索增強生成)技術與生成式 AI 模型(如 GPT-4o)生成客製化的行銷訊息。
Pipeline 2:擴充套件 Pinecone 索引(向量儲存)
在前面的章節中,我們已經建立了一個 Pinecone 索引並對其進行了基本的向量資料插入操作。在本章節中,我們將進一步擴充套件這個索引,使其能夠處理高達 100 萬條以上的向量資料。
資料準備與向量嵌入
首先,我們需要對資料進行向量嵌入處理。我們選用 text-embedding-3-small 模型來生成向量表示。
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
接下來,我們將資料上傳至 Pinecone 資料函式庫,並進行批次插入操作。
# 準備資料以進行上傳
data_for_upsert = [
{"id": str(id), "values": emb, "metadata": {"text": chunk}}
for id, (chunk, emb) in zip(ids, zip(duplicated_chunks, duplicated_embeddings))
]
# 批次上傳資料
batch_upsert(data_for_upsert)
查詢 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.")
查詢範例
我們使用一個客戶資料作為查詢向量,並查詢最相似的資料。
query_text = "Customer Robertson CreditScore632Age21 Tenure2B"
query_embedding = get_embedding(query_text, model=embedding_model)
query_results = index.query(vector=query_embedding, top_k=1, include_metadata=True)
display_results(query_results)
#### 內容解密:
此查詢範例展示瞭如何使用客戶資料查詢最相似的客戶資訊。query_embedding 是客戶資料的向量表示,index.query 方法用於查詢最相似的向量,並傳回相關的中繼資料。
Pipeline 3:RAG 生成式 AI 應用
在這個章節中,我們將結合 Pinecone 向量資料函式庫與 RAG 生成式 AI 技術,自動生成客製化的行銷訊息。
RAG 與 GPT-4o 結合應用
我們將使用 GPT-4o 模型來生成客製化的行銷訊息。首先,我們需要查詢 Pinecone 索引以取得目標市場的相關資料。
# 查詢 Pinecone 索引
target_vector = get_embedding("目標市場的描述", model=embedding_model)
query_results = index.query(vector=target_vector, top_k=5, include_metadata=True)
#### 內容解密:
這段程式碼展示瞭如何使用目標市場的描述來查詢最相關的客戶資料。查詢結果將用於生成客製化的行銷訊息。
生成行銷訊息
接下來,我們將查詢結果傳遞給 GPT-4o 模型,以生成客製化的行銷訊息。
# 生成行銷訊息
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "根據以下客戶資料生成行銷訊息"},
{"role": "user", "content": str(query_results)}
]
)
print(response.choices[0].message.content)
#### 內容解密:
這段程式碼展示瞭如何使用 GPT-4o 模型生成客製化的行銷訊息。我們將查詢結果作為輸入傳遞給模型,並生成相關的行銷訊息。
未來,我們可以進一步擴充套件 Pinecone 索引的規模,並結合更先進的生成式 AI 模型,實作更高效的資料驅動應用。同時,我們也可以探索更多的應用場景,如智慧客服、個人化推薦等,以充分發揮向量資料函式庫與生成式 AI 的潛力。
在Pinecone索引(向量儲存)上擴充套件以實作相容性需求的Pipeline2
目標概述
本章節將探討如何使用Pinecone向量儲存來擴充套件客戶資料分析流程,以滿足特定的市場細分需求。同時,我們將展示如何結合OpenAI的嵌入模型和生成式AI模型來產生針對特定客戶群的客製化電子郵件。
初始化OpenAI客戶端與嵌入模型
首先,我們需要初始化OpenAI客戶端並選擇適當的嵌入模型。以下程式碼展示瞭如何實作這一步驟:
import openai
import time
# 選擇嵌入模型
embedding_model = "text-embedding-3-small"
# 初始化OpenAI客戶端
client = openai.OpenAI()
def get_embedding(text, model=embedding_model):
# 清理文字中的換行符
text = text.replace("\n", " ")
# 使用OpenAI客戶端生成嵌入向量
response = client.embeddings.create(input=[text], model=model)
embedding = response.data[0].embedding
return embedding
內容解密:
- 我們匯入了必要的函式庫,包括
openai和time。 - 選擇了
text-embedding-3-small作為嵌入模型,這是一種適合生成文字嵌入向量的模型。 - 初始化了OpenAI客戶端,這是與OpenAI API互動的必要步驟。
- 定義了
get_embedding函式,該函式接受文字和模型作為輸入,並傳回對應的嵌入向量。 - 在函式內部,我們清理了文字中的換行符,以確保嵌入生成的準確性。
查詢目標向量
目標向量代表了市場團隊希望重點關注的客戶群體特徵。我們將建立一個目標向量來代表年齡約42歲、預估薪水超過100,000、曾投訴並可能離開銀行服務的客戶。
# 目標向量文字
query_text = "Customer Henderson CreditScore599 Age37 Tenure2 Balance101348.88 EstimatedSalary101348.88 Complain1 Exited1"
# 生成目標向量的嵌入
query_embedding = get_embedding(query_text, model=embedding_model)
內容解密:
- 我們定義了一個代表目標客戶群的文字描述,包括客戶特徵如年齡、信用評分、餘額等。
- 使用
get_embedding函式生成了目標文字的嵌入向量,這將用於查詢Pinecone索引中的相似客戶資料。
檢索相似客戶資料
接下來,我們使用目標向量的嵌入來查詢Pinecone索引,以檢索最相似的客戶資料。
# 進行查詢
query_results = index.query(
vector=query_embedding,
top_k=5,
include_metadata=True,
)
# 列印查詢結果
print("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.")
內容解密:
- 我們使用Pinecone索引的
query方法,傳入目標向量的嵌入、top_k=5來檢索最相似的5筆客戶資料,並包含後設資料。 - 列印了查詢結果,包括匹配的ID、相似度分數以及對應的客戶資料文字。
提取相關文字
從查詢結果中提取相關的客戶資料文字,以便用於後續的輸入增強。
# 提取相關文字
relevant_texts = [match['metadata']['text'] for match in query_results['matches'] if 'metadata' in match and 'text' in match['metadata']]
# 合併相關文字
combined_text = '\n'.join(relevant_texts)
print(combined_text)
內容解密:
- 我們遍歷查詢結果,提取每個匹配項的後設資料中的文字內容。
- 將提取的文字合併成一個字串,以便後續使用。
增強提示輸入
透過結合查詢提示、目標向量文字和相關客戶資料文字來構建增強的輸入提示。
# 構建提示
query_prompt = "I have this customer bank record with interesting characteristics: "
combined_context = "\n".join(relevant_texts)
itext = query_prompt + query_text + combined_context
# 列印增強輸入
print("Prompt for the Generative AI model:", itext)
內容解密:
- 我們構建了一個提示語,描述了客戶資料的特點。
- 將查詢提示、目標向量文字和相關客戶資料文字合併,形成最終的增強輸入提示。
- 列印了最終的提示輸入,這將被用於生成式AI模型的輸入。
生成客製化電子郵件
最後,我們使用增強的輸入提示來生成客製化的電子郵件。
# 選擇生成式AI模型
gpt_model = "gpt-4o"
# 建立完成請求
response = client.chat.completions.create(
model=gpt_model,
messages=[
{"role": "system", "content": "You are the community manager can write engaging emails."},
{"role": "user", "content": itext}
],
temperature=0,
max_tokens=300,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
內容解密:
- 我們選擇了GPT-4o作為生成式AI模型,用於生成客製化的電子郵件。
- 構建了一個完成請求,包括系統角色和使用者角色的內容。
- 設定了請求引數,如
temperature、max_tokens等,以控制生成的輸出。