
เวลาอ่าน: ~ 10 นาที
การสร้าง Art Deco Rag Chatbot โดยใช้ PulseJet GitHub repo: https://github.com/jet-engine/art-deco-chatbot
บล็อกนี้สามารถอ่านได้จากลิงค์ต่อไปนี้:
แบบจำลองภาษาขนาดใหญ่ (LLMS) มีความก้าวหน้าอย่างมากปรับปรุงความสามารถในการตอบคำถามที่หลากหลาย อย่างไรก็ตามพวกเขายังคงเผชิญกับความท้าทายโดยเฉพาะอย่างยิ่งกับข้อมูลที่เฉพาะเจาะจงหรือล่าสุดมักจะส่งผลให้เกิดความไม่ถูกต้องหรือ "ภาพหลอน" เพื่อแก้ไขปัญหาเหล่านี้วิธีการดึง (RAG) การดึงข้อมูลรวมขั้นตอนการดึงเอกสารเข้ากับกระบวนการสร้างการตอบสนอง วิธีการนี้ใช้คลังข้อมูลของเอกสารและใช้ฐานข้อมูลเวกเตอร์เพื่อการดึงที่มีประสิทธิภาพเพิ่มความแม่นยำและความน่าเชื่อถือของการตอบสนอง LLM ผ่านสามขั้นตอนสำคัญ:
ฐานข้อมูลเวกเตอร์ช่วยให้การค้นหาที่คล้ายคลึงกันอย่างรวดเร็วและการจัดการข้อมูลที่มีประสิทธิภาพทำให้ RAG เป็นโซลูชันที่ทรงพลังสำหรับการเพิ่มขีดความสามารถของ LLM
ยุคอาร์ตเดโคซึ่งประกอบไปด้วยคำรามในปี ค.ศ. 1920 ถึงปี 1940 ทิ้งมรดกอันน่าทึ่งไว้ในสถาปัตยกรรม แม้จะมีความสามารถของโมเดลเช่น LLAMA3.1 ของ Meta แต่การตอบสนองของพวกเขานั้นไม่น่าเชื่อถือโดยเฉพาะอย่างยิ่งสำหรับการสอบถามที่เหมาะสมหรือรายละเอียดที่เฉพาะเจาะจงสำหรับ Art Deco เป้าหมายของเรากับ Art Deco Chatbot คือการใช้ RAG เพื่อปรับปรุงคุณภาพของการตอบสนองเกี่ยวกับสถาปัตยกรรมอาร์ตเดโคเมื่อเปรียบเทียบกับสิ่งเหล่านี้กับ LLM แบบดั้งเดิมทั้งในด้านคุณภาพและประสิทธิภาพเวลา
ด้วยการออกแบบ Art Deco Chatbot เรายังมุ่งมั่นที่จะแสดงให้เห็นว่าระบบผ้าขี้ริ้วที่ซับซ้อนสามารถสร้างได้อย่างไร คุณสามารถเข้าถึงรหัสที่สมบูรณ์ได้ที่ที่เก็บอาร์ต Deco Chatbot GitHub โดยการตรวจสอบรหัสและอ่าน readme นี้คุณจะได้เรียนรู้:
Ollama เป็นโปรแกรมที่อำนวยความสะดวกในการใช้งานรุ่น LLM ได้อย่างง่ายดายบนเครื่องจักรท้องถิ่น
ollama pull llama3.1 (LLM ที่จะใช้สำหรับ RAG)ollama pull nomic-embed-text (รุ่นฝังที่จะใช้สำหรับ RAG) ในโครงการนี้เราไม่เพียง แต่ตั้งเป้าหมายที่จะเขียนรหัสเพื่อแสดงว่า RAG สามารถทำได้อย่างไร แต่ยังเปรียบเทียบและเปรียบเทียบผลลัพธ์ของ RAG กับการสืบค้นกับ LLM ที่แตกต่างกัน LLM เหล่านี้บางส่วนไม่สามารถทำงานได้ในท้องถิ่น (เช่น GPT-4o ) ในขณะที่คนอื่น ๆ คำนวณหนักและทำงานบนบริการคลาวด์ (เช่น Llama3.1:70b บน GROQ)
Litellm ให้อินเทอร์เฟซแบบครบวงจรเพื่อสืบค้น LLM ที่แตกต่างกันทำให้การทำความสะอาดรหัสของเราและอ่านง่ายขึ้น แนะนำให้ตรวจสอบไลบรารี Litellm Python แต่ไม่จำเป็นสำหรับโครงการนี้
รับคีย์ API ของคุณจาก OpenAI และ GROQ เพื่อใช้ในโครงการ โปรดทราบว่าคุณอาจถูกเรียกเก็บเงินสำหรับการใช้บริการเหล่านี้ ในขณะที่ Groq API สามารถใช้ได้ฟรีในเวลาที่เขียน OpenAI API ไม่ได้ฟรี
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
โครงการนี้ได้รับการพัฒนาโดยใช้สภาพแวดล้อม
condaกับPython 3.11
เนื่องจากเรายังไม่ได้ทดสอบโครงการในสภาพแวดล้อมที่แตกต่างกันเราขอแนะนำให้ปฏิบัติตามการกำหนดค่านี้เพื่อประสิทธิภาพและความเข้ากันได้ที่ดีที่สุด
Art Deco Chatbot ใช้ไฟล์ YAML สองไฟล์สำหรับการกำหนดค่า: config.template.yaml และ secrets.yaml นี่คือรายละเอียดรายละเอียดของแต่ละส่วน:
สร้างไฟล์ secrets.yaml ด้วยคีย์ API ของคุณ:
# 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 ระบบจะโหลด embeddings จากไฟล์ที่ระบุ เมื่อ false มันจะสร้าง embeddings ใหม่และบันทึกไว้ในไฟล์นี้ ตรวจสอบให้แน่ใจว่าคุณอัปเดตไฟล์การกำหนดค่าเหล่านี้ด้วยการตั้งค่าเฉพาะของคุณก่อนที่จะเรียกใช้โครงการ การปรับพารามิเตอร์ RAG สามารถส่งผลกระทบต่อประสิทธิภาพและความแม่นยำของระบบ RAG อย่างมีนัยสำคัญ การทดลองที่มีค่าต่าง ๆ อาจจำเป็นต้องค้นหาการกำหนดค่าที่เหมาะสมที่สุดสำหรับกรณีการใช้งานเฉพาะของคุณและชุดเอกสาร
wiki-bot.pyขั้นตอนนี้เป็นทางเลือก เนื่องจากไฟล์เนื้อหาของบทความที่ถูกคัดค้านทั้งหมดจาก Wikipedia มีอยู่ใน https://huggingface.co/datasets/jetengine/art_deco_usa_ds
คุณสามารถดาวน์โหลดชุดข้อมูลนี้และคัดลอกไฟล์ข้อความทั้งหมดจากมันลงในไดเรกทอรี RAG_FILES หากคุณวางแผนที่จะใช้ embeddings ที่คำนวณล่วงหน้าซึ่งจะอธิบายในส่วนถัดไปคุณไม่จำเป็นต้องดาวน์โหลดชุดข้อมูลนี้
ไม่จำเป็นต้องทำซ้ำกระบวนการขูด คุณสามารถข้ามการอ่านส่วนที่เหลือของส่วนนี้หากคุณไม่สนใจกระบวนการขูดข้อมูล
ขั้นตอนแรกของเราเกี่ยวข้องกับการรวบรวมความรู้เกี่ยวกับสถาปัตยกรรมศิลปะ เรามุ่งเน้นไปที่โครงสร้างของเราเนื่องจากความโดดเด่นของพวกเขาในขบวนการศิลปะ-เดโค สคริปต์ wiki-bot.py ทำให้คอลเลกชันของบทความวิกิพีเดียที่เกี่ยวข้องโดยอัตโนมัติจัดเรียงเป็นไดเรกทอรีที่มีโครงสร้างเพื่อความสะดวกในการเข้าถึง
เรียกใช้บอทโดยใช้:
python wiki-bot.py
เมื่อคุณเรียกใช้ wiki-bot.py ด้วยไดเรกทอรี rag_files ที่ว่างเปล่ามันจะบันทึกเนื้อหาของบทความ Wikipedia ที่ถูกคัดค้านในโฟลเดอร์ย่อยที่ชื่อ text ภายใต้ RAG_FILES บอทยังสร้างโฟลเดอร์ย่อยต่าง ๆ เพื่อจัดระเบียบข้อมูลประเภทต่าง ๆ เช่น URL บทความการอ้างอิง ฯลฯ เนื่องจากการมุ่งเน้นในปัจจุบันของเราอยู่ที่เนื้อหาของ text Wikipedia เท่านั้นเพื่อลดความยุ่งเหยิง
ดังนั้นหากคุณต้องการเรียกใช้บอทด้วยตัวเองซึ่งเป็นตัวเลือกเนื่องจากเอกสารที่คัดลอกมานั้นมีอยู่แล้วในการกอดใบหน้าคุณจะต้องคัดลอกไฟล์ทั้งหมดจากโฟลเดอร์ย่อยข้อความไปยัง config.yaml rag_files จากนั้นลบโฟลเดอร์ rag_files/text ทั้งหมดภายใน rag_files หรือเปลี่ยน rag_files_path
indexing.pyจัดทำดัชนีเอกสารโดยการรัน:
python indexing.py
สคริปต์นี้ประมวลผลเอกสารสร้าง embeddings และเก็บไว้ใน PulseJet หากคุณไม่ต้องการเสียเวลาในการสร้าง embeddings คุณสามารถดาวน์โหลดการฝังตัว use_precalculated_embeddings: true คำนวณล่วงหน้าได้จาก https://huggingface.co/jetengine/rag_art_deco_embeddings
ในการตั้งค่าการตั้งค่าของเราของเราใช้เวลาประมาณ 15 นาที จึงจะเสร็จสมบูรณ์และแทรกเวกเตอร์ไปยังพัลส์เจ็ทใช้เวลาประมาณ 4 วินาที
สคริปต์เอาท์พุทข้อมูลเวลาสำหรับ:
chat.pyตรวจสอบให้แน่ใจว่าการกำหนดค่าของคุณถูกต้องจากนั้นเรียกใช้:
python chat.py
สคริปต์นี้สอบถาม LLM ที่แตกต่างกันและระบบ RAG ผลลัพธ์ผลลัพธ์ในรูปแบบ HTML, JSON และ CSV สำหรับการเปรียบเทียบ
PulseJet ใช้ในโครงการนี้เพื่อการจัดเก็บเวกเตอร์ที่มีประสิทธิภาพและการดึงข้อมูล นี่คือภาพรวมโดยละเอียดว่า PulseJet รวมเข้ากับโครงการ Art Deco Chatbot ของเราอย่างไร:
การเริ่มต้นไคลเอนต์พัลส์เจ็ท :
client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ]) สิ่งนี้สร้างไคลเอนต์พัลส์เจ็ท ในโครงการของเราเราใช้อินสแตนซ์พัลส์เจ็ทระยะไกลดังนั้น location จึงถูกตั้งค่าเป็น "ระยะไกล" สิ่งนี้เชื่อมต่อกับเซิร์ฟเวอร์พัลส์เจ็ทที่ทำงานในคอนเทนเนอร์ Docker
การสร้างคอลเลกชัน :
client . create_collection ( collection_name , vector_config ) สิ่งนี้สร้างคอลเลกชันใหม่ใน PulseJet เพื่อจัดเก็บเอกสารของเรา พารามิเตอร์ vector_config ระบุการกำหนดค่าสำหรับที่เก็บข้อมูลเวกเตอร์เช่นขนาดเวกเตอร์และประเภทดัชนี (เช่น HNSW สำหรับการค้นหาความคล้ายคลึงกันที่มีประสิทธิภาพ)
การแทรกเวกเตอร์ : ในโครงการของเราเราใช้รูปแบบต่อไปนี้สำหรับการแทรกเวกเตอร์:
collection [ 0 ]. insert_single ( collection [ 1 ], embed , meta )สิ่งนี้อาจดูสับสนในตอนแรก แต่นี่คือความหมาย:
collection[0] เป็นอินสแตนซ์ไคลเอนต์พัลส์เจ็ทของเรา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'] ใช้เพื่อเข้าถึงวิธีการฐานข้อมูลของไคลเอนต์พัลส์เจ็ท สิ่งนี้เทียบเท่ากับการใช้ไคลเอนต์โดยตรง:
results = client . search_single ( collection_name , query_vector , limit = 5 , filter = None )ปิดการเชื่อมต่อ :
client . close ()สิ่งนี้จะปิดการเชื่อมต่อกับฐานข้อมูล PulseJet เมื่อไม่จำเป็นต้องใช้อีกต่อไป
คลาส PulsejetRagClient ถูกกำหนดไว้ใน pulsejet_rag_client.py และให้อินเทอร์เฟซระดับสูงสำหรับการโต้ตอบกับพัลส์เจ็ทในบริบทของระบบผ้าขี้ริ้วของเรา นี่คือรายละเอียดขององค์ประกอบสำคัญ:
การเริ่มต้น :
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' ])ไคลเอนต์จะเริ่มต้นด้วยพารามิเตอร์การกำหนดค่าตั้งค่าไคลเอนต์พัลส์เจ็ทและจัดเก็บค่าการกำหนดค่าที่เกี่ยวข้อง
การสร้างคอลเลกชัน :
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 ) } " ) วิธีนี้สร้างคอลเลกชันใหม่ในพัลส์เจ็ทด้วยพารามิเตอร์ที่ระบุ มันใช้ฟังก์ชั่น get_vector_size เพื่อกำหนดขนาดเวกเตอร์ที่เหมาะสมสำหรับ embeddings
การแทรกเวกเตอร์ :
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 ) } " )วิธีการเหล่านี้จัดการการแทรกของเวกเตอร์เดี่ยวและหลายตัวเข้าไปในคอลเลกชันพัลส์เจ็ทพร้อมกับข้อมูลเมตาที่เกี่ยวข้อง
การค้นหาเวกเตอร์ :
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 เราใช้ไคลเอนต์เพื่อค้นหาเวกเตอร์ที่คล้ายกันในระหว่างกระบวนการ RAG:
results = rag_client . search_similar_vectors ( query_embed , limit = 5 )หลังจากการดำเนินการเสร็จสมบูรณ์เราปิดการเชื่อมต่อ:
rag_client . close ()การใช้งานนี้ให้อินเทอร์เฟซที่สะอาดและห่อหุ้มสำหรับการทำงานของพัลส์เจ็ททั้งหมดในระบบ RAG ของเรา
LLama3.1 ใช้เวลานานกว่าการตอบคำถามง่ายๆเนื่องจากความยาวของการสืบค้นที่เพิ่มขึ้นArt Deco Chatbot แสดงให้เห็นว่า LLMs สามารถใช้งานได้ดีขึ้นกับผ้าขี้ริ้วได้อย่างไร โครงการของเรานำเสนอการสำรวจการใช้งาน RAG ที่ครอบคลุมครอบคลุมทุกขั้นตอนจากการขูดข้อมูลและการบันทึกเอกสารไปจนถึงการสร้างการสร้างและการรวมฐานข้อมูลเวกเตอร์
เมื่อฐานเอกสารสำหรับระบบผ้าขี้ริ้วเพิ่มขึ้นประสิทธิภาพของการแทรกและการดำเนินการค้นหาจะมีความสำคัญมากขึ้นเรื่อย ๆ ด้วยการเรียนรู้วิธีการรวมฐานข้อมูลเวกเตอร์พัลส์เจ็ทเข้ากับระบบ RAG เต็มรูปแบบเราสามารถได้รับประโยชน์อย่างมากจากความสามารถของมันโดยเฉพาะอย่างยิ่งเมื่อจัดการกับแอปพลิเคชัน RAG บนฐานเอกสารขนาดใหญ่
การตอบสนองของผ้าขี้ริ้วของเราอาจแม่นยำยิ่งขึ้น เพื่อเพิ่มประสิทธิภาพการทำงานของอาร์ตเดโคของเราเรากำลังพิจารณาวิธีการทดลองหลายวิธี:
เราวางแผนที่จะขยายโครงการนี้ผ่านความคิดริเริ่มต่อไปนี้:
เราขอแนะนำให้คุณทดลองกับ Art Deco Chatbot ปรับเปลี่ยนพารามิเตอร์และปรับให้เข้ากับโดเมนที่น่าสนใจของคุณเอง
ผู้แต่ง: Güvenç Usanmaz