在 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

內容解密:

  1. get_embedding函式的作用:該函式接受一段文字和一個嵌入模型作為輸入,將文字清理後(替換換行符),呼叫OpenAI的嵌入API取得該文字的向量表示。
  2. embedding_model的選擇:這裡選擇了"text-embedding-3-small"模型,該模型適合生成文字的向量表示,用於後續的相似度查詢。
  3. 清理文字:替換換行符是為了確保文字在嵌入過程中被正確處理,避免因格式問題導致的錯誤。

查詢目標向量

接下來,我們定義一個目標向量,代表市場團隊希望關注的客戶群體,以提高客戶忠誠度。

# 定義目標向量文字
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)

內容解密:

  1. query_text的定義:這段文字描述了一個目標客戶的特徵,包括姓名、信用評分、年齡、任職時間、餘額、預估薪水、是否投訴以及是否離開銀行服務等。
  2. 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.")

內容解密:

  1. index.query方法:這裡呼叫了Pinecone索引的查詢方法,傳入目標向量的嵌入表示,查詢最相似的前5個客戶資料。
  2. top_k=5引數:限制傳回結果為前5個最相似的客戶資料。
  3. 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)

內容解密:

  1. relevant_texts列表推導式:遍歷查詢結果,提取每個匹配項的中繼資料中的文字描述。
  2. 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)

內容解密:

  1. query_prompt的作用:提供給生成模型的初始指令,描述了任務的目的。
  2. 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
)

內容解密:

  1. client.chat.completions.create方法:呼叫OpenAI的聊天完成API,根據提供的提示和引數生成回應。
  2. temperature=0引數:控制生成輸出的隨機性,設為0表示盡可能產生確定性的輸出。
  3. max_tokens=300引數:限制生成的回應長度不超過300個token。

使用Pinecone與OpenAI開發可擴充套件的RAG驅動推薦系統

本章節將探討如何建立一個可擴充套件的RAG(Retrieval-Augmented Generation)驅動的生成式AI推薦系統,使用Pinecone索引和OpenAI模型,以降低銀行客戶流失率為目標。

推薦系統的建立流程

  1. 資料預處理:首先,我們需要對資料進行預處理,包括移除非必要的欄位,以降低資料複雜度和儲存成本。透過探索性資料分析(EDA),我們發現客戶投訴與帳戶關閉之間存在強烈的相關性,並使用k-means聚類別模型進一步驗證了這一發現。

  2. 建立RAG驅動系統:接下來,我們設計了第二條Pipeline(Pipeline 2),以準備我們的RAG驅動系統來生成個人化推薦。我們使用OpenAI模型處理資料區塊,並將其嵌入Pinecone索引中。Pinecone的一致性上傳功能確保了高效的資料處理,無論資料量大小。

  3. 個人化推薦:最後,我們建立了第三條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()

內容解密:

  1. 查詢Pinecone索引:我們使用query_pinecone_index函式查詢Pinecone索引,該函式接受一個查詢向量作為輸入,並傳回相關的結果。

  2. 生成個人化電子郵件內容generate_personalized_email函式利用OpenAI的文字生成模型,根據客戶資料生成個人化的電子郵件內容。

  3. 主函式:在main函式中,我們記錄了生成電子郵件內容所需的時間,並列印預出生成的內容和所花費的時間。

常見問題

  1. 使用Kaggle資料集是否涉及下載和處理真實世界的資料進行分析?

    • 是的,使用Kaggle資料集通常涉及下載和處理真實世界的資料進行分析。
  2. Pinecone是否能夠有效地管理大規模向量儲存以支援AI應用?

    • 是的,Pinecone能夠有效地管理大規模向量儲存,適合用於AI應用。
  3. k-means聚類別是否有助於驗證客戶投訴與客戶流失之間的關係?

    • 是的,k-means聚類別可以幫助驗證客戶投訴與客戶流失之間的關係。

未來,我們計劃擴充套件Pinecone索引為多模態知識函式庫,以進一步提高推薦系統的準確性和個人化程度。同時,我們將繼續探索如何利用生成式AI技術來改善客戶體驗和降低客戶流失率。

從Wikipedia API構建知識圖譜檢索增強系統

本章將介紹如何使用Wikipedia API、Deep Lake向量儲存和LlamaIndex建立一個根據知識圖譜的檢索增強(RAG)系統。該系統將透過三個主要流程(Pipeline)來實作:收集和準備檔案、建立和填充Deep Lake向量儲存,以及根據知識圖譜索引的RAG。

知識圖譜檢索增強系統的架構

本章所構建的系統將使用圖形結構來視覺化地呈現RAG資料集中不同檔案之間的關係。整個過程將圍繞著任意給定的Wikipedia主題展開,如下圖所示:

此圖示顯示了從Wikipedia主題到與根據圖形的向量儲存索引互動的整個過程。

系統實作目標

  1. 選擇Wikipedia主題:首先選擇一個與行銷相關的主題,例如,隨後可以根據自己的興趣更換主題。
  2. 生成Wikipedia頁面語料函式庫:使用Wikipedia API生成相關頁面的語料函式庫。
  3. 檢索和儲存參照:檢索每個頁面的參照並儲存。
  4. 檢索和儲存URL:檢索每個頁面的URL並儲存。
  5. 在Deep Lake向量儲存中檢索和更新內容:將URL的內容檢索出來並儲存在Deep Lake向量儲存中。
  6. 使用LlamaIndex建立知識函式庫索引:根據儲存在Deep Lake中的內容建立知識圖譜索引。
  7. 定義使用者輸入提示:定義用於查詢知識函式庫的使用者輸入提示。
  8. 查詢知識函式庫索引:使用LlamaIndex的功能查詢知識函式庫索引。
  9. 產生回應:讓LlamaIndex內建的LLM(大語言模型)功能根據知識圖譜中的嵌入資料產生回應。
  10. 評估LLM的回應:使用句子轉換器和人類反饋評分來評估LLM的回應。
  11. 提供時間指標:為關鍵功能提供時間指標。

技術實作流程

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)

內容解密:

  1. build_tree_from_pairs(pairs)函式首先建立一個有向圖,然後遍歷pairs列表,將每個節點對新增為圖中的一條邊。最後,它嘗試找到根節點。
  2. check_relationships(pairs, friends)函式遍歷pairs列表,檢查每個節點對是否在friends集合中。如果在,則輸出“friend”;否則,輸出“not friend”。
  3. 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)

內容解密:

  1. nb_tokens(text)函式使用NLTK函式庫對輸入文字進行分詞,並傳回分詞後的token數量。
  2. 建立Wikipedia API例項時,需要指定語言和使用者代理資訊。

接下來,我們設定Wikipedia API例項,並定義主題和檔名:

wiki = wikipediaapi.Wikipedia(
    language='en',
    user_agent='Knowledge/1.0 ([USER AGENT EMAIL)'
)

topic = "Marketing"
filename = "Marketing"
maxl = 100

內容解密:

  1. wiki物件是用於與Wikipedia API互動的例項,需要指定語言(本例中為英文)和使用者代理資訊。
  2. topicfilenamemaxl引數分別用於指定檢索主題、輸出檔案名和最大URL連結數。