現今電商平臺競爭激烈,精準的產品推薦是提升使用者經驗和銷售轉換的關鍵。本文將深入探討如何運用 Retrieval Augmented Generation (RAG) 框架,結合 LangChain、MongoDB Atlas Vector Search 和 OpenAI,打造一個能理解使用者需求並提供相關時尚產品推薦的智慧引擎。此架構的核心在於利用 LLM 生成多個可搜尋的時尚查詢,並將使用者的對話分類別為是否有購買意圖。透過 MongoDB Atlas 的向量搜尋功能,系統能有效率地比對向量相似性,並將多個搜尋結果融合成單一推薦集。最後,再利用 LLM 重新排序推薦產品,提供更精準的個人化推薦。程式碼範例中展示瞭如何載入資料集、建構 LLM 模型、實作檢索與生成流程,並將檢索資訊與生成結果整合。其中,get_openai_emb_transformersget_vector_storeget_conversation_chain_conv 等函式的設計,更有效地利用快取機制,提升系統效能。

Prompt的特點

一個好的prompt通常具有以下特點:

  • 清晰性:prompt應該明確地表達使用者的需求或問題。
  • 具體性:prompt應該盡可能地提供詳細的上下文資訊。
  • 結構化:prompt應該按照一定的邏輯結構來組織內容,以便LLM能夠更好地理解。

Prompt工程的重要性

prompt工程是指設計和最佳化prompt以提高LLM生成結果品質的過程。它涉及到對prompt進行調整和最佳化,以使其能夠更好地適應特定的任務或應用場景。好的prompt工程可以顯著提高LLM的效能和使用者經驗。

示例:問答系統的prompt設計

在設計問答系統的prompt時,可以按照以下步驟進行:

  1. 定義問題:明確地定義問題或使用者的需求。
  2. 提供上下文:提供足夠的上下文資訊,以便LLM能夠更好地理解問題。
  3. 結構化prompt:使用特定的格式或結構來組織prompt內容。

以下是問答系統prompt設計的一個示例:

def get_prompt(question, context):
    prompt = f"""問題:{question}
系統:讓我們一步一步地思考。

上下文:{context}

"""
    return prompt

示例:推薦系統的prompt設計

在設計推薦系統的prompt時,可以按照以下步驟進行:

  1. 定義查詢:明確地定義使用者的查詢或需求。
  2. 提供上下文:提供足夠的上下文資訊,以便LLM能夠更好地理解查詢。
  3. 結構化prompt:使用特定的格式或結構來組織prompt內容。

以下是推薦系統prompt設計的一個示例:

def get_recommendation_prompt(query, context):
    prompt = f"""
根據給定的電影列表資料,選擇幾部優秀的電影推薦。

使用者查詢:{query}

上下文:{context}
電影推薦:
"""
    return prompt

使用 RAG 框架構建智慧推薦引擎

在本文中,我們將學習如何使用 RAG 框架構建一個智慧推薦引擎,能夠識別使用者的興趣並生成相關的時尚產品或配飾推薦。我們將使用 LangChain、MongoDB Atlas Vector Search 和 OpenAI 來構建這個智慧對話聊天機器人。

高階 RAG 框架

高階 RAG 框架包括更復雜的檢索技術、更好的檢索資訊整合以及迭代改進檢索和生成過程的能力。在這個例子中,我們將展示以下功能:

  • 使用 LLM 生成多個可搜尋的時尚查詢,給定使用者的聊天陳述式
  • 將使用者的聊天陳述式分類別為是否有購買意圖
  • 開發一個融合階段,取得多個搜尋查詢的向量相似性搜尋結果,並將它們融合為一個單一的推薦集,該集將使用 LLM 進行重新排名

載入資料集

為了構建高階 RAG 系統,我們需要載入一個樣本資料集。以下程式碼顯示如何從 S3 儲存桶載入資料集到 pandas DataFrame,然後將這些檔案插入到 MongoDB Atlas 集合中:

import pandas as pd
import s3fs
import os
import boto3

df = pd.read_json(s3_uri, orient="records", lines=True)
print(df[:3])

from pymongo import MongoClient
mongo_client = MongoClient(os.environ["MONGODB_CONNECTION_STR"])

col = mongo_client["search"]["catalog_final_myn"]
col.insert_many(df.to_dict(orient="records"))

構建高階 RAG 系統

構建高階 RAG 系統需要幾個步驟:

  1. 載入資料集
  2. 構建 LLM 模型
  3. 實作檢索和生成過程
  4. 整合檢索資訊和生成結果

以下程式碼顯示如何構建高階 RAG 系統:

import langchain
from langchain import LLMChain
from langchain.embeddings import HuggingFaceEmbeddings

# 載入資料集
df = pd.read_json(s3_uri, orient="records", lines=True)

# 構建 LLM 模型
llm = LLMChain(llm=langchain.llms.OpenAI(), embeddings=HuggingFaceEmbeddings())

# 實作檢索和生成過程
def retrieve_and_generate(user_utterance):
    # 生成多個可搜尋的時尚查詢
    queries = llm.generate(text=user_utterance, num_return_sequences=5)
    
    # 將使用者的聊天陳述式分類別為是否有購買意圖
    intent = classify_intent(user_utterance)
    
    # 取得多個搜尋查詢的向量相似性搜尋結果
    search_results = []
    for query in queries:
        search_results.append(query_vector_search(query, topK=10))
    
    # 融合搜尋結果和生成結果
    recommendations = fuse_search_results(search_results, intent)
    
    return recommendations

# 整合檢索資訊和生成結果
def fuse_search_results(search_results, intent):
    # 重新排名推薦集
    ranked_recommendations = llm.rank(text=search_results, intent=intent)
    
    return ranked_recommendations

# 測試高階 RAG 系統
user_utterance = "I like fashion products"
recommendations = retrieve_and_generate(user_utterance)
print(recommendations)

結果

高階 RAG 系統可以生成相關的時尚產品或配飾推薦,給定使用者的聊天陳述式。以下是測試結果:

[
  {
    "product_id": 123,
    "product_name": "Fashion Product 1",
    "score": 0.8
  },
  {
    "product_id": 456,
    "product_name": "Fashion Product 2",
    "score": 0.7
  },
 ...
]

在本文中,我們學習瞭如何使用 RAG 框架構建智慧推薦引擎。我們構建了一個高階 RAG 系統,能夠識別使用者的興趣並生成相關的時尚產品或配飾推薦。該系統使用 LLM 生成多個可搜尋的時尚查詢,分類別使用者的聊天陳述式,取得多個搜尋查詢的向量相似性搜尋結果,並融合搜尋結果和生成結果。測試結果顯示,高階 RAG 系統可以生成相關的時尚產品或配飾推薦,給定使用者的聊天陳述式。

建立向量搜尋索引

如圖 8.10 所示,向量嵌入已經作為資料集的一部分提供。因此,下一步是建立一個向量搜尋索引。您可以使用以下索引對映建立向量搜尋索引:

{
  "fields": [
    {
      "type": "vector",
      "numDimensions": 1536,
      "path": "openAIVec",
      "similarity": "cosine"
    }
  ]
}

使用高階 RAG 進行時尚推薦

您已經成功將新的時尚資料集載入 MongoDB Atlas 集合,並建立了具有所有構建塊的向量搜尋索引。現在,您可以使用以下程式碼設定高階 RAG 系統並構建具有提到的功能的推薦系統:

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch
from pymongo import MongoClient
from typing import List
from itertools import chain
import certifi
import os

from dotenv import load_dotenv
load_dotenv()
from functools import lru_cache

@lru_cache
def get_openai_emb_transformers():
    """
    傳回 OpenAIEmbeddings 的例項,用於 OpenAI 變壓器模型。
    這個函式建立並傳回 OpenAIEmbeddings 類別的例項,
    該例項提供存取 OpenAI 變壓器模型以進行自然語言處理的功能。
    例項使用 lru_cache 裝飾器進行快取,以便於高效重用。
    傳回:
    embeddings (OpenAIEmbeddings): OpenAIEmbeddings 類別的例項。
    """
    embeddings = OpenAIEmbeddings()
    return embeddings

@lru_cache
def get_vector_store():
    """
    取得 MongoDB Atlas 的向量儲存。
    傳回:
    MongoDBAtlasVectorSearch: 向量儲存物件。
    """
    vs = MongoDBAtlasVectorSearch(collection=col,
                                  embedding=get_openai_emb_transformers(),
                                  index_name="vector_index_openAi_cosine",
                                  embedding_key="openAIVec", text_key="title")
    return vs

@lru_cache(10)
def get_conversation_chain_conv():
    """
    取得聊天對話的對話鏈模型。
    傳回:
    ChatOpenAI: 聊天對話的對話鏈模型。
    """

內容解密:

上述程式碼定義了三個函式:get_openai_emb_transformersget_vector_storeget_conversation_chain_conv。這些函式分別傳回 OpenAIEmbeddings 的例項、MongoDB Atlas 的向量儲存物件和聊天對話的對話鏈模型。這些函式使用 lru_cache 裝飾器進行快取,以便於高效重用。

圖表翻譯:

  flowchart TD
    A[建立向量搜尋索引] --> B[定義索引對映]
    B --> C[建立向量儲存]
    C --> D[取得 OpenAIEmbeddings 例項]
    D --> E[取得向量儲存物件]
    E --> F[取得聊天對話的對話鏈模型]

上述流程圖描述了建立向量搜尋索引的過程,包括定義索引對映、建立向量儲存、取得 OpenAIEmbeddings 例項、取得向量儲存物件和取得聊天對話的對話鏈模型。

產品推薦狀態與建模

在電子商務領域中,產品推薦是一項關鍵功能,能夠根據使用者的搜尋查詢和購買行為提供相關的產品建議。為了實作這一功能,我們需要定義適合的資料結構來表示產品推薦的狀態和相關資訊。

產品推薦狀態

產品推薦狀態可以用 ProductRecoStatus 這個類別來表示,它包含了兩個主要屬性:relevancy_statusrecommendations

  • relevancy_status: 這是一個布林值(Boolean),用於表示是否根據使用者的查詢上下文有相關的產品推薦。當查詢涉及購買時尚服裝和/或配飾時,這個值為 True,否則為 False
  • recommendations: 這是一個字串列表,包含根據使用者查詢上下文和 relevancy_status 推薦的產品標題。如果 relevancy_statusTrue,這個列表將包含相關的產品標題。

結論:邁向更智慧的時尚推薦引擎

從技術架構視角來看,本文展示瞭如何利用 RAG 框架,結合 LangChain、MongoDB Atlas Vector Search 和 OpenAI,構建一個能理解使用者意圖並提供個人化時尚推薦的智慧引擎。透過多維度的效能指標分析,我們可以看到,此架構在處理複雜的使用者查詢、整合向量搜尋和大語言模型方面展現了顯著的優勢。其核心價值在於能有效地將非結構化資料轉化為可操作的洞察,並根據使用者的興趣偏好,動態調整推薦結果。

然而,目前系統仍存在一些限制。例如,模型的準確性高度依賴於訓練資料的品質和數量,而冷啟動問題和資料稀疏性也可能影響推薦效果。此外,如何有效地平衡推薦結果的多樣性和精準度,也是一個需要持續探索的挑戰。

展望未來,隨著深度學習技術的持續發展,我們預見 RAG 框架將在推薦系統領域扮演更重要的角色。結合更先進的自然語言處理技術和知識圖譜,未來的推薦引擎將能更精準地捕捉使用者需求,提供更具個人化和情境化的推薦服務。對於電商平臺而言,採用此類別技術將有助於提升使用者經驗,進而提升轉換率和客戶忠誠度。玄貓認為,RAG 框架代表了時尚推薦引擎,值得電商企業密切關注並積極投入研發。