鑒于最近人工智能支持的API和網絡開發工具的激增,許多科技公司都在將聊天機器人集成到他們的應用程序中。
LangChain是一種備受歡迎的新框架,近期引起了廣泛關注。該框架旨在簡化開發人員與語言模型、外部數據和計算資源進行交互的應用程序開發過程。它通過清晰且模塊化的抽象,關注構建所需的所有構建模塊,并構建了常用的"鏈條",即構建模塊的組合。例如,對話檢索鏈條可以讓用戶與外部存儲中的數據進行交互,實現真實的對話體驗。
LangChain是如何實現這一目標的呢?OpenAI的語言模型并沒有針對特定企業的具體數據進行訓練或優化。如果您的聊天機器人依賴于該框架,您需要在運行時向OpenAI提供數據。在檢索步驟中,我們使用向量相似性搜索(VSS)從Redis中獲取與用戶查詢相關的數據,并將這些數據與原始問題一起輸入到語言模型中。這要求模型僅使用提供的信息(在人工智能領域中稱為"上下文")來回答問題。
這個鏈條中的大部分復雜性都歸結于檢索步驟。因此,我們選擇將LangChain與Redis Enterprise集成為一個向量數據庫。這種組合為復雜的人工智能和產品開發之間搭建了橋梁。
在這個簡短的教程中,我們將展示如何構建一個會話式的零售購物助手,幫助顧客在產品目錄中發現那些被埋藏的令人感興趣的商品。讀者可以按照提供的完整代碼進行操作。
01
構建你的聊天機器人
首先,安裝項目所需的所有組件。
1、安裝 Python 依賴項
這個項目需要一些Python庫。這些庫存儲在github倉庫的文件中。
pip install langchain==0.0.123pip install openai==0.27.2pip install redis==4.5.3pip install numpypip install pandaspip install gdown
2、準備產品數據集
對于零售聊天機器人,我們選擇使用Amazon Berkeley Objects數據集。該數據集包含了大量適用于生成零售助手的亞馬遜產品。
使用Python的pandas庫來加載和預處理數據集。在加載過程中,我們可以截斷較長的文本字段。這樣一來,我們的數據集會更加精簡,從而節省內存和計算時間。
import pandas as pd
MAX_TEXT_LENGTH=1000 # Maximum num of text characters to use def auto_truncate(val): """Truncate the given text.""" return val[:MAX_TEXT_LENGTH] # Load Product data and truncate long text fields all_prods_df = pd.read_csv("product_data.csv", converters={ 'bullet_point': auto_truncate, 'item_keywords': auto_truncate, 'item_name': auto_truncate })
3、在完全加載了我們的產品數據集之后,進行一些最后的預處理步驟,以清理關鍵詞字段并刪除缺失值。
# Replace empty strings with None and drop all_prods_df['item_keywords'].replace('', None, inplace=True) all_prods_df.dropna(subset=['item_keywords'], inplace=True) # Reset pandas dataframe index all_prods_df.reset_index(drop=True, inplace=True)
4、如果你持續在跟進GitHub上的代碼步驟,可以使用all_prods_df.head()來查看數據框的前幾行。完整的數據集包含超過100,000個產品,但是對于這個聊天機器人,我們將其限制在2500個的子集中。
# Num products to use (subset)NUMBER_PRODUCTS = 2500 # Get the first 2500 productsproduct_metadata = ( all_prods_df .head(NUMBER_PRODUCTS) .to_dict(orient='index')) # Check one of the productsproduct_metadata[0]
02
使用Redis作為向量數據庫的設置
1、LangChain為Redis提供了一個簡單的包裝器,可用于加載文本數據并創建捕捉“含義”的嵌入向量。在以下代碼中,我們準備產品文本和元數據,準備文本嵌入的提供程序(OpenAI),為搜索索引分配一個名稱,并提供一個用于連接的Redis URL。
import os from langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores.redis import Redis as RedisVectorStore # set your openAI api key as an environment variableos.environ['OPENAI_API_KEY'] = "YOUR OPENAI API KEY" # data that will be embedded and converted to vectorstexts = [ v['item_name'] for k, v in product_metadata.items()] # product metadata that we'll store along our vectorsmetadatas = list(product_metadata.values()) # we will use OpenAI as our embeddings providerembedding = OpenAIEmbeddings() # name of the Redis search index to createindex_name = "products" # assumes you have a redis stack server running on local hostredis_url = "redis://localhost:6379"
2、然后,我們將它們整合在一起,創建Redis向量存儲。
# create and load redis with documentsvectorstore = RedisVectorStore.from_texts( texts=texts, metadatas=metadatas, embedding=embedding, index_name=index_name, redis_url=redis_url)
03
創建 LangChain 對話鏈
現在我們準備好創建一個聊天機器人,使用存儲在Redis中的產品數據來進行對話。聊天機器人因其極大的實用性而非常受歡迎。在我們下面構建的場景中,我們假設用戶需要穿搭建議。
1、為了引入更多LangChain功能,我們需要導入幾個LangChain工具。
from langchain.callbacks.base import CallbackManagerfrom langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandlerfrom langchain.chains import ( ConversationalRetrievalChain, LLMChain)from langchain.chains.question_answering import load_qa_chainfrom langchain.llms import OpenAIfrom langchain.prompts.prompt import PromptTemplate
2、正如在介紹中提到的,這個項目使用了一個ConversationalRetrievalChain來簡化聊天機器人的開發。
Redis作為我們的存儲介質,保存了完整的產品目錄,包括元數據和由OpenAI生成的捕捉產品內容語義屬性的嵌入向量。通過使用底層的Redis Vector Similarity Search(VSS),我們的聊天機器人可以直接查詢目錄,以找到與用戶購物需求最相似或相關的產品。這意味著您無需進行繁瑣的關鍵字搜索或手動過濾,VSS會自動處理這些問題。
構成聊天機器人的ConversationalRetrievalChain分為三個階段:
問題創建:在這個階段,聊天機器人評估輸入的問題,并利用OpenAI GPT模型將其與之前的對話交互知識(如果有)結合起來。通過這個過程,機器人可以更好地理解購物者的問題,并為后續的檢索提供準確的上下文。
檢索:在檢索階段,聊天機器人根據購物者表達的興趣項,搜索Redis數據庫,以獲取最佳的可用產品。通過使用Redis Vector Similarity Search(VSS)等技術,機器人能夠快速而準確地檢索與購物者需求相匹配的產品。
問題回答:在這個階段,聊天機器人從向量搜索的查詢結果中獲取產品信息,并利用OpenAI GPT模型幫助購物者瀏覽選項。機器人可以生成適當的回答,提供有關產品特征、價格、評價等方面的信息,以幫助購物者做出決策。
3、雖然LangChain和Redis極大地提升了工作流程的效率,但與大型語言模型(如GPT)進行交互時需要使用"提示(prompt)"來進行溝通。我們創造出一組指令作為提示,以引導模型的行為朝著期望的結果發展。為了獲得聊天機器人的最佳效果,需要進一步完善提示的設置。
template = """Given the following chat history and a follow up question, rephrase the follow up input question to be a standalone question.Or end the conversation if it seems like it's done.Chat History:\"""{chat_history}\"""Follow Up Input: \"""{question}\"""Standalone question:""" condense_question_prompt = PromptTemplate.from_template(template) template = """You are a friendly, conversational retail shopping assistant. Use the following context including product names, descriptions, and keywords to show the shopper whats available, help find what they want, and answer any questions. It's ok if you don't know the answer.Context:\""" {context}\"""Question:\"\""" Helpful Answer:""" qa_prompt= PromptTemplate.from_template(template)
4、接下來,我們定義兩個OpenAI LLM,并分別使用鏈條對其進行封裝,用于問題生成和問題回答。streaming_llm允許我們逐個標記地將聊天機器人的響應傳輸到stdout,從而為用戶提供類似于聊天機器人的用戶體驗。
# define two LLM models from OpenAIllm = OpenAI(temperature=0) streaming_llm = OpenAI( streaming=True, callback_manager=CallbackManager([ StreamingStdOutCallbackHandler() ]), verbose=True, max_tokens=150, temperature=0.2) # use the LLM Chain to create a question creation chainquestion_generator = LLMChain( llm=llm, prompt=condense_question_prompt) # use the streaming LLM to create a question answering chaindoc_chain = load_qa_chain( llm=streaming_llm, chain_type="stuff", prompt=qa_prompt)
5、最后,我們使用ConversationalRetrievalChain將所有三個步驟封裝起來。
chatbot = ConversationalRetrievalChain( retriever=vectorstore.as_retriever(), combine_docs_chain=doc_chain, question_generator=question_generator)
04
虛擬購物助手已就緒
1、請注意,這并不是一個全能的聊天AI。然而,通過Redis的幫助,它存儲了完整的產品庫知識,我們能夠打造出一個相當出色的體驗。
# create a chat history bufferchat_history = []# gather user input for the first question to kick off the botquestion = input("Hi! What are you looking for today?") # keep the bot running in a loop to simulate a conversationwhile True: result = chatbot( {"question": question, "chat_history": chat_history} ) print("\n") chat_history.append((result["question"], result["answer"])) question = input()
2、該機器人將實時與您交互,并根據目錄中的商品幫助您縮小選擇范圍。以下是一個簡單的示例:
Hi! What are you looking for today? >> gold-plated earrings Hi there! I'm happy to help you find the perfect earrings. Do you have a preference for yellow gold plated sterling silver or platinum or gold-plated sterling silver? >> My preference is the yellow gold plated sterling silver Hi there! Are you looking for yellow gold-plated sterling silver earrings with Swarovski Zirconia or Topaz gemstones? We have a few options that might fit the bill. We have yellow gold-plated sterling silver Swarovski Zirconia fancy green stud earrings, yellow gold-plated sterling silver honey topaz stud earrings made with Swarovski Topaz gemstones, and yellow gold-plated sterling silver antique drop earrings set.
3、在聊天機器人用發出“你好!今天你在找什么?”此類的招呼后,嘗試一些示例提示,或者自己創建一個。
05
定制您的鏈條以提高性能
1、LangChain最好的部分之一是每個類抽象都可以擴展或創建自己的預設。我們自定義BaseRetriever類,在返回結果之前執行一些文檔預處理。
import jsonfrom langchain.schema import BaseRetrieverfrom langchain.vectorstores import VectorStorefrom langchain.schema import Documentfrom pydantic import BaseModel class RedisProductRetriever(BaseRetriever, BaseModel): vectorstore: VectorStore class Config: arbitrary_types_allowed = True def combine_metadata(self, doc) -> str: metadata = doc.metadata return ( "Item Name: " + metadata["item_name"] + ". " + "Item Description: " + metadata["bullet_point"] + ". " + "Item Keywords: " + metadata["item_keywords"] + "." ) def get_relevant_documents(self, query): docs = [] for doc in self.vectorstore.similarity_search(query): content = self.combine_metadata(doc) docs.append(Document( page_content=content, metadata=doc.metadata )) return docs
2、我們需要更新檢索類和聊天機器人,以使用上述的自定義實現。
redis_product_retriever = RedisProductRetriever(vectorstore=vectorstore) chatbot = ConversationalRetrievalChain( retriever=redis_product_retriever, combine_docs_chain=doc_chain, question_generator=question_generator)
3、大功告成!現在你的聊天機器人可以在對話中注入更多的產品信息。以下是另一個短對話的示例:
printf("hello Hi! What are you looking for today? >>> fancy footwear for going out Hi there! We have a few great options for women's shoes and sandals. We have the Amazon Brand - The Fix Women's Giana Open Toe Bootie with Pearl Buckle, bright white leather, 9.5 B US, Flavia Women's Beige Fashion Sandals-7 UK (39 EU) (8 US) (FL/236/BEG), Flavia Women's Blue Fashion Sandals-8 UK (40 EU) (9 US) (FL/211/BLU), and The Fix Women's Faris Flat Slide Sandal with Pearls. All of these shoes feature a variety of styles and colors to choose from. Let me know if you have any questions about any of these items! >>> These are nice. However, I am looking for men's shoes. Can you help me? Hi there! We have a great selection of men's formal shoes available. We have Amazon Brand - Symbol Men's Formal Shoes, Amazon Brand - Symbol Men's Leather Formal Shoes, and more. All of our formal shoes are made from high quality materials and feature a variety of closure types, toe styles, and heel types. They also come with a manufacturer's warranty and care instructions to ensure they last. Let me know if you have any questions or need help finding the perfect pair of shoes for you! >>>Can you show me some more men's options? Hi there! I'm here to help you find the perfect item for you. We have a few options available for men's formal shoes. We have the Men's Stainless Steel Link Bracelet, the Amazon Brand - Arthur Harvey Men's Leather Formal Shoes, and the Amazon Brand - Symbol Men's Formal Derby shoes. All of these items feature a variety of features such as leather material, lace-up closure, pointed toe, block heel, and more. If you have any questions about any of these items, please let me know. I'm happy to help! >>> Ok this looks great, thanks!world!");
-
機器人
+關注
關注
211文章
28524瀏覽量
207539 -
人工智能
+關注
關注
1792文章
47442瀏覽量
238996 -
VSS
+關注
關注
1文章
35瀏覽量
21458
發布評論請先 登錄
相關推薦
評論