Bine ați venit la seria Advanced RAG: Construirea unui chat cu sistemul dvs. de documente
În acest prim videoclip din noua noastră serie despre Advanced RAG (Retrieval Augmented Generation), vom explora arhitectura unui chat de bază cu sistemul dumneavoastră de documente sau pipeline RAG. Vom depăși elementele de bază și vom discuta despre tehnici mai avansate pentru a îmbunătăți conducta.
Bazele unei conducte RAG
Să începem cu elementele de bază ale unei conducte RAG. Arhitectura constă din următoarele componente:
- Document Loader: Această componentă încarcă documentele, cum ar fi fișierele PDF, care vor fi utilizate în sistemul de chat.
- Divizarea în bucăți: documentele sunt împărțite în bucăți mai mici pentru a se potrivi cu fereastra de context a modelului de limbaj (LLM).
- Înglobări: înglobările sunt calculate pentru fiecare bucată, care sunt apoi stocate într-un depozit de vectori pentru a crea un index semantic.
- Recuperare: Când un utilizator pune o întrebare, sistemul calculează înglobări pentru interogare și efectuează o căutare semantică în baza de cunoștințe (magazin de vectori) pentru a prelua documente sau fragmente relevante.
- Reclasificare: documentele sau fragmentele preluate sunt reclasificate în funcție de relevanță.
- Generare: Întrebarea și contextul (documente reclasificate sau bucăți) sunt introduse în LLM pentru a genera răspunsuri.
Aceasta este o prezentare generală de bază a modului în care funcționează o conductă RAG. Dacă ești un începător absolut, nu-ți face griji! Avem o serie de videoclipuri despre crearea conductelor RAG pe care le puteți consulta.
Vă prezentăm Căutarea hibridă
În această nouă serie, ne vom concentra pe îmbunătățirea conductei de bază RAG. Primul subiect pe care îl vom explora este căutarea hibridă.
Căutarea hibridă implică adăugarea a două componente la conducta RAG:
- Căutare bazată pe cuvinte cheie: pe lângă căutarea semantică folosind înglobări, efectuăm și căutare tradițională bazată pe cuvinte cheie pe fragmentele disponibile.
- Ensemble Retriever: în loc să folosim doar retriever-ul bazat pe încorporare, combinăm rezultatele atât de la căutarea bazată pe cuvinte cheie, cât și de la retriever-ul bazat pe încorporare. Acest ansamblu retriever ne permite să atribuim greutăți diferite fiecărei metode de căutare, făcând-o mai puternică.
Acum, că avem o imagine de ansamblu asupra arhitecturii și adăugarea căutării hibride, să aruncăm o privire la un exemplu de cod.
Exemplu de cod
Înainte de a intra în cod, asigurați-vă că aveți instalate pachetele necesare. Vom folosi rank_bm25 pentru căutare hibridă, nestructuratIO pentru citirea fișierelor PDF și chromaDB pentru crearea magazinului de vectori. Dacă lucrați cu documente scanate, sunt recomandate pachete suplimentare pentru interacțiunea cu documentele scanate și efectuarea recunoașterii optice a caracterelor (OCR).
Odată ce pachetele sunt instalate, le putem încărca în codul nostru. Iată un exemplu:
import rank_bm25 import unstructuredIO import chromaDB din lchaintools import ChatPromptTemplate, OutputParser, RunnablePassThrough din lchaintools import EmbeddingModelAPI, LLMModelAPI
În acest exemplu, folosim cea mai recentă versiune a LChain. Importăm pachetele și modulele necesare pentru pipeline-ul nostru RAG, inclusiv șablonul prompt de chat, analizatorul de ieșire, trecerea rulabilă, API-ul model de încorporare și API-ul model LLM.
Apoi, trebuie să încărcăm fișierul PDF și să îl convertim în bucăți. Iată un exemplu:
pdf_loader = unstructuredIO.PDFLoader() docs = pdf_loader.load_file('data/example.pdf') chunk_size = 800 suprapunere = 100 splitter = unstructuredIO.RecursiveCharTextSplitter(chunk_size, overlap = splitter.process)
În acest fragment de cod, folosim încărcătorul PDF pentru a încărca fișierul PDF. Definim apoi dimensiunea bucăților și suprapunerea pentru împărțirea documentelor în bucăți. Divizorul recursiv de text cu caractere este folosit pentru a crea bucățile.
Acum, să trecem la crearea înglobărilor și a magazinului de vectori:
embedding_model = EmbeddingModelAPI('hugging_face_token') vector_store = chromaDB.VectorStore(embedding_model) vector_store.create_vector_store(bucăți)
În acest exemplu, creăm un model de încorporare folosind API-ul Hugging Face. Apoi folosim modelul de încorporare și bucățile pentru a crea depozitul de vectori.
Apoi, am configurat retriever-urile atât pentru căutarea bazată pe încorporare, cât și pentru căutarea bazată pe cuvinte cheie:
embedding_retriever = vector_store.create_retriever(num_chunks=3) keyword_retriever = rank_bm25.BM25Retriever(chunks, num_chunks=3) ensemble_retriever = rank_bm25.EnsembleRetriever([embedding_retriever, keyword.3.]retriever)
În acest fragment de cod, creăm retriever-urile atât pentru căutarea bazată pe încorporare, cât și pentru căutarea bazată pe cuvinte cheie. Ansamblul retriever combină rezultatele ambilor retriever, cu greutăți diferite atribuite fiecăruia.
În cele din urmă, am configurat modelul LLM și șablonul prompt:
llm_model = LLMModelAPI('hugging_face_token') prompt_template = ChatPromptTemplate( system_prompt="Sunteți un asistent AI util care urmează instrucțiunile extrem de bine. Utilizați următorul context pentru a răspunde la întrebarea utilizatorului:", user_prompt="Ce este reglarea instrucțiunilor?", assistant_prompt ="", ) output_parser = OutputParser() chat_template = llm_model.create_chat_template( prompt_template, output_parser, retriever=ensemble_retriever, )
În acest fragment de cod, creăm modelul LLM utilizând API-ul Hugging Face. Apoi am configurat șablonul de prompt pentru chat, inclusiv promptul de sistem, promptul utilizatorului și promptul asistentului. Analizatorul de ieșire este utilizat pentru a analiza răspunsul modelului.
Cu totul configurat, acum putem rula chatul:
user_input = "Ce este reglarea instrucțiunilor?" răspuns = chat_template.invoke(user_input)
În acest exemplu, oferim intrarea utilizatorului și apelăm la invoca funcția de pe șablonul de chat pentru a obține răspunsul modelului.
Concluzie
În acest videoclip, am explorat arhitectura unei conducte RAG de bază și am introdus conceptul de căutare hibridă. De asemenea, am oferit un exemplu de cod despre cum să implementați căutarea hibridă folosind biblioteca LChain. Combinând căutarea bazată pe cuvinte cheie și căutarea bazată pe încorporare, putem îmbunătăți performanța sistemului de chat și putem oferi răspunsuri mai precise.
Dacă ați găsit acest videoclip util, asigurați-vă că vă abonați la canalul nostru pentru mai multe videoclipuri din această serie. Dacă aveți nevoie de asistență cu propriile proiecte, vă oferim servicii de consultanță. Consultați linkurile din descriere pentru mai multe informații.
Vă mulțumim pentru vizionare și ne vedem în următorul videoclip!




