
閱讀時間:〜10分鐘
使用Pulsejet Github repo建造藝術裝飾式瓦格聊天機器人:https://github.com/jet-engine/art-deco-chatbot
可以從以下鏈接中讀取此博客文章:
大型語言模型(LLMS)已顯著提高,提高了他們回答各種問題的能力。但是,他們仍然遇到挑戰,尤其是在特定或最近的信息中,通常會導致不准確或“幻覺”。為了解決這些問題,檢索增強生成(RAG)方法將文件檢索步驟集成到響應生成過程中。該方法使用文檔語料庫並採用矢量數據庫進行有效檢索,從而通過三個關鍵步驟提高了LLM響應的準確性和可靠性:
向量數據庫促進了快速相似性搜索和有效的數據管理,從而成為增強LLM功能的強大解決方案。
跨越1920年代到1940年代的咆哮時代的裝飾藝術時代,在建築中留下了令人眼花of亂的遺產。儘管諸如Meta的Llama3.1之類的模型具有功能,但它們的反應可能是不可靠的,尤其是針對裝飾藝術特定的細微或詳細查詢。我們使用裝飾藝術聊天機器人的目標是利用抹布來提高裝飾藝術體系結構的響應質量,並將這些響應與傳統LLM在質量和時間效率方面產生的響應進行比較。
通過設計裝飾藝術聊天機器人,我們還旨在展示如何建立復雜的抹布系統。您可以在Art Deco Chatbot GitHub存儲庫中訪問完整的代碼。通過檢查代碼並閱讀此讀數,您將學習:
Ollama是一個程序,可在本地機器上輕鬆運行LLM型號。
ollama pull llama3.1 (將用於抹布的LLM)ollama pull nomic-embed-text (將用於抹布的嵌入模型)在這個項目中,我們不僅旨在編寫代碼以展示如何完成抹布,還要將抹布與查詢的基準結果與不同的LLM進行比較和基準測試。這些LLM中的一些不能在本地運行(例如GPT-4o ),而其他LLM則無法在雲服務上運行(例如Groq上的Llama3.1:70b )。
Litellm提供了一個統一的接口來查詢不同的LLM,使我們的代碼更清潔,更可讀。建議查看Litellm Python庫,但該項目不需要。
從OpenAI和GROQ獲取API鍵在項目中使用它們。請注意,您可能會因使用這些服務而受到費用。雖然可以在撰寫本文時免費使用Groq API ,但OpenAI API並非免費。
Pulsejet是一個高性能向量數據庫,可有效地存儲和檢索文檔嵌入。設置Pulsejet:
pip install pulsejetdocker run --name pulsejet_container -p 47044-47045:47044-47045 jetngine/pulsejet注意:您可以跳過第一步,因為PulseJet已包含在requirements.txt文件中。
檢查PulseJet文檔以獲取有關運行Pulsejet Docker映像的詳細信息,並使用Pulsejet Python庫進行矢量數據庫操作。
通過運行來安裝所有必要的依賴項:
pip install -r requirements.txt
該項目是使用
Python 3.11的conda環境開發的。
由於我們尚未在不同的環境中測試該項目,因此我們建議遵守此配置以獲得最佳性能和兼容性。
裝飾藝術聊天機器人使用兩個YAML文件進行配置: config.template.yaml和secrets.yaml 。這是每個部分的詳細分解:
使用您的API鍵創建一個secrets.yaml文件:yaml文件:
# api_keys:
openai_key : " your_openai_key_here "
groq_key : " your_groq_key_here " # models:
main_model : " llama3.1 "
embed_model : " nomic-embed-text "
# vector_db:
vector_db : " pulsejet "
# pulsejet:
pulsejet_location : " remote "
pulsejet_collection_name : " art-deco "
# paths:
rag_files_path : " rag_files/ "
questions_file_path : " evaluation/questions.csv "
evaluation_path : " evaluation/ "
rag_prompt_path : " evaluation/rag_prompt.txt "
metrics_file_path : " evaluation/metrics.json "
# embeddings:
embeddings_file_path : " embeddings_data/all_embeddings_HSNW.h5 "
use_precalculated_embeddings : true
# llm_models:
all_models :
gpt-4o : " gpt-4o "
groq-llama3.1-8b : " groq/llama-3.1-8b-instant "
groq-llama3.1-70b : " groq/llama-3.1-70b-versatile "
ollama-llama3.1 : " ollama/llama3.1 "
ollama-llama3.1-70b : " ollama/llama3.1:70b "
selected_models :
- " gpt-4o "
- " groq-llama3.1-70b "
- " ollama-llama3.1 "
# rag_parameters:
sentences_per_chunk : 10
chunk_overlap : 2
file_extension : " .txt "這是每個部分的詳細說明:
true時,系統將從指定的文件加載嵌入式。當false時,它將生成新的嵌入式並將其保存到此文件中。 在運行項目之前,請確保使用特定設置更新這些配置文件。調整抹布參數可以顯著影響抹布系統的性能和準確性。對於特定用例和文檔集找到最佳配置可能是必需的。
wiki-bot.py一起運行刮板此步驟是可選的,因為https://huggingface.co/datasets/jetengine/art_deco_usa_ds中可用Wikipedia的所有刮擦文章的內容文件。
您可以下載此數據集並將所有文本文件從其複製到rag_files目錄中。如果您打算使用預計算的嵌入式(將在下一部分中進行說明),則實際上不需要下載此數據集。
無需重複刮擦過程。如果您對數據刮擦過程不感興趣,則可以跳過本節的其餘部分。
我們的第一步涉及收集有關Art-Deco架構的知識。鑑於它們在藝術運動中的重要性,我們專注於我們的結構。 wiki-bot.py腳本可自動化相關的Wikipedia文章的收集,將它們組織成一個結構化目錄以易於訪問。
使用:運行機器人:
python wiki-bot.py
當您使用一個空的rag_files目錄運行wiki-bot.py時,它將刮擦的Wikipedia文章的內容保存在rag_files下的名為text的子文件中。該機器人還創建了各種子文件夾來組織不同類型的數據,例如文章URL,參考等。由於我們目前的重點僅在於Wikipedia文章的內容上,以減少混亂,因此我們僅將內容物從text子文件轉移到我們的HG數據集並刪除了所有其他子文件集。
因此,如果您想自己運行機器人,這是可選的,因為刮擦的文檔已經可以在擁抱臉上可用,則需要將所有文件從文本子文件夾複製到rag_files目錄,然後將rag_files中的所有sub-folders刪除為rag_files_path in config.yaml中rag_files/text text.yaml。
indexing.py索引文檔通過運行索引文檔:
python indexing.py
該腳本處理文檔,生成嵌入並將其存儲在Pulsejet中。如果您不想浪費時間來生成嵌入式,則可以從https://huggingface.co/jetengine/rag_art_art_deco_embeddings下載預估計的嵌入式,並設置use_precalculated_embeddings: true 。
在我們的設置生成中,嵌入式大約需要15分鐘才能完成,並將向量插入脈衝噴氣機大約需要4秒鐘。
該腳本輸出計時信息:
chat.py進行推斷確保您的配置正確,然後運行:
python chat.py
該腳本查詢不同的LLM和抹布系統,輸出導致HTML,JSON和CSV格式進行比較。
Pulsejet在此項目中用於有效的矢量存儲和檢索。這是關於如何將Pulsejet集成到我們的裝飾藝術聊天機器人項目中的詳細概述:
初始化Pulsejet客戶端:
client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ])這會創建一個PulseJet客戶端。在我們的項目中,我們使用的是一個遠程Pulsejet實例,因此該location設置為“遠程”。這連接到在Docker容器中運行的PulseJet服務器。
創建一個集合:
client . create_collection ( collection_name , vector_config )這將在Pulsejet中創建一個新的集合來存儲我們的文檔嵌入。 vector_config參數指定向量存儲的配置,例如向量大小和索引類型(例如,HNSW用於有效相似性搜索)。
插入向量:在我們的項目中,我們使用以下模式插入向量:
collection [ 0 ]. insert_single ( collection [ 1 ], embed , meta )一開始這可能會令人困惑,但這是什麼意思:
collection[0]實際上是我們的PulseJet客戶端實例。collection[1]是我們要插入的集合的名稱。embed是我們正在插入的向量。meta是與矢量相關的其他元數據。這等同於致電:
client . insert_single ( collection_name , vector , meta )對於批量插入,我們使用:
client . insert_multi ( collection_name , embeds )這立即插入多個嵌入式,這對於大型數據集更有效。
搜索向量:
results = client [ 'db' ]. search_single ( collection , query_embed , limit = 5 , filter = None )這在指定的PulseJet集合中執行相似性搜索,以找到給定查詢向量的最相關文檔。 limit參數指定要返回的最大結果數。
在我們的項目中, client['db']用於訪問PulseJet客戶端的數據庫方法。這相當於直接使用客戶端:
results = client . search_single ( collection_name , query_vector , limit = 5 , filter = None )關閉連接:
client . close ()當不再需要時,這關閉了與PulseJet數據庫的連接。
PulsejetRagClient類是在pulsejet_rag_client.py中定義的,並提供了一個高級接口,用於在我們的抹布系統的上下文中與PulseJet進行交互。這是其關鍵組成部分的細分:
初始化:
class PulsejetRagClient :
def __init__ ( self , config ):
self . config = config
self . collection_name = config [ 'pulsejet_collection_name' ]
self . main_model = config [ 'main_model' ]
self . embed_model = config [ 'embed_model' ]
self . client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ])使用配置參數初始化客戶端,設置PulseJet客戶端並存儲相關的配置值。
創建一個集合:
def create_collection ( self ):
vector_size = get_vector_size ( self . config [ 'embed_model' ])
vector_params = pj . VectorParams ( size = vector_size , index_type = pj . IndexType . HNSW )
try :
self . client . create_collection ( self . collection_name , vector_params )
logger . info ( f"Created new collection: { self . collection_name } " )
except Exception as e :
logger . info ( f"Collection ' { self . collection_name } ' already exists or error occurred: { str ( e ) } " )此方法在Pulsejet中創建了一個新的集合,並具有指定的參數。它使用get_vector_size函數來確定嵌入的適當向量大小。
插入向量:
def insert_vector ( self , vector , metadata = None ):
try :
self . client . insert_single ( self . collection_name , vector , metadata )
logger . debug ( f"Inserted vector with metadata: { metadata } " )
except Exception as e :
logger . error ( f"Error inserting vector: { str ( e ) } " )
def insert_vectors ( self , vectors , metadatas = None ):
try :
self . client . insert_multi ( self . collection_name , vectors , metadatas )
logger . debug ( f"Inserted { len ( vectors ) } vectors" )
except Exception as e :
logger . error ( f"Error inserting multiple vectors: { str ( e ) } " )這些方法將單個向量和多個向量插入PulseJet集合中,以及它們的相關元數據。
搜索向量:
def search_similar_vectors ( self , query_vector , limit = 5 ):
try :
results = self . client . search_single ( self . collection_name , query_vector , limit = limit , filter = None )
return results
except Exception as e :
logger . error ( f"Error searching for similar vectors: { str ( e ) } " )
return []此方法在Pulsejet集合中執行相似性搜索,以找到給定查詢向量的最相關文檔。
關閉連接:
def close ( self ):
try :
self . client . close ()
logger . info ( "Closed Pulsejet client connection" )
except Exception as e :
logger . error ( f"Error closing Pulsejet client connection: { str ( e ) } " )當不再需要時,此方法將關閉與PulseJet數據庫的連接。
在整個項目中使用PulsejetRagClient與PulseJet相互作用。這是通常的實例化和使用的方式:
創建:
from pulsejet_rag_client import create_pulsejet_rag_client
config = get_config ()
rag_client = create_pulsejet_rag_client ( config )索引文件:
在indexing.py中,我們使用客戶端創建集合併插入向量:
rag_client . create_collection ()
for file_name , file_embeddings in embeddings_data . items ():
for chunk_id , content , embed in file_embeddings :
metadata = { "filename" : file_name , "chunk_id" : chunk_id , "content" : content }
rag_client . insert_vector ( embed , metadata )在rag.py中,我們使用客戶端在抹布過程中搜索類似的向量:
results = rag_client . search_similar_vectors ( query_embed , limit = 5 )操作完成後,我們關閉連接:
rag_client . close ()此實現為我們的抹布系統中的所有PulseJet操作提供了一個乾淨的封裝接口。
LLama3.1的抹布任務,由於查詢長度的增加而花的時間比簡單的問題回答更長。裝飾藝術聊天機器人展示瞭如何更好地利用llms的抹布。我們的項目對抹布實施進行了全面的探索,涵蓋了從數據刮擦和文檔塊到嵌入創建以及矢量數據庫集成的每個步驟。
隨著抹布系統的文檔基礎的增長,插入和搜索操作的性能變得越來越關鍵。通過學習如何將Pulsejet Vector數據庫集成到成熟的抹布系統中,人們可以從其功能中受益匪淺,尤其是在處理大型文檔基礎上的RAG應用程序時。
我們的破布響應本來可以更準確。為了提高我們的裝飾藝術聊天機器人的表現,我們正在考慮幾種實驗方法:
我們計劃通過以下計劃擴展該項目:
我們鼓勵您嘗試裝飾藝術聊天機器人,修改其參數,並將其調整到您自己感興趣的領域。
作者:Güvençusanmaz