在 AI 驅動的應用中,向量資料函式庫和知識圖譜扮演著關鍵角色。Pinecone 作為向量資料函式庫,能高效儲存和查詢向量化的資料,結合 OpenAI 的嵌入和生成模型,可開發個人化推薦系統。此外,利用 Wikipedia API 和 LlamaIndex,可以構建根據知識圖譜的 RAG 系統,提供更精準的資訊檢索和問答服務。這些技術的整合應用,能有效提升客戶體驗、降低客戶流失率,並最佳化行銷策略規劃。
擴充套件Pinecone索引以實作向量儲存的相容性
在現代的AI驅動的客戶關係管理中,利用向量資料函式庫(如Pinecone)來儲存和管理客戶資料的向量表示,已經成為了一種趨勢。這些向量表示是透過將客戶的相關資訊(如信用評分、年齡、餘額等)轉換為高維向量而得到的。在本章中,我們將探討如何擴充套件Pinecone索引,並利用OpenAI的嵌入模型和生成模型,為目標客戶群體生成個人化的電子郵件。
初始化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", " ")
# 取得文字的嵌入表示
response = client.embeddings.create(input=[text], model=model)
embedding = response.data[0].embedding
return embedding
內容解密:
get_embedding
函式的作用:該函式接受一段文字和一個嵌入模型作為輸入,將文字清理後(替換換行符),呼叫OpenAI的嵌入API取得該文字的向量表示。embedding_model
的選擇:這裡選擇了"text-embedding-3-small"
模型,該模型適合生成文字的向量表示,用於後續的相似度查詢。- 清理文字:替換換行符是為了確保文字在嵌入過程中被正確處理,避免因格式問題導致的錯誤。
查詢目標向量
接下來,我們定義一個目標向量,代表市場團隊希望關注的客戶群體,以提高客戶忠誠度。
# 定義目標向量文字
query_text = "Customer Henderson CreditScore 599 Age 37 Tenure 2 Balance 115046.74 EstimatedSalary 79034.38 Complain 0 Exited 0"
# 取得目標向量的嵌入表示
query_embedding = get_embedding(query_text, model=embedding_model)
內容解密:
query_text
的定義:這段文字描述了一個目標客戶的特徵,包括姓名、信用評分、年齡、任職時間、餘額、預估薪水、是否投訴以及是否離開銀行服務等。query_embedding
的取得:透過呼叫get_embedding
函式,將query_text
轉換為向量表示,供後續查詢使用。
查詢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.")
內容解密:
index.query
方法:這裡呼叫了Pinecone索引的查詢方法,傳入目標向量的嵌入表示,查詢最相似的前5個客戶資料。top_k=5
引數:限制傳回結果為前5個最相似的客戶資料。include_metadata=True
引數:確保傳回結果中包含客戶資料的中繼資料(如文字描述)。
提取相關文字
查詢結果傳回後,我們需要提取相關的客戶資料文字,以便用於後續的提示增強。
# 提取相關文字
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)
內容解密:
relevant_texts
列表推導式:遍歷查詢結果,提取每個匹配項的中繼資料中的文字描述。combined_text
的生成:將所有相關文字合併為一個字串,以換行符分隔,用於後續的提示增強。
增強提示
現在,我們將查詢提示、目標向量文字和相關客戶資料文字合併,形成一個增強的提示,用於生成個人化的電子郵件。
# 定義查詢提示
query_prompt = "I have this customer bank record with interesting details."
# 合併文字形成增強提示
itext = query_prompt + "\n" + query_text + "\n" + combined_text
# 列印增強提示
print("Prompt for the Generative AI model:", itext)
內容解密:
query_prompt
的作用:提供給生成模型的初始指令,描述了任務的目的。itext
的生成:將查詢提示、目標向量文字和相關客戶資料文字合併,形成完整的輸入,用於後續的生成任務。
生成個人化電子郵件
最後,我們使用OpenAI的生成模型(GPT-4o),根據增強提示生成個人化的電子郵件。
# 初始化OpenAI客戶端和選擇生成模型
client = OpenAI()
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
)
內容解密:
client.chat.completions.create
方法:呼叫OpenAI的聊天完成API,根據提供的提示和引數生成回應。temperature=0
引數:控制生成輸出的隨機性,設為0表示盡可能產生確定性的輸出。max_tokens=300
引數:限制生成的回應長度不超過300個token。
使用Pinecone與OpenAI開發可擴充套件的RAG驅動推薦系統
本章節將探討如何建立一個可擴充套件的RAG(Retrieval-Augmented Generation)驅動的生成式AI推薦系統,使用Pinecone索引和OpenAI模型,以降低銀行客戶流失率為目標。
推薦系統的建立流程
資料預處理:首先,我們需要對資料進行預處理,包括移除非必要的欄位,以降低資料複雜度和儲存成本。透過探索性資料分析(EDA),我們發現客戶投訴與帳戶關閉之間存在強烈的相關性,並使用k-means聚類別模型進一步驗證了這一發現。
建立RAG驅動系統:接下來,我們設計了第二條Pipeline(Pipeline 2),以準備我們的RAG驅動系統來生成個人化推薦。我們使用OpenAI模型處理資料區塊,並將其嵌入Pinecone索引中。Pinecone的一致性上傳功能確保了高效的資料處理,無論資料量大小。
個人化推薦:最後,我們建立了第三條Pipeline(Pipeline 3),利用Pinecone中的超過一百萬個向量,針對特定的市場細分客戶群體提供量身定製的優惠,旨在提高客戶忠誠度和降低客戶流失率。使用GPT-4o,我們增強了查詢功能,以生成令人信服的推薦。
程式碼範例:查詢Pinecone索引並生成個人化電子郵件
import time
import openai
# 設定OpenAI API金鑰
openai.api_key = '你的OpenAI API金鑰'
# 查詢Pinecone索引
def query_pinecone_index(query_vector):
# Pinecone索引查詢邏輯
pass
# 生成個人化電子郵件內容
def generate_personalized_email(customer_profile):
response = openai.Completion.create(
model="text-davinci-003",
prompt=f"根據客戶資料 {customer_profile} 生成個人化電子郵件內容",
max_tokens=500
)
return response.choices[0].text
# 主函式
def main():
start_time = time.time()
customer_profile = "DIAMOND卡持有者"
email_content = generate_personalized_email(customer_profile)
print(email_content)
response_time = time.time() - start_time
print(f"查詢回應時間: {response_time:.2f} 秒")
if __name__ == "__main__":
main()
內容解密:
查詢Pinecone索引:我們使用
query_pinecone_index
函式查詢Pinecone索引,該函式接受一個查詢向量作為輸入,並傳回相關的結果。生成個人化電子郵件內容:
generate_personalized_email
函式利用OpenAI的文字生成模型,根據客戶資料生成個人化的電子郵件內容。主函式:在
main
函式中,我們記錄了生成電子郵件內容所需的時間,並列印預出生成的內容和所花費的時間。
常見問題
使用Kaggle資料集是否涉及下載和處理真實世界的資料進行分析?
- 是的,使用Kaggle資料集通常涉及下載和處理真實世界的資料進行分析。
Pinecone是否能夠有效地管理大規模向量儲存以支援AI應用?
- 是的,Pinecone能夠有效地管理大規模向量儲存,適合用於AI應用。
k-means聚類別是否有助於驗證客戶投訴與客戶流失之間的關係?
- 是的,k-means聚類別可以幫助驗證客戶投訴與客戶流失之間的關係。
未來,我們計劃擴充套件Pinecone索引為多模態知識函式庫,以進一步提高推薦系統的準確性和個人化程度。同時,我們將繼續探索如何利用生成式AI技術來改善客戶體驗和降低客戶流失率。
從Wikipedia API構建知識圖譜檢索增強系統
本章將介紹如何使用Wikipedia API、Deep Lake向量儲存和LlamaIndex建立一個根據知識圖譜的檢索增強(RAG)系統。該系統將透過三個主要流程(Pipeline)來實作:收集和準備檔案、建立和填充Deep Lake向量儲存,以及根據知識圖譜索引的RAG。
知識圖譜檢索增強系統的架構
本章所構建的系統將使用圖形結構來視覺化地呈現RAG資料集中不同檔案之間的關係。整個過程將圍繞著任意給定的Wikipedia主題展開,如下圖所示:
此圖示顯示了從Wikipedia主題到與根據圖形的向量儲存索引互動的整個過程。
系統實作目標
- 選擇Wikipedia主題:首先選擇一個與行銷相關的主題,例如,隨後可以根據自己的興趣更換主題。
- 生成Wikipedia頁面語料函式庫:使用Wikipedia API生成相關頁面的語料函式庫。
- 檢索和儲存參照:檢索每個頁面的參照並儲存。
- 檢索和儲存URL:檢索每個頁面的URL並儲存。
- 在Deep Lake向量儲存中檢索和更新內容:將URL的內容檢索出來並儲存在Deep Lake向量儲存中。
- 使用LlamaIndex建立知識函式庫索引:根據儲存在Deep Lake中的內容建立知識圖譜索引。
- 定義使用者輸入提示:定義用於查詢知識函式庫的使用者輸入提示。
- 查詢知識函式庫索引:使用LlamaIndex的功能查詢知識函式庫索引。
- 產生回應:讓LlamaIndex內建的LLM(大語言模型)功能根據知識圖譜中的嵌入資料產生回應。
- 評估LLM的回應:使用句子轉換器和人類反饋評分來評估LLM的回應。
- 提供時間指標:為關鍵功能提供時間指標。
技術實作流程
Pipeline 1:收集和準備檔案
此流程涉及使用Wikipedia API來檢索特定Wikipedia頁面及其相關頁面的後設資料,包括摘要、URL和參照資料。然後,將解析這些URL以準備資料,以便將其上傳到Deep Lake向量儲存中。
Pipeline 2:建立和填充Deep Lake向量儲存
此流程將Pipeline 1中準備好的Wikipedia頁面內容嵌入並上傳到Deep Lake向量儲存中。
Pipeline 3:根據知識圖譜索引的RAG
此流程使用LlamaIndex來建立知識圖譜索引,並顯示該索引。然後,構建功能以查詢知識函式庫索引,並讓LlamaIndex的內建LLM根據更新的資料集產生回應。
程式碼實作與講解
# 以下是一個簡單的範例,展示如何使用Wikipedia API檢索特定主題的相關資訊
import wikipedia
def search_wikipedia(topic):
try:
# 搜尋特定主題
search_results = wikipedia.search(topic)
return search_results
except wikipedia.exceptions.DisambiguationError as e:
print(f"搜尋結果有多重含義:{e}")
return None
except wikipedia.exceptions.PageError:
print("找不到相關頁面")
return None
# 使用範例
topic = "行銷"
results = search_wikipedia(topic)
if results:
print(f"搜尋到與'{topic}'相關的主題:{results}")
內容解密:
上述程式碼展示瞭如何使用Wikipedia API進行特定主題的搜尋。首先,我們匯入了wikipedia
函式庫。然後,定義了一個名為search_wikipedia
的函式,該函式接受一個主題作為輸入,並嘗試使用wikipedia.search()
方法搜尋相關結果。如果搜尋成功,則傳回搜尋結果;如果遇到多重含義或找不到相關頁面,則捕捉相應的例外並進行處理。最後,提供了一個使用範例,展示如何呼叫這個函式並處理傳回結果。
從樹狀結構到圖形結構的轉換及其視覺化
在資料科學和圖形分析中,將樹狀結構轉換為圖形結構是一種常見的需求。這種轉換使得我們能夠更好地理解不同節點之間的關係。在本章的案例中,節點可以代表不同的行銷策略,而邊則表示這些策略之間的相互關聯。這有助於新客戶瞭解不同的行銷策略如何協同工作,以實作整體業務目標,從而促進更清晰的溝通和更有效的策略規劃。
使用Python進行樹狀結構到圖形結構的轉換
本文將介紹如何使用Python中的NetworkX和Matplotlib函式庫,將樹狀結構轉換為圖形結構並進行視覺化。首先,我們定義了三個主要函式:
1. build_tree_from_pairs(pairs)
此函式根據給定的節點對列表構建一個有向圖(樹狀結構),並嘗試識別根節點。
2. check_relationships(pairs, friends)
此函式檢查給定的節點對是否為朋友關係,並列印檢查結果。
3. draw_tree(G, layout_choice, root, friends)
此函式使用Matplotlib視覺化樹狀結構,根據節點對的朋友關係狀態對邊進行不同的樣式處理,並根據不同的佈局選項進行節點定位。
import networkx as nx
import matplotlib.pyplot as plt
# 定義節點對和朋友關係
pairs = [('a', 'b'), ('b', 'e'), ('e', 'm'), ('m', 'p'), ('a', 'z'), ('b', 'q')]
friends = {('a', 'b'), ('b', 'e'), ('e', 'm'), ('m', 'p')}
# 構建樹狀結構
tree, root = build_tree_from_pairs(pairs)
# 檢查關係
check_relationships(pairs, friends)
# 繪製樹狀結構
layout_choice = 'spring'
draw_tree(tree, layout_choice=layout_choice, root=root, friends=friends)
內容解密:
build_tree_from_pairs(pairs)
函式首先建立一個有向圖,然後遍歷pairs
列表,將每個節點對新增為圖中的一條邊。最後,它嘗試找到根節點。check_relationships(pairs, friends)
函式遍歷pairs
列表,檢查每個節點對是否在friends
集合中。如果在,則輸出“friend”;否則,輸出“not friend”。draw_tree(G, layout_choice, root, friends)
函式使用NetworkX和Matplotlib繪製圖形。根據layout_choice
引數選擇不同的佈局方式,並根據節點對的朋友關係狀態對邊進行不同的樣式處理。
管道1:收集和準備檔案
本文介紹如何從Wikipedia檢索後設資料,檢索檔案,清理檔案,並將其聚合成為可插入Deep Lake向量儲存的格式。該過程如圖7.4所示。
Wikipedia_API.ipynb
此筆記本實作了Wikipedia API,用於檢索與所選主題根頁面相關的頁面URL,包括每個頁面的參照。
Knowledge_Graph_Deep_Lake_LlamaIndex_OpenAI_RAG.ipynb
此筆記本實作了所有三個管道。在管道1中,它取得由Wikipedia_API筆記本提供的URL,清理它們,載入並聚合它們以進行插入。
從Wikipedia檢索資料和後設資料
首先,我們安裝所需的wikipediaapi函式庫:
try:
import wikipediaapi
except:
!pip install Wikipedia-API==0.6.0
import wikipediaapi
然後,我們定義了一個用於計算文字token數量的函式:
import nltk
from nltk.tokenize import word_tokenize
def nb_tokens(text):
tokens = word_tokenize(text)
return len(tokens)
內容解密:
nb_tokens(text)
函式使用NLTK函式庫對輸入文字進行分詞,並傳回分詞後的token數量。- 建立Wikipedia API例項時,需要指定語言和使用者代理資訊。
接下來,我們設定Wikipedia API例項,並定義主題和檔名:
wiki = wikipediaapi.Wikipedia(
language='en',
user_agent='Knowledge/1.0 ([USER AGENT EMAIL)'
)
topic = "Marketing"
filename = "Marketing"
maxl = 100
內容解密:
wiki
物件是用於與Wikipedia API互動的例項,需要指定語言(本例中為英文)和使用者代理資訊。topic
、filename
和maxl
引數分別用於指定檢索主題、輸出檔案名和最大URL連結數。