paint-brush
Torohevitra feno momba ny fananganana fampiharana RAG amin'ny fampiasana LangChainny@bexgboost
354 HENOINA
354 HENOINA

Torohevitra feno momba ny fananganana fampiharana RAG amin'ny fampiasana LangChain

ny Bex19m2024/09/03
Read on Terminal Reader

Lava loatra; Mamaky

Ianaro ny fomba fampiasana LangChain, ny rafitra malaza indrindra amin'ny fananganana rafitra RAG. Amin'ny fiafaran'ny lesona dia hanana chatbot isika (miaraka amin'ny interface Streamlit sy ny rehetra) izay RAG amin'ny alàlan'ny angon-drakitra manokana mba hanomezana valiny amin'ireo fanontaniana.
featured image - Torohevitra feno momba ny fananganana fampiharana RAG amin'ny fampiasana LangChain
Bex HackerNoon profile picture

Ireo maodely amin'ny fiteny lehibe ankehitriny dia mahazo fampahalalana tsy mitsaha-mitombo. Na izany aza, mbola misy angon-drakitra tsy miankina be dia be izay tsy azon'ireo modely ireo. Izany no mahatonga ny iray amin'ireo fampiharana malaza indrindra amin'ny LLM eo amin'ny sehatry ny orinasa dia ny taranaka ampitomboina ny famerenana—RAG raha fintinina. amin'ny Vizly , sehatra famakafakana angon-drakitra ampiasain'ny AI, dia nahazo hevitra sarobidy momba ny fananganana rafitra RAG mahomby. Amin'ity lesona ity dia hizara ny sasany amin'ireo fianaranay izahay ary hampiseho aminao ny fomba hamoronana rafitra RAG anao manokana.


Hianatra ny fomba fampiasana LangChain ianao, ilay rafitra malaza indrindra amin'ny fananganana rafitra RAG, mba hananganana rafitra RAG tsotra. Amin'ny fiafaran'ny lesona dia hanana chatbot isika (miaraka amin'ny interface Streamlit sy ny rehetra) izay RAG amin'ny alàlan'ny angon-drakitra manokana mba hanomezana valiny amin'ireo fanontaniana.

Inona ny RAG?

Mba hanazavana ny atao hoe RAG, andeha isika handinika ohatra tsotra.


Mpianatra iray tao amin'ny oniversite iray taona voalohany, Chandler, dia mieritreritra ny handalo kilasy vitsivitsy saingy te-hiantoka fa tsy mandika ny politikan'ny fidirana eny amin'ny oniversite izy. Tahaka ny amin'izao andro izao, mametraka fanontaniana amin'ny ChatGPT izy.


Mazava ho azy fa tsy afaka mamaly izany ny ChatGPT. Tsy moana ny chatbot — tsy afaka miditra amin'ny antontan-taratasin'ny oniversiten'i Chandler fotsiny. Noho izany, i Chandler dia nahita ny antontan-taratasy momba ny politika ary nahita fa famakiana ara-teknika lava be izay tsy tiany hivezivezy. Manome ny antontan-taratasy manontolo amin'ny ChatGPT kosa izy ary mametraka ny fanontaniana indray. Amin'ity indray mitoraka ity dia azony ny valiny.


Tranga iray momba ny taranaka ampitomboina ny famerenana indray izany. Ny valin'ny modelin'ny fiteny (taranaka) dia ampitomboina (ampitomboina) amin'ny alalan'ny teny manodidina nalaina avy amin'ny loharano iray tsy anisan'ny fanofanana tany am-boalohany.


Ny dikan-teny scalable amin'ny rafitra RAG dia afaka mamaly ny fanontanian'ny mpianatra amin'ny alàlan'ny fikarohana ny antontan-taratasin'ny anjerimanontolo, amin'ny fitadiavana ireo mifandraika amin'izany, ary amin'ny fakana ireo lahatsoratra izay mety ahitana ny valiny.


Amin'ny ankapobeny, ao amin'ny rafitra RAG dia maka vaovao avy amin'ny loharanom-baovao tsy miankina ianao ary mamahana azy amin'ny maodely fiteny iray, ahafahan'ny modely manome valiny mifanaraka amin'ny teny manodidina.

Anisan'ny fampiharana RAG

Ny rafitra toy izany, na dia tsotra aza, dia hanana singa mihetsika maro. Alohan'ny hananganana iray ny tenantsika dia mila mandinika ny maha-izy azy sy ny fomba iarahan'izy ireo isika.

Docs

Ny singa voalohany dia antontan-taratasy na fitambarana antontan-taratasy. Mifototra amin'ny karazana rafitra RAG amboarinay, ny antontan-taratasy dia mety ho rakitra lahatsoratra, PDF, pejin-tranonkala (RAG amin'ny angona tsy voarindra) na grafika, SQL, na angona NoSQL (RAG amin'ny angon-drakitra voarafitra). Izy ireo dia ampiasaina hampidirana karazana data isan-karazany ao amin'ny rafitra.

Mpitondra antontan-taratasy

LangChain dia manatanteraka kilasy an-jatony antsoina hoe mpanafatra antontan-taratasy mba hamaky angon-drakitra avy amin'ny loharanom-baovao isan-karazany toy ny PDF, Slack, Notion, Google Drive, sy ny sisa.


Ny kilasin'ny mpanafatra antontan-taratasy tsirairay dia miavaka, saingy mitovy ny fomba fiasa .load() . Ohatra, ity no fomba ahafahanao mampiditra antontan-taratasy PDF sy pejy web amin'ny LangChain:

 from langchain_community.document_loaders import PyPDFLoader, WebBaseLoader # pip install langchain-community pdf_loader = PyPDFLoader("framework_docs.pdf") web_loader = WebBaseLoader( "https://python.langchain.com/v0.2/docs/concepts/#document-loaders" ) pdf_docs = pdf_loader.load() web_docs = web_loader.load()


Ny kilasin'ny PyPDFLoader dia mitantana rakitra PDF amin'ny alàlan'ny fonosana PyPDF2 eo ambanin'ny saron-tava, fa ny WebBaseLoader kosa dia manaisotra ny votoatin'ny pejin-tranonkala nomena.


pdf_docs dia misy antontan-taratasy efatra, iray isaky ny pejy:


 >>> len(pdf_docs) 4


Raha tsy misy afa-tsy iray ihany web_docs :

 >>> print(web_docs[0].page_content[125:300].strip()) You can view the v0.1 docs here.IntegrationsAPI referenceLatestLegacyMorePeopleContributingCookbooks3rd party tutorialsYouTubearXivv0.2v0.2v0.1🦜️🔗LangSmithLangSmith DocsLangCh


Ireo zavatra antontan-taratasy ireo dia omena amin'ny fampidirana modely mba hahatakarana ny dikan'ny semantika ao ambadiky ny lahatsoratra.


Ho an'ny antsipiriany momba ny karazana entana entana hafa, LangChain dia manolotra a pejy manokana momba ny fomba .

Mpizara lahatsoratra

Raha vantany vao nampiditra ny antontan-taratasinao ianao, dia zava-dehibe ny manasaraka azy ireo ho ampahany kely kokoa sy azo fehezina amin'ny lahatsoratra. Ireto ny antony lehibe indrindra:

  1. Maro ny modely fametahana (bebe kokoa amin'izy ireo any aoriana) no manana fetra ambony indrindra.
  2. Ny famerenana dia marina kokoa rehefa manana ampahany kely kokoa ianao.
  3. Ny modely amin'ny fiteny dia omena ny contexte marina.


LangChain dia manolotra karazana mpizara lahatsoratra maro eo ambanin'ny fonony langchain_text_splitters, ary samy hafa izy ireo arakaraka ny karazana antontan-taratasy.

Ity ny fomba fampiasana RecursiveCharacterTextSplitter hanasaraka ny lahatsoratra tsotra mifototra amin'ny lisitry ny mpanasaraka sy ny habeny:

 !pip install langchain_text_splitters from langchain_text_splitters import RecursiveCharacterTextSplitter # Example text text = """ RAG systems combine the power of large language models with external knowledge sources. This allows them to provide up-to-date and context-specific information. The process involves several steps including document loading, text splitting, and embedding. """ # Create a text splitter text_splitter = RecursiveCharacterTextSplitter( chunk_size=50, chunk_overlap=10, length_function=len, separators=["\n\n", "\n", " ", ""], ) # Split the text chunks = text_splitter.split_text(text) # Print the chunks for i, chunk in enumerate(chunks): print(f"Chunk {i + 1}: {chunk}")

Output:

 Chunk 1: RAG systems combine the power of large language Chunk 2: language models with external knowledge sources. Chunk 3: This allows them to provide up-to-date and Chunk 4: and context-specific information. Chunk 5: The process involves several steps including Chunk 6: including document loading, text splitting, and Chunk 7: and embedding.

Ity splitter ity dia maro karazana ary miasa tsara amin'ny tranga fampiasana maro. Izy io dia mamorona ny tapany tsirairay miaraka amin'ny fanisan'ny tarehintsoratra manakaiky ny chunk_size araka izay azo atao. Izy io dia afaka mifamadika miverimberina eo amin'ny fanasarahana hisaraka mba hitazonana ny isan'ny toetra.


Amin'ity ohatra etsy ambony ity, ny mpizara anay dia manandrana mizara amin'ny tsipika vaovao aloha, avy eo amin'ny habaka tokana, ary farany eo anelanelan'ny endri-tsoratra rehetra mba hahatratrarana ny haben'ny sombiny.


Misy mpizara maro hafa ao anaty fonosana langchain_text_splitters . Ireto ny sasany:

  • HTMLSectionSplitter
  • PythonCodeTexSplitter
  • RecursiveJsonSplitter

sy ny sisa. Ny sasany amin'ireo mpizara dia mamorona sombintsombiny manan-danja amin'ny fampiasana modely mpanova eo ambanin'ny kapa.


Ny mpizara lahatsoratra havanana dia misy fiantraikany lehibe amin'ny fanatanterahana ny rafitra RAG.


Raha mila fanazavana manokana momba ny fomba fampiasana splitter lahatsoratra dia jereo ny mifandraika toro-lalana eto .

Fametrahana modely

Raha vao mizara ho lahatsoratra ny antontan-taratasy dia mila asiana kaody ao amin'ny sarin'ny isany, izay fepetra takiana amin'ny maodely kajy rehetra miasa miaraka amin'ny angona lahatsoratra.


Ao amin'ny tontolon'ny RAG, ity encoding ity dia antsoina hoe embedding ary atao amin'ny alàlan'ny embedding models . Mamorona fanehoana vetaveta amin'ny lahatsoratra iray izay mirakitra ny dikan'ny semantika izy ireo. Amin'ny fanolorana lahatsoratra amin'izany fomba izany dia azonao atao ny manao asa matematika amin'izy ireo, toy ny fikarohana ny angon-drakitra antontan-taratasy ho an'ny lahatsoratra mitovitovy amin'ny dikany na fitadiavana valiny amin'ny fanontanian'ny mpampiasa.


LangChain dia manohana ny mpamatsy modely lehibe rehetra, toy ny OpenAI, Cohere, HuggingFace, sy ny sisa. Izy ireo dia ampiharina amin'ny kilasy Embedding ary manome fomba roa: ny iray amin'ny fametahana antontan-taratasy ary ny iray amin'ny fametrahana fanontaniana (fampandrenesana).


Ity misy kaody ohatra iray izay mampiditra ny sombin-tsoratra noforoninay tamin'ny fizarana teo aloha tamin'ny fampiasana OpenAI:

 from langchain_openai import OpenAIEmbeddings # Initialize the OpenAI embeddings embeddings = OpenAIEmbeddings() # Embed the chunks embedded_chunks = embeddings.embed_documents(chunks) # Print the first embedded chunk to see its structure print(f"Shape of the first embedded chunk: {len(embedded_chunks[0])}") print(f"First few values of the first embedded chunk: {embedded_chunks[0][:5]}")


Output:

 Shape of the first embedded chunk: 1536 First few values of the first embedded chunk: [-0.020282309502363205, -0.0015041005099192262, 0.004193042870610952, 0.00229285703971982, 0.007068077567964792]

Ny vokatra etsy ambony dia mampiseho fa ny maodely fametahana dia mamorona virtoaly mirefy 1536 ho an'ny ampahany rehetra ao amin'ny antontan-taratasintsika.


Mba hampidirana fanontaniana tokana dia azonao ampiasaina ny fomba embed_query() :

 query = "What is RAG?" query_embedding = embeddings.embed_query(query) print(f"Shape of the query embedding: {len(query_embedding)}") print(f"First few values of the query embedding: {query_embedding[:5]}")


Output:

 Shape of the query embedding: 1536 First few values of the query embedding: [-0.012426204979419708, -0.016619959846138954, 0.007880032062530518, -0.0170428603887558, 0.011404196731746197]

Vector stores

Amin'ny rindranasa RAG midadasika izay ahafahanao manana antontan-taratasy gigabytes, dia hiafara amin'ny sombin-tsoratra gazillion ianao ary noho izany, vectors. Tsy misy ilana azy ireo raha tsy afaka mitahiry azy ireo amim-pahatokiana ianao.


Izany no mahatonga ny fivarotana vector na angon-drakitra mirongatra ankehitriny. Ankoatra ny fitehirizana ny embeddings anao, ny angon-drakitra vector dia mikarakara ny fanaovana fikarohana véctor ho anao. Ireo angon-drakitra ireo dia optimized mba hahitana haingana ireo vectors mitovitovy indrindra rehefa omena vector fanontaniana, izay tena ilaina amin'ny fakana vaovao mifandraika amin'ny rafitra RAG.


Ity misy sombin-kaody izay mampiditra ny votoatin'ny pejin-tranonkala iray ary mitahiry ireo vectors ao anaty angon-drakitra vector Chroma ( Chroma dia vahaolana angon-drakitra vector open source izay mandeha tanteraka amin'ny milinanao):

 !pip install chromadb langchain_chroma from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitter # Load the web page loader = WebBaseLoader("https://python.langchain.com/v0.2/docs/tutorials/rag/") docs = loader.load() # Split the documents into chunks text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) chunks = text_splitter.split_documents(docs)


Voalohany, mameno ny pejy miaraka amin'ny WebBaseLoader isika ary mamorona ny sombintsika. Avy eo, azontsika atao ny mampita mivantana ireo sombin-javatra amin'ny fomba from_documents an'ny Chroma miaraka amin'ny modely fametahanay safidy:

 from langchain_openai import OpenAIEmbeddings from langchain_chroma import Chroma db = Chroma.from_documents(chunks, OpenAIEmbeddings())


Ny zavatra rehetra momba ny angon-drakitra vetaveta ao amin'ny LangChain dia mampiseho fomba similarity_search izay manaiky tady fangatahana:

 query = "What is indexing in the context of RAG?" docs = db.similarity_search(query) print(docs[1].page_content)


Output:

 If you are interested for RAG over structured data, check out our tutorial on doing question/answering over SQL data.Concepts​A typical RAG application has two main components:Indexing: a pipeline for ingesting data from a source and indexing it. This usually happens offline.Retrieval and generation: the actual RAG chain, which takes the user query at run time and retrieves the relevant data from the index, then passes that to the model.The most common full sequence from raw data to answer looks like:Indexing​Load: First we need to load our data. This is done with Document Loaders.Split: Text splitters break large Documents into smaller chunks. This is useful both for indexing data and for passing it in to a model, since large chunks are harder to search over and won't fit in a model's finite context window.Store: We need somewhere to store and index our splits, so that they can later be searched over. This is often done using a VectorStore and Embeddings model.Retrieval and

Ny vokatry ny similarity_search dia lisitr'ireo antontan-taratasy izay azo inoana fa misy ny fampahalalana angatahinay amin'ny fanontaniana.


Raha mila fanazavana manokana momba ny fampiasana ny fivarotana vector dia jereo ny mifandraika toro-lalana eto .

Retrievers

Na dia manohana ny famerenana amin'ny endrika fikarohana mitovy aza ny fivarotana vector rehetra, ny LangChain dia mametraka interface tsara Retriever izay mamerina ireo antontan-taratasy nomena fanontaniana tsy voarindra. Mila mamerina na maka antontan-taratasy fotsiny ny retriever fa tsy mitahiry azy.


Toy izao ny fomba ahafahanao mamadika fivarotana vector ho retriever ao amin'ny LangChain:

 # Convert the vector store to a retriever chroma_retriever = db.as_retriever() docs = chroma_retriever.invoke("What is indexing in the context of RAG?") >>> len(docs) 4


Azo atao ny mametra ny isan'ny antontan-taratasy mifandraika amin'ny top k amin'ny fampiasana search_kwargs :

 chroma_retriever = db.as_retriever(search_kwargs={"k": 1}) docs = chroma_retriever.invoke("What is indexing in the context of RAG?") >>> len(docs) 1

Azonao atao ny mampita masontsivana hafa mifandraika amin'ny fikarohana mankany amin'ny search_kwargs. Mianara bebe kokoa momba ny fampiasana retriever avy amin'ny tari-dalana manokana .

Dingana-by-dingana Workflow amin'ny fananganana RAG App ao amin'ny LangChain

Ankehitriny rehefa nandrakotra ireo singa manan-danja amin'ny rafitra RAG isika dia hanangana iray ny tenantsika. Hitondra anao amin'ny fampiharana tsikelikely ny RAG chatbot natao manokana ho an'ny antontan-taratasy sy fampianarana kaody aho. Ho hitanao fa tena ilaina izany rehefa mila fanampiana kaody AI ho an'ny rafitra vaovao na endri-javatra vaovao amin'ny rafitra efa misy izay tsy mbola ao anatin'ny fototry ny fahalalana an'ny LLM ankehitriny.

0. Famoronana ny rafitry ny tetikasa

Voalohany, fenoy ny lahatahiry miasa miaraka amin'ity rafitra tetikasa manaraka ity:

 rag-chatbot/ ├── .gitignore ├── requirements.txt ├── README.md ├── app.py ├── src/ │ ├── __init__.py │ ├── document_processor.py │ └── rag_chain.py └── .streamlit/ └── config.toml


Ireto ny baiko:

 $ touch .gitignore requirements.txt README.md app.py $ mkdir src .streamlit $ touch src/{.env,__init__.py,document_processor.py,rag_chain.py} $ touch .streamlit/{.env,config.toml}

1. Fametrahana ny tontolo iainana

Amin'ity dingana ity dia mamorona tontolo Conda vaovao ianao ary manetsika azy:

 $ conda create -n rag_tutorial python=3.9 -y $ conda activate rag_tutorial


Avy eo, sokafy ny rakitra requirements.txt ary apetaho ireto fiankinana manaraka ireto:

 langchain==0.2.14 langchain_community==0.2.12 langchain_core==0.2.35 langchain_openai==0.1.22 python-dotenv==1.0.1 streamlit==1.37.1 faiss-cpu pypdf

ary hametraka azy ireo:

 $ pip install -r requirements.txt


Ary koa, mamorona rakitra .gitignore hanafina rakitra amin'ny git indexing:

 # .gitignore venv/ __pycache__/ .env *.pdf *.png *.jpg *.jpeg *.gif *.svg

2. Mametraka mpanentana antontan-taratasy

Avy eo, sokafy ny rakitra src/document_processor.py ary apetaho ireo sombin-kaody ho avy.


Ny fanafarana ilaina:

 import logging from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.text_splitter import Language from langchain_community.document_loaders import PyPDFLoader from langchain_community.document_loaders.parsers.pdf import ( extract_from_images_with_rapidocr, ) from langchain.schema import Document


Fanazavana ny fanafarana:

  • RecursiveCharacterTextSplitter : Manasaraka lahatsoratra ho ampahany kely kokoa miverimberina.
  • Language : Enum mba hamaritana fiteny fandaharana amin'ny fizarana lahatsoratra.
  • PyPDFLoader : Mamindra sy maka lahatsoratra amin'ny rakitra PDF.
  • extract_from_images_with_rapidocr : OCR miasa amin'ny fakana lahatsoratra amin'ny sary.
  • Document : maneho antontan-taratasy misy atiny sy metadata.
  • logging : Manome fampiasa logging ho an'ny debugging sy fampahalalana.


Avy eo, asa iray amin'ny fanodinana PDF:

 def process_pdf(source): loader = PyPDFLoader(source) documents = loader.load() # Filter out scanned pages unscanned_documents = [doc for doc in documents if doc.page_content.strip() != ""] scanned_pages = len(documents) - len(unscanned_documents) if scanned_pages > 0: logging.info(f"Omitted {scanned_pages} scanned page(s) from the PDF.") if not unscanned_documents: raise ValueError( "All pages in the PDF appear to be scanned. Please use a PDF with text content." ) return split_documents(unscanned_documents)


Toy izao ny fandehany:

  1. Mametraka ny PDF mampiasa PyPDFLoader izy io.
  2. Manasivana pejy notarafina izy io amin'ny fanesorana ireo antontan-taratasy misy votoaty foana.
  3. Izy io dia mitanisa ny isan'ny pejy voailika, raha misy.
  4. Raha jerena ny pejy rehetra (izany hoe, tsy misy atiny lahatsoratra), dia miteraka ValueError izany.
  5. Farany, mizara ireo antontan-taratasy sisa tsy voasoka ho ampahany kely kokoa amin'ny fampiasana ny asa split_documents.

Ny fiasa dia mitantana ireo tranga izay mety ahitana PDF mifangaro lahatsoratra sy pejy voasokajy, miantoka fa ny pejy mifototra amin'ny lahatsoratra ihany no voakarakara bebe kokoa. Tena ilaina izany amin'ny asa famakafakana lahatsoratra izay tsy azo ampiasaina ny pejy voa-scan tsy misy OCR. Hofaritantsika ny fiasan'ny split_documents any aoriana.


Manaraka izany dia manoratra fiasa izahay haka ny vaovao avy amin'ny sary (sarin'ny sombin-kaody sy/na pejin-tranonkala):


 def process_image(source): # Extract text from image using OCR with open(source, "rb") as image_file: image_bytes = image_file.read() extracted_text = extract_from_images_with_rapidocr([image_bytes]) documents = [Document(page_content=extracted_text, metadata={"source": source})] return split_documents(documents)


Ity fiasa ity dia manodina rakitra sary amin'ny alàlan'ny fakana lahatsoratra amin'ny alàlan'ny OCR (Optical Character Recognition). Mamaky ny rakitra sary izy, mamadika azy ho bytes, ary avy eo dia mampiasa ny tranomboky RapidOCR hanesorana lahatsoratra avy amin'ny sary. Ny lahatsoratra nalaina avy eo dia fonosina ao anaty zavatra Document misy metadata misy ny lalan'ny rakitra loharano. Farany, ny asa dia mizara ny antontan-taratasy ho kely kokoa amin'ny fampiasana ny split_documents function, izay faritanay manaraka:


 def split_documents(documents): # Split documents into smaller chunks for processing text_splitter = RecursiveCharacterTextSplitter.from_language( language=Language.PYTHON, chunk_size=1000, chunk_overlap=200 ) return text_splitter.split_documents(documents)


Ny fiasa dia mampiasa ny kilasy RecursiveCharacterTextSplitter miaraka amin'ny syntax an'i Python mba hizarana lahatsoratra ho sombin-tsoratra 1000 sy tarehintsoratra 200 mifanindry.


Ny asa farany ataonay dia manambatra ny PDF sy ny parser sary ho iray:


 def process_document(source): # Determine file type and process accordingly if source.lower().endswith(".pdf"): return process_pdf(source) elif source.lower().endswith((".png", ".jpg", ".jpeg")): return process_image(source) else: raise ValueError(f"Unsupported file type: {source}")


Ity asa farany ity dia hampiasain'ny Streamlit UI midina andalana mba hamoronana, hampidirana ary hitahiry sombiny avy amin'ireo antontan-taratasy nomena ary hampita azy ireo any amin'ny singa RAG amin'ny rafitray.

3. Fametrahana RAG

Ankehitriny, sokafy ny rakitra src/rag_chain.py ary apetaho ireo sombin-kaody ho avy.


Voalohany, manafatra modules ilaina:


 import os from dotenv import load_dotenv from langchain.prompts import PromptTemplate from langchain_community.vectorstores import FAISS from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain_openai import ChatOpenAI, OpenAIEmbeddings # Load the API key from env variables load_dotenv() api_key = os.getenv("OPENAI_API_KEY")


Ity misy fanazavana momba ny fanafarana:

os : Fifandraisana amin'ny rafitra miasa • dotenv : Enta-mavesatra ny tontolo iainana • singa langchain :

  • PromptTemplate : Famoronana haingana haingana
  • FAISS : Fivarotana vector maivana ho an'ny antontan-taratasy
  • StrOutputParser : Manova ny zavatra hafatra LLM ho lasa vokatra tady
  • RunnablePassthrough : Mamorona rojo azo fehezina
  • ChatOpenAI , OpenAIEmbeddings : Fifandraisana modely OpenAI


Manaraka, mamorona ny bitsika ho an'ny rafitra RAG izahay:


 RAG_PROMPT_TEMPLATE = """ You are a helpful coding assistant that can answer questions about the provided context. The context is usually a PDF document or an image (screenshot) of a code file. Augment your answers with code snippets from the context if necessary. If you don't know the answer, say you don't know. Context: {context} Question: {question} """ PROMPT = PromptTemplate.from_template(RAG_PROMPT_TEMPLATE)


Ny rafitra RAG dia iray amin'ireo antony lehibe amin'ny fahombiazany. Ny dikan-tsika dia tsotra fa hahavita ny asa matetika. Amin'ny fampiharana, mandany fotoana betsaka amin'ny famerenana sy fanatsarana ny bitsika ianao.


Raha tsikaritrareo dia mampiasa kilasy PromptTemplate izahay amin'ny fananganana ny bitsika. Ity fananganana ity dia ahafahantsika miditra amin'ny fomba mavitrika ny contexte nalaina avy amin'ny antontan-taratasy sy ny fanontanian'ny mpampiasa ho bitsika farany.


Raha miresaka momba ny antontan-taratasy isika dia mila fiasa hamolavola azy ireo alohan'ny handefasana azy ireo ho contexte ao amin'ny bitsika rafitra:


 def format_docs(docs): return "\n\n".join(doc.page_content for doc in docs)


Izy io dia fiasa tsotra izay mampifandray ny votoatin'ny pejy misy ireo antontan-taratasy nalaina.


Farany, mamorona fiasa izay hampivelatra ny rojo RAG izahay:


 def create_rag_chain(chunks): embeddings = OpenAIEmbeddings(api_key=api_key) doc_search = FAISS.from_documents(chunks, embeddings) retriever = doc_search.as_retriever( search_type="similarity", search_kwargs={"k": 5} ) llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0) rag_chain = ( {"context": retriever | format_docs, "question": RunnablePassthrough()} | PROMPT | llm | StrOutputParser() ) return rag_chain


Ny asa dia manaiky sombin-taratasy, izay homen'ny process_document asa ao anaty document_processor.py script.

Ny fiasa dia manomboka amin'ny famaritana ny modely fampidirana sy ny fitehirizana ny antontan-taratasy ao amin'ny fivarotana vector FAISS. Avy eo, avadika ho interface retriever miaraka amin'ny fikarohana fitoviana izay mamerina ireo antontan-taratasy dimy ambony mifanaraka amin'ny fanontanian'ny mpampiasa.


Ho an'ny maodely fiteny dia hampiasa gpt-4o-mini izahay fa afaka mampiasa modely hafa toa ny GPT-4o ianao arakaraka ny teti-bola sy ny filanao.

Avy eo, hatambatra ireo singa rehetra ireo amin'ny fampiasana LangChain Expression Language (LCEL). Ny singa voalohany amin'ny rojo dia rakibolana misy context sy question ho fanalahidy. Ny soatoavin'ireo fanalahidy ireo dia omen'ny retriever namboarin'ny asa fandrafetana anay sy ny RunnablePassthrough() , tsirairay avy. Ny kilasy farany dia miasa toy ny toerana misy ny fanontanian'ny mpampiasa.


Ampidirina ao amin'ny bitsikan'ny rafitray ny rakibolana avy eo; Ny bitsika dia omena amin'ny LLM, izay miteraka kilasy hafatra mivoaka. Ny kilasin'ny hafatra dia omena amin'ny parser famoahana tady izay mamerina valin-teny tsotra.

4. Mamorona UI Streamlit

Amin'ity fizarana ity dia hanangana ny UI eto ambany izahay ho an'ny fampiharana anay:


Ny pikantsarin'ny Streamlit UI.

Izy io dia interface tsara sy kely indrindra miaraka amin'ny saha fampidirana roa - ny iray ho an'ny antontan-taratasy, ny iray ho an'ny fametrahana fanontaniana momba ny antontan-taratasy. Ao amin'ny sisiny havia, angatahina ny mpampiasa hampiditra ny fanalahidin'ny API.


Mba hananganana ny interface, sokafy ny script app.py amin'ny ambaratonga ambony indrindra amin'ny lahatahiry miasa ary apetaho ity code manaraka ity:


 import streamlit as st import os from dotenv import load_dotenv from src.document_processor import process_document from src.rag_chain import create_rag_chain # Load environment variables load_dotenv() st.set_page_config(page_title="RAG Chatbot", page_icon="🤖") st.title("RAG Chatbot") # Initialize session state if "rag_chain" not in st.session_state: st.session_state.rag_chain = None # Sidebar for API key input with st.sidebar: api_key = st.text_input("Enter your OpenAI API Key", type="password") if api_key: os.environ["OPENAI_API_KEY"] = api_key # File uploader uploaded_file = st.file_uploader("Choose a file", type=["pdf", "png", "jpg", "jpeg"]) if uploaded_file is not None: if st.button("Process File"): if api_key: with st.spinner("Processing file..."): # Save the uploaded file temporarily with open(uploaded_file.name, "wb") as f: f.write(uploaded_file.getbuffer()) try: # Process the document chunks = process_document(uploaded_file.name) # Create RAG chain st.session_state.rag_chain = create_rag_chain(chunks) st.success("File processed successfully!") except ValueError as e: st.error(str(e)) finally: # Remove the temporary file os.remove(uploaded_file.name) else: st.error("Please provide your OpenAI API key.") # Query input query = st.text_input("Ask a question about the uploaded document") if st.button("Ask"): if st.session_state.rag_chain and query: with st.spinner("Generating answer..."): result = st.session_state.rag_chain.invoke(query) st.subheader("Answer:") st.write(result) elif not st.session_state.rag_chain: st.error("Please upload and process a file first.") else: st.error("Please enter a question.")


Na dia tsipika 65 monja aza ny halavany, dia mampihatra ireto fiasa manaraka ireto izy:

  1. Fampidirana fanalahidin'ny API: Mamela ny mpampiasa hampiditra ny fanalahidin'ny OpenAI API azo antoka.
  2. Fampidirana rakitra: Manohana ny fandefasana rakitra PDF, PNG, JPG, ary JPEG.
  3. Fanodinana ny antontan-taratasy: Manamboatra ny rakitra nampidirina ary mamorona sombin-tsoratra.
  4. Famoronana rojo RAG: Manangana rojom-pamokarana azo ampitomboina amin'ny alàlan'ny sombin-taratasy voavoatra.
  5. Fikarakarana fanontaniana: Manaiky ny fanontanian'ny mpampiasa momba ny antontan-taratasy nampidirina.
  6. Famoahana valiny: Mampiasa ny rojo RAG hamokatra valiny mifototra amin'ny antontan-taratasy sy ny fanontanian'ny mpampiasa.
  7. Fikarakarana hadisoana: Manome hafatra diso mety ho an'ny fanalahidin'ny API tsy hita, rakitra tsy voavoatra, na fanontaniana foana.
  8. Tamberin'ny mpampiasa: Mampiseho spinners mandritra ny fanodinana sy hafatra fahombiazana/diso mba hampahafantarana ny mpampiasa.
  9. Fitantanana fanjakana: Mampiasa ny toetry ny fotoam-pivorian'i Streamlit hitazomana ny rojo RAG manerana ny fifandraisana.

5. Mampiasa toy ny chatbot Streamlit

Dingana iray sisa no tavela — ny fametrahana ny fampiharana Streamlit. Misy safidy maro eto fa ny fomba mora indrindra dia ny fampiasana Streamlit Cloud, izay maimaim-poana sy mora apetraka.


Voalohany, sokafy ny script .streamlit/config.toml ary apetaho ireto fanitsiana manaraka ireto:


 [theme] primaryColor = "#F63366" backgroundColor = "#FFFFFF" secondaryBackgroundColor = "#F0F2F6" textColor = "#262730" font = "sans serif"


Fanitsiana lohahevitra avy amin'ny safidin'ny tena manokana ireo. Avy eo, soraty ny rakitra README.md (azonao atao ny mandika ny votoatiny avy amin'ity rakitra nampiantranoana ity ao amin'ny GitHub ).


Farany, mandehana any GitHub.com ary mamorona tahiry vaovao. Adikao ny rohiny ary avereno any amin'ny lahatahiry miasa:


 $ git init $ git add . $ git commit -m "Initial commit" $ git remote add origin https://github.com/YourUsername/YourRepo.git $ git push --set-upstream origin master


Ny baiko etsy ambony dia manomboka ny Git, mamorona commit voalohany ary manosika ny zava-drehetra ho any amin'ny tahiry (aza adino ny manolo ny rohy repo amin'ny anao).


Ankehitriny, tsy maintsy misoratra anarana amin'ny kaonty maimaim-poana ao amin'ny Streamlit Cloud ianao. Ampifandraiso ny kaontinao GitHub ary safidio ny tahiry misy ny fampiharanao.


Avy eo, amboary ny firafitry ny app:

  • Apetraho ny dikan-teny Python (oh: 3.9)
  • Apetraho amin'ny app.py ny làlan'ny rakitra lehibe
  • Ampio izay tsiambaratelo ilaina (toy OPENAI_API_KEY ) ao amin'ny kiran'ny fampiharana


Farany, tsindrio ny "Deploy"!


Tsy maintsy miasa ao anatin'ny minitra vitsy ny fampiharana. Ny fampiharana novokariko ho an'ity fampianarana ity dia azo jerena ato amin'ity rohy ity . Andramo izany!

Ny rafitra RAG miasa

Famaranana

Ity lesona ity dia mijery ny fifangaroana mahery vaika amin'ny Retrieval-Augmented Generation (RAG) sy Streamlit izay mamorona rafitra famaliana fanontaniana mifototra amin'ny antontan-taratasy. Mitaky ny mpamaky amin'ny dingana rehetra izany, manomboka amin'ny fametrahana tontolo iainana sy ny fanodinana antontan-taratasy ka hatramin'ny fananganana rojo RAG ary ny fametrahana fampiharana tranonkala mahafinaritra.


Hevi-dehibe dia ahitana:

  • RAG ho an'ny maodely fiteny marani-tsaina kokoa (amin'ny dikan'ny fahalalana ivelany).
  • Ny rojo RAG dia azo amboarina amin'ny alàlan'ny LangChain, ny maodelin'i OpenAI, ary ny fampidirana vondron'olona fahatelo.
  • Ny fampiharana dia azo atao interactive amin'ny alàlan'ny Streamlit ary apetraka ho an'ny besinimaro.


Ity tetikasa ity no fototry ny fampiharana izay mandroso kokoa. Azo itarina amin'ny fomba lehibe izy io, toy ny fampidirana karazana antontan-taratasy maro, fanatsarana ny fahamarinan'ny famerenana, ary ny endri-javatra toy ny famintinana ny antontan-taratasy. Na izany aza, ny tena ataony dia ny fanehoana ny herin'ireo teknolojia ireo, tsirairay na mitambatra.