Paano Gamitin ang Parent Document Retriever sa LangChain?

Paano Gamitin Ang Parent Document Retriever Sa Langchain



Ang LangChain framework ay nagbibigay-daan sa mga developer na bumuo ng Malaking Modelo ng Wika na makakaunawa at makabuo ng teksto sa natural na wika. Ang mga modelo ng LangChain ay sinanay sa napakalaking dami ng data upang maunawaan ng modelo ang wika sa pamamagitan ng pag-iimbak ng data sa mga vector store. Nagbibigay-daan din ito sa user na bumuo ng mga retriever na maaaring kumuha ng data mula sa database o mga vector store kasama ang lahat ng data na nakaimbak para sa modelo.

Ipapakita ng post na ito ang proseso ng paggamit ng parent document retriever sa LangChain.

Paano Gumamit ng Parent Document Retriever sa LangChain?

Maaaring gamitin ang parent document retriever sa LangChain sa pamamagitan ng paghahati ng mga dokumento sa mas maliliit na piraso upang hindi mawala ang kahulugan nito sa mga sandali ng pag-embed. Ang parent na dokumento ay masasabing ang buong dokumento o ang mas malaking tipak kung saan kinukuha ang mas maliliit na tipak.







Upang matutunan ang proseso ng paggamit ng parent document retriever sa LangChain, tingnan lang ang gabay na ito:



Hakbang 1: I-install ang Mga Module



Una, simulan ang paggamit ng parent document retriever sa pamamagitan ng pag-install ng LangChain framework gamit ang pip command:





pip install langchain

I-install ang module ng database ng Chroma upang i-save ang mga pag-embed ng dokumento at makuha ang data mula dito:



pip install chromadb

Upang i-install ang tiktoken na isang tokenizer na nakakakuha ng mga token ng dokumento sa pamamagitan ng paggawa ng maliliit na chunks:

pip install tiktoken

Kunin ang OpenAI module sa pamamagitan ng pagsasagawa ng sumusunod na command sa Python notebook para makuha ang mga dependency at library nito:

pip install openai

Hakbang 2: I-setup ang Environment at Mag-upload ng Data

Ang susunod na hakbang ay ang itakda ang kapaligiran gamit ang API key mula sa OpenAI account:

angkat ikaw
angkat getpass

ikaw . humigit-kumulang [ 'OPENAI_API_KEY' ] = getpass . getpass ( 'OpenAI API Key:' )

Ngayon, i-upload ang mga dokumento mula sa lokal na sistema pagkatapos i-import ang mga file library at pagkatapos ay tawagan ang upload() na paraan:

mula sa google. ET AL angkat mga file
na-upload = mga file. mag-upload ( )

Hakbang 3: Mag-import ng Mga Aklatan

Ang susunod na hakbang ay naglalaman ng code para sa pag-import ng mga kinakailangang library para sa paggamit ng mga parent document retriever gamit ang LangChain framework:

mula sa langchain. mga retriever angkat ParentDocumentRetriever
mula sa langchain. mga vectorstore angkat Chroma
mula sa langchain. mga paglalagay angkat OpenAIEmbeddings
mula sa langchain. text_splitter angkat RecursiveCharacterTextSplitter
mula sa langchain. imbakan angkat InMemoryStore
mula sa langchain. document_loaders angkat TextLoader

I-load ang dokumento para buuin ang retriever gamit ang TextLoader() na mga pamamaraan na may path ng mga file:

mga loader = [
TextLoader ( 'Data.txt' ) ,
TextLoader ( 'estado_of_the_union.txt' ) ,
]
mga doc = [ ]
para sa l sa mga loader:

Hakbang 4: Pagkuha ng Mga Kumpletong Dokumento

Kapag na-load na ang mga dokumento/file sa modelo, buuin lang ang mga pag-embed ng mga dokumento, at iimbak ang mga ito sa mga vector store:

child_splitter = RecursiveCharacterTextSplitter ( chunk_size = 400 )

vectorstore = Chroma (
collection_name = 'full_documents' ,
pag-embed ng_function = OpenAIEmbeddings ( )
)

tindahan = InMemoryStore ( )
retriever = ParentDocumentRetriever (
vectorstore = vectorstore ,
docstore = tindahan ,
child_splitter = child_splitter ,
)

Ngayon, tawagan ang paraan ng add_documents() gamit ang retriever upang makuha ang retriever sa mga dokumento:

retriever. add_documents ( mga doc , mga id = wala )

Kinukuha ng sumusunod na code ang mga pag-embed ng mga dokumento na nakaimbak sa database para sa mga na-upload na file:

listahan ( tindahan. yield_keys ( ) )

Pagkatapos makuha ang mga pag-embed ng mga dokumento, tawagan ang paraan ng similarity_search() na may query upang makuha ang maliliit na chunks mula sa dokumento:

sub_docs = vectorstore. pagkakatulad_paghahanap ( 'tagapagbigay ng hustisya' )

Tawagan ang print() na paraan upang ipakita ang mga chunks na tinatawag sa nakaraang code batay sa query:

print ( sub_docs [ 0 ] . page_content )

Tawagan ang kumpletong retriever() function upang makuha ang lahat ng mga token na nakaimbak sa database gamit ang sumusunod na code:

retrieved_docs = retriever. get_relevant_documents ( 'tagapagbigay ng hustisya' )

Ang pag-print ng lahat ng mga dokumento ay aabutin ng isang malaking oras at kapangyarihan sa pagproseso, kaya kunin lamang ang haba ng mga dokumentong nakuha dati:

lamang ( retrieved_docs [ 0 ] . page_content )

Hakbang 5: Pagkuha ng Mas Malaking Tipak

Ang hakbang na ito ay hindi kukuha ng buong dokumento; gayunpaman, kukuha ito ng mas malaking chipmunk mula sa dokumento at kukuha ng mas maliit na tipak mula dito:

parent_splitter = RecursiveCharacterTextSplitter ( chunk_size = 2000 )
child_splitter = RecursiveCharacterTextSplitter ( chunk_size = 400 )
vectorstore = Chroma ( collection_name = 'split_parents' , pag-embed ng_function = OpenAIEmbeddings ( ) )
tindahan = InMemoryStore ( )

I-configure ang retriever para makuha ang mas maliit na token mula sa malaking pool ng data na nakaimbak sa “ vectorstore ” variable:

retriever = ParentDocumentRetriever (
vectorstore = vectorstore ,
docstore = tindahan ,
child_splitter = child_splitter ,
parent_splitter = parent_splitter ,
)

Tawagan ang retriever upang makuha ang mas malalaking tipak mula sa mga tindahan ng vector gamit ang mga doc variable sa argumento ng function:

retriever. add_documents ( mga doc )

Kunin ang haba ng mga dokumentong ito mula sa mga doc variable sa pamamagitan ng utos sa ibaba:

lamang ( listahan ( tindahan. yield_keys ( ) ) )

Kumuha lang ng mas maliit na tipak mula sa mas malaki habang ipinapakita ng nakaraang screenshot na mayroong 23 dokumentong nakaimbak sa vector store. Ginagamit ang query upang makuha ang nauugnay na data gamit ang similarity_search() paraan para makuha ang data mula sa vector store:

sub_docs = vectorstore. pagkakatulad_paghahanap ( 'tagapagbigay ng hustisya' )

I-print ang mas maliliit na chunks gamit ang query na binanggit sa nakaraang code upang ipakita ang mga ito sa screen:

print ( sub_docs [ 0 ] . page_content )

Ngayon, gamitin ang retriever sa kumpletong dataset na nakaimbak sa database gamit ang query bilang argumento ng function:

retrieved_docs = retriever. get_relevant_documents ( 'tagapagbigay ng hustisya' )

Kunin ang haba ng kumpletong mga chunks na nilikha at nakaimbak sa database:

lamang ( retrieved_docs [ 0 ] . page_content )

Hindi namin maipapakita ang lahat ng mga tipak, ngunit ang unang tipak na may index number 0 ay ipinapakita gamit ang sumusunod na code:

print ( retrieved_docs [ 0 ] . page_content

Iyon ay tungkol sa proseso ng paggamit ng parent document retriever sa LangChain.

Konklusyon

Para magamit ang parent document retriever sa LangChain, i-install lang ang mga module at i-set up ang OpenAI environment gamit ang API key nito. Pagkatapos nito, i-import ang mga kinakailangang aklatan mula sa LangChain para sa paggamit ng parent document retriever, at pagkatapos ay i-load ang mga dokumento para sa modelo. Maaaring gamitin ng user ang mga parent na dokumento bilang buong dokumento o ang malaking tipak at makakuha ng mas maliit na tipak gamit ang query. Ang post na ito ay nagpapaliwanag sa proseso ng paggamit ng parent document retriever sa LangChain.