偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何從零開始構(gòu)建Zepto的多語言查詢解析系統(tǒng)?

譯文 精選
人工智能
Zepto公司的數(shù)據(jù)科學(xué)團(tuán)隊(duì)利用LLM和RAG構(gòu)建了一個強(qiáng)大的系統(tǒng)來解決多語言拼寫錯誤問題。本文將從模糊查詢到修正輸出,完整復(fù)制這一端到端功能,并解釋了該技術(shù)在搜索質(zhì)量和多語言查詢解析中發(fā)揮的關(guān)鍵作用。

譯者 | 李睿

審校 | 重樓

本文介紹如何從零開始構(gòu)建Zepto的多語言查詢解析系統(tǒng),該系統(tǒng)利用LLMRAG技術(shù)處理拼寫錯誤及方言查詢問題。通過復(fù)制從模糊查詢到修正輸出的端到端流程,可以解釋這一技術(shù)在提升搜索質(zhì)量與多語言查詢處理中的核心作用。

你用過Zepto在網(wǎng)上訂購雜貨嗎?如果用過,你可能會注意到,即使寫錯單詞或拼錯商品名稱,Zepto仍然能理解并顯示想要的結(jié)果。但是,輸入“kele chips(香蕉片)而不是“banana chips”(香蕉片)的用戶則很難找到他們想要的商品。拼寫錯誤和方言查詢導(dǎo)致糟糕的用戶體驗(yàn)并降低轉(zhuǎn)化率。

Zepto公司的數(shù)據(jù)科學(xué)團(tuán)隊(duì)利用LLMRAG構(gòu)建了一個強(qiáng)大的系統(tǒng)來解決多語言拼寫錯誤問題。本文將從模糊查詢到修正輸出,完整復(fù)制這一端到端功能,并解釋了該技術(shù)在搜索質(zhì)量和多語言查詢解析中發(fā)揮的關(guān)鍵作用。

了解Zepto的系統(tǒng)

技術(shù)流程

以下了解Zepto用于其多語言查詢解析的技術(shù)流程。該流程涉及多個組件,將在后續(xù)詳細(xì)說明。

1多語言查詢解析工作流程

1追蹤了一個嘈雜的用戶查詢的完整修正過程。拼寫錯誤或方言文本進(jìn)入管道;多語言嵌入模型將其轉(zhuǎn)換為密集向量。該系統(tǒng)將該向量輸入Facebook的相似性搜索引擎FAISS,該引擎返回嵌入空間中最接近的top-k個品牌和產(chǎn)品名稱。接下來,管道將嘈雜的查詢和檢索到的名稱轉(zhuǎn)發(fā)到LLM提示,LLM輸出經(jīng)過修正、干凈的查詢。Zepto部署了這個查詢解析循環(huán)來提升用戶體驗(yàn)和轉(zhuǎn)化率。Zepto在處理拼寫錯誤、代碼混合短語和方言詞匯時,根據(jù)Zepto的調(diào)查,受影響查詢的轉(zhuǎn)化率提高了7.5%,這清楚地展示了技術(shù)提升日?;拥哪芰Α?/span>

核心組件

以下介紹在這個系統(tǒng)中使用的核心概念。

1.拼寫錯誤的查詢和方言查詢

用戶經(jīng)常在查詢中使用英語和方言的混合。例如,“kele chips”(“香蕉片”),“balekayi chips”(卡納達(dá)語)等。例如“kothimbir”(馬拉地語/印地語的香菜)或泰米爾語中“paal”(牛奶)的語音輸入會導(dǎo)致傳統(tǒng)搜索失效。如果沒有規(guī)范化或音譯支持,其語義就會丟失。

2.檢索-增強(qiáng)生成(RAG

RAG是一個將語義檢索(向量嵌入和元數(shù)據(jù)查找)與LLM生成功能相結(jié)合的管道。Zepto在收到嘈雜、拼寫錯誤和方言查詢時,利用RAG功能檢索top-k個相關(guān)的產(chǎn)品名稱和品牌。然后,將這些最相似的檢索到的結(jié)果與嘈雜的查詢一起被饋送到LLM進(jìn)行修正。

Zepto的用例中使用RAG的好處:

  • 通過提供上下文來防止幻覺,從而為LLM的應(yīng)用奠定基礎(chǔ)。
  • 提高準(zhǔn)確性并確保相關(guān)品牌術(shù)語的修正。
  • 通過縮小上下文減少提示大小和推理成本。

3.向量數(shù)據(jù)庫

向量數(shù)據(jù)庫是一種專門用于存儲、索引單詞或句子嵌入的數(shù)據(jù)庫。這些嵌入是數(shù)據(jù)點(diǎn)的數(shù)字表示。這些向量數(shù)據(jù)庫用于在給定查詢時使用相似度搜索檢索高維向量。FAISS是一種開源庫,專門為高效的相似度搜索和密集向量聚類而設(shè)計(jì)。FAISS用于快速搜索多媒體文檔的相似嵌入,Zepto系統(tǒng)可以使用FAISS來存儲品牌名稱、標(biāo)簽和產(chǎn)品名稱的嵌入。

4.逐步提示和JSON輸出

Zepto的流程強(qiáng)調(diào)模塊化的提示分解,可以將復(fù)雜的任務(wù)分解成更小的逐步任務(wù),然后有效地執(zhí)行,而不會出現(xiàn)任何錯誤,從而提高準(zhǔn)確性。它包括檢測查詢是否拼寫錯誤或方言,修正術(shù)語,翻譯成英語規(guī)范術(shù)語,并以JSON格式輸出。

JSON模式確保了可靠性和可讀性,例如:

{ 
"original_query": "...",
 "corrected_query": "...",
 "translation": "..."
}

其系統(tǒng)提示包含幾個簡短的例子,其中包含英語和修正方言的混合,以指導(dǎo)LLM的行為。

5.內(nèi)部LLM托管

Zepto使用MetaLlama3-8B,托管在Databricks上以控制成本和提供性能。Zepto采用指令微調(diào),這是一種使用逐步提示和角色扮演指令的輕量級調(diào)優(yōu)。確保LLM僅關(guān)注提示行為,避免成本昂貴的模型重新訓(xùn)練。

6.通過用戶重新表述的隱式反饋

當(dāng)推出新功能的時候,用戶反饋至關(guān)重要。Zepto用戶看到的每次快速修正和更好的結(jié)果都是有效的修復(fù)。收集這些信號以向提示添加新的示例,將新的同義詞放入檢索數(shù)據(jù)庫,并清除錯誤。ZeptoA/B測試顯示轉(zhuǎn)化率提升了7.5%

復(fù)制查詢解析系統(tǒng)

接下來,將嘗試通過定義系統(tǒng)來復(fù)制Zepto的多語言查詢解析系統(tǒng)。以下是將要使用的系統(tǒng)流程圖。

其實(shí)現(xiàn)遵循Zepto概述的相同策略:

  • 語義檢索:首先獲取用戶的原始查詢,并從整個目錄中找到top-k個潛在相關(guān)產(chǎn)品的列表。這是通過將查詢的向量嵌入與存儲在向量數(shù)據(jù)庫中的產(chǎn)品的嵌入進(jìn)行比較來實(shí)現(xiàn)的。這一步驟提供了必要的上下文。
  • LLM支持的校正和選擇LLM驅(qū)動的修正與選擇:將檢索到的產(chǎn)品(上下文)和原始查詢傳遞給LLM。LLM的任務(wù)不僅是修正拼寫,還需分析上下文并選擇用戶最可能想要查找的產(chǎn)品。然后,它以結(jié)構(gòu)化格式返回一個干凈的、經(jīng)過修正的查詢以及其決策背后的推理。

2 系統(tǒng)流程圖

流程

該流程可以簡化為以下3個步驟:

1.輸入和查詢

用戶輸入原始查詢,該查詢可能包含一些噪聲或使用不同的語言。Zepto系統(tǒng)直接將原始查詢嵌入到多語言嵌入中。在具有一些預(yù)定義嵌入的Chroma DB向量數(shù)據(jù)庫上執(zhí)行相似性搜索。它返回top-k個最相關(guān)的產(chǎn)品嵌入。

2.處理

檢索到top-k產(chǎn)品嵌入之后,通過高級系統(tǒng)提示將它們與嘈雜的用戶查詢一起提供給Llama3。該模型返回一個清晰的JSON,其中包含清理后的查詢、產(chǎn)品名稱、置信度評分及其推理過程,明確說明選擇該品牌的原因。確保查詢修正的透明性,可訪問LLM選擇該產(chǎn)品和品牌名稱的推理邏輯。

3.最終查詢細(xì)化和搜索

這個階段包括解析來自LLMJSON輸出,通過提取修正之后的查詢,可以根據(jù)用戶輸入的原始查詢訪問最相關(guān)的產(chǎn)品或品牌名稱。最后一個階段涉及在Vector DB上重新運(yùn)行相似性搜索,以查找搜索產(chǎn)品的詳細(xì)信息。這樣,就可以實(shí)現(xiàn)多語言查詢解析系統(tǒng)。

動手實(shí)施

在了解查詢解析系統(tǒng)的工作原理之后,現(xiàn)在通過編寫代碼動手構(gòu)建這個系統(tǒng)。將逐步完成每一個事項(xiàng),從安裝依賴項(xiàng)到最終的相似性搜索。

步驟1:安裝依賴項(xiàng)

首先,安裝必要的Python庫。將使用LangChain協(xié)調(diào)組件,使用langchain-groq實(shí)現(xiàn)快速LLM推理,fastembed用于高效生成嵌入,langchain-chroma用于管理向量數(shù)據(jù)庫,pandas用于處理數(shù)據(jù)。

!pip install -q pandas langchain langchain-core langchain-groq langchain-chroma fastembed langchain-community

步驟2:創(chuàng)建一個擴(kuò)展和復(fù)雜的虛擬數(shù)據(jù)集

為了徹底測試系統(tǒng),需要一個反映現(xiàn)實(shí)世界挑戰(zhàn)的數(shù)據(jù)集。這個CSV包括:

  • 更多種類的產(chǎn)品(20多種)
  • 常見的品牌名稱(如可口可樂、美極)
  • 多語言和方言術(shù)語(dhaniya、kanda、nimbu
  • 潛在歧義項(xiàng)(cheese spreadcheese slices)。
import pandas as pd
from io import StringIO
csv_data = """product_id,product_name,category,tags
1,Aashirvaad Select Atta 5kg,Staples,"atta, flour, gehu, aata, wheat"
2,Amul Gold Milk 1L,Dairy,"milk, doodh, paal, full cream milk"
3,Tata Salt 1kg,Staples,"salt, namak, uppu"
4,Kellogg's Corn Flakes 475g,Breakfast,"cornflakes, breakfast cereal, makkai"
5,Parle-G Gold Biscuit 1kg,Snacks,"biscuit, cookies, biscuits"
6,Cadbury Dairy Milk Silk,Chocolates,"chocolate, choco, silk, dairy milk"
7,Haldiram's Classic Banana Chips,Snacks,"kele chips, banana wafers, chips"
8,MDH Deggi Mirch Masala,Spices,"mirchi, masala, spice, red chili powder"
9,Fresh Coriander Bunch (Dhaniya),Vegetables,"coriander, dhaniya, kothimbir, cilantro"
10,Fresh Mint Leaves Bunch (Pudina),Vegetables,"mint, pudhina, pudina patta"
11,Taj Mahal Red Label Tea 500g,Beverages,"tea, chai, chaha, red label"
12,Nescafe Classic Coffee 100g,Beverages,"coffee, koffee, nescafe"
13,Onion 1kg (Kanda),Vegetables,"onion, kanda, pyaz"
14,Tomato 1kg,Vegetables,"tomato, tamatar"
15,Coca-Cola Original Taste 750ml,Beverages,"coke, coca-cola, soft drink, cold drink"
16,Maggi 2-Minute Noodles Masala,Snacks,"maggi, noodles, instant food"
17,Amul Cheese Slices 100g,Dairy,"cheese, cheese slice, paneer slice"
18,Britannia Cheese Spread 180g,Dairy,"cheese, cheese spread, creamy cheese"
19,Fresh Lemon 4pcs (Nimbu),Vegetables,"lemon, nimbu, lime"
20,Saffola Gold Edible Oil 1L,Staples,"oil, tel, cooking oil, saffola"
21,Basmati Rice 1kg,Staples,"rice, chawal, basmati"
22,Kurkure Masala Munch,Snacks,"kurkure, snacks, chips"
"""
df = pd.read_csv(StringIO(csv_data))
print("Product Catalog successfully loaded.")
df.head()

輸出:

3輸出表格

步驟3:初始化向量數(shù)據(jù)庫

將產(chǎn)品數(shù)據(jù)轉(zhuǎn)換成捕獲語義的數(shù)值表示(嵌入)。這里使用FastEmbed,因?yàn)樗俣群芸觳⑶以诒镜剡\(yùn)行。將這些嵌入存儲在輕量級的向量數(shù)據(jù)庫ChromaDB中。

  • 嵌入策略:為每個產(chǎn)品創(chuàng)建組合產(chǎn)品名稱、類別和標(biāo)簽的文本文檔,生成豐富的描述性嵌入,這樣可以提高語義匹配成功率。
  • 嵌入模型:在這里使用BAAI/ big -small-en-v1.5模型。其“小型”版本資源高效且快速,是適合多語言任務(wù)的嵌入模型。BAAI/ big -small-en-v1.5是一個強(qiáng)大的英文文本嵌入模型,在某些上下文中很有用。它在涉及語義相似性和文本檢索的任務(wù)中提供了具有競爭力的性能。
import os
import json
from langchain.schema import Document
from langchain.embeddings import FastEmbedEmbeddings
from langchain_chroma import Chroma
# Create LangChain Documents
documents = [
 Document(
 page_cnotallow=f"{row['product_name']}. Category: {row['category']}. Tags: {row['tags']}",
 metadata={
 "product_id": row['product_id'],
 "product_name": row['product_name'],
 "category": row['category']
 }
 ) for _, row in df.iterrows()
]
# Initialize embedding model and vector store
embedding_model = FastEmbedEmbeddings(model_name="BAAI/bge-small-en-v1.5")
vectorstore = Chroma.from_documents(documents, embedding_model)
# The retriever will be used to fetch the top-k most similar documents
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
print("Vector database initialized and retriever is ready.")

輸出:

4向量數(shù)據(jù)庫初始化

如果看到這個小部件,那就意味著可以在本地下載BAAI/ big -small-en-v1.5

步驟4:設(shè)計(jì)高級LLM的提示

這是最關(guān)鍵的一步。這里設(shè)計(jì)了一個提示,指示LLM充當(dāng)專家查詢解釋器。該提示強(qiáng)制LLM遵循嚴(yán)格的流程來返回結(jié)構(gòu)化JSON對象。這確保了輸出是可預(yù)測的,并且易于在應(yīng)用程序中使用。

提示的主要功能:

  • 明確的角色:LLM被告知這是一個雜貨店專家系統(tǒng)。
  • 上下文是關(guān)鍵:它必須基于檢索產(chǎn)品列表做出決策。
  • 強(qiáng)制JSON輸出:指示它返回具有特定模式的JSON對象:corrected_query, identified_productconfidencereasoning。這對系統(tǒng)可靠性至關(guān)重要。
from langchain_groq import ChatGroq
from langchain_core.prompts import ChatPromptTemplate
# IMPORTANT: Set your Groq API key here or as an environment variable
os.environ["GROQ_API_KEY"] = "YOUR_API_KEY” # Replace with your key
llm = ChatGroq(
 temperature=0,
 model_name="llama3-8b-8192",
 model_kwargs={"response_format": {"type": "json_object"}},
)
prompt_template = """
You are a world-class search query interpretation engine for a grocery delivery service like Zepto.
Your primary goal is to understand the user's *intent*, even if their query is misspelled, in a different language, or uses slang.
Analyze the user's `RAW QUERY` and the `CONTEXT` of semantically similar products retrieved from our catalog.
Based on this, determine the most likely product the user is searching for.
**INSTRUCTIONS:**
1. Compare the `RAW QUERY` against the product names in the `CONTEXT`.
2. Identify the single best match from the `CONTEXT`.
3. Generate a clean, corrected search query for that product.
4. Provide a confidence score (High, Medium, Low) and a brief reasoning for your choice.
5. Return a single JSON object with the following schema:
 - "corrected_query": A clean, corrected search term.
 - "identified_product": The full name of the single most likely product from the context.
 - "confidence": Your confidence in the decision: "High", "Medium", or "Low".
 - "reasoning": A brief, one-sentence explanation of why you made this choice.
If the query is too ambiguous or has no good match in the context, confidence should be "Low" and `identified_product` can be `null`.
---
CONTEXT:
{context}
RAW QUERY:
{query}
---
JSON OUTPUT:
"""
prompt = ChatPromptTemplate.from_template(prompt_template)
print("LLM and Prompt Template are configured.")

步驟5:創(chuàng)建端到端管道

現(xiàn)在使用LangChain表達(dá)式語言(LCEL)將所有組件鏈接在一起。這創(chuàng)建了從查詢到最終結(jié)果的流暢流程。

管道流程:

  • 用戶的查詢被傳遞給檢索器以獲取上下文。
  • 對上下文和原始查詢進(jìn)行格式化并輸入到提示中。
  • 格式化的提示發(fā)送到LLM。
  • LLM的JSON輸出被解析成Python字典。
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
def format_docs(docs):
 """Formats the retrieved documents for the prompt."""
 return "\n".join([f"- {d.metadata['product_name']}" for d in docs])
# The main RAG chain
rag_chain = (
 {"context": retriever | format_docs, "query": RunnablePassthrough()}
 | prompt
 | llm
 | StrOutputParser()
)
def search_pipeline(query: str):
 """Executes the full search and correction pipeline."""
 print(f"\n{'='*50}")
 print(f"Executing Pipeline for Query: '{query}'")
 print(f"{'='*50}")
 # --- Stage 1: Semantic Retrieval ---
 initial_context = retriever.get_relevant_documents(query)
 print("\n[Stage 1: Semantic Retrieval]")
 print("Found the following products for context:")
 for doc in initial_context:
 print(f" - {doc.metadata['product_name']}")
 # --- Stage 2: LLM Correction & Selection ---
 print("\n[Stage 2: LLM Correction & Selection]")
 llm_output_str = rag_chain.invoke(query)
 try:
 llm_output = json.loads(llm_output_str)
 print("LLM successfully parsed the query and returned:")
 print(json.dumps(llm_output, indent=2))
 corrected_query = llm_output.get('corrected_query', query)
 except (json.JSONDecodeError, AttributeError) as e:
 print(f"LLM output failed to parse. Error: {e}")
 print(f"Raw LLM output: {llm_output_str}")
 corrected_query = query # Fallback to original query
 # --- Final Step: Search with Corrected Query ---
 print("\n[Final Step: Search with Corrected Query]")
 print(f"Searching for the corrected term: '{corrected_query}'")
 final_results = vectorstore.similarity_search(corrected_query, k=3)
 print("\nTop 3 Product Results:")
 for i, doc in enumerate(final_results):
 print(f" {i+1}. {doc.metadata['product_name']} (ID: {doc.metadata['product_id']})")
 print(f"{'='*50}\n")
print("End-to-end search pipeline is ready.")

步驟6:演示和結(jié)果

現(xiàn)在,使用各種具有挑戰(zhàn)性的查詢來測試系統(tǒng)以了解其性能。

# --- Test Case 1: Simple Misspelling ---
search_pipeline("aata")
# --- Test Case 2: Vernacular Term ---
search_pipeline("kanda")
# --- Test Case 3: Brand Name + Misspelling ---
search_pipeline("cococola")
# --- Test Case 4: Ambiguous Query ---
search_pipeline("chese")
# --- Test Case 5: Highly Ambiguous / Vague Query ---
search_pipeline("drink")

輸出:

5 查詢管道:Kanda

6查詢管道:cococola

7查詢管道:Chese

8查詢管道:Girnk

可以看到,該系統(tǒng)可以用準(zhǔn)確和正確的品牌或產(chǎn)品名稱來修正原始和嘈雜的用戶查詢,這對于在電子商務(wù)平臺上實(shí)現(xiàn)高精度的產(chǎn)品搜索至關(guān)重要。這將改善用戶體驗(yàn)并提高轉(zhuǎn)化率。

注:在這個Git存儲庫中可以找到完整的代碼。

結(jié)論

這個多語言查詢解析系統(tǒng)成功地復(fù)制了Zepto高級搜索系統(tǒng)的核心策略。通過將快速語義檢索與基于LLM的智能分析相結(jié)合,該系統(tǒng)可以:

  • 準(zhǔn)確地修正拼寫錯誤和俚語。
  • 理解多語言查詢并匹配正確產(chǎn)品。
  • 通過使用檢索到的上下文推斷用戶意圖來消除查詢的歧義(例如,在“奶酪片”和“奶酪醬”之間進(jìn)行選擇)。
  • 提供結(jié)構(gòu)化的,可審計(jì)的輸出,展示修正及推理過程。

這種基于RAG的架構(gòu)是穩(wěn)健的、可擴(kuò)展的,并展示了顯著改善用戶體驗(yàn)和搜索轉(zhuǎn)化率的清晰路徑。

常見問題

Q1:什么是RAG,為什么在這里使用它?

答:RAG通過將其錨定到真實(shí)的目錄數(shù)據(jù)來提高LLM的準(zhǔn)確性,避免幻覺并減少提示規(guī)模。

Q2:如何防止品牌名稱修正錯誤?

答:在檢索步驟中只注入最相關(guān)的品牌術(shù)語,避免擴(kuò)大提示的規(guī)模。

Q3:應(yīng)該使用什么嵌入模型?

答:多語言句子轉(zhuǎn)換器模型(例如BAAI/ big -small-en-v1.5)針對語義相似性進(jìn)行了優(yōu)化,最適合嘈雜和方言輸入。原文標(biāo)題:How to Replicate Zepto’s Multilingual Query Resolution System from Scratch?,作者:Harsh Mishr

責(zé)任編輯:姜華 來源: 51CTO
相關(guān)推薦

2014-07-09 09:20:06

WPFWPF應(yīng)用

2024-02-23 09:00:00

編程語言編譯器工具

2025-01-26 16:57:02

2022-03-30 08:24:25

操作系統(tǒng)內(nèi)核開源軟件

2015-05-06 09:36:05

Java語言從零開始學(xué)習(xí)

2018-08-20 08:15:50

編程語言Go語言切片

2017-02-10 09:30:33

數(shù)據(jù)化運(yùn)營流量

2010-02-22 09:39:52

HTML 5Web

2024-07-31 08:14:17

2024-03-01 19:53:37

PyBuilderPython開發(fā)

2022-08-09 07:22:15

語言數(shù)據(jù)庫程序

2024-05-17 17:29:00

CurdlingPython開發(fā)

2025-01-09 11:14:13

2024-11-28 10:35:47

2015-10-15 14:16:24

2022-04-01 08:09:03

操作系統(tǒng)嵌入式重構(gòu)

2023-10-24 16:44:24

RubyDNS

2014-04-16 14:50:20

Spark

2018-04-16 16:31:56

前端開發(fā)從零開始

2020-07-02 15:32:23

Kubernetes容器架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號