Artificiell allmÀn intelligens
Bygga LLM-agenter för RAG frÄn grunden och bortom: En omfattande guide

LLM som GPT-3, GPT-4 och deras motsvarighet med öppen kÀllkod kÀmpar ofta med uppdaterad informationssökning och kan ibland generera hallucinationer eller felaktig information.
Retrieval-Augmented Generation (RAG) Àr en teknik som kombinerar kraften hos LLM med extern kunskapsinhÀmtning. RAG tillÄter oss att grunda LLM-svar i saklig, uppdaterad information, vilket avsevÀrt förbÀttrar noggrannheten och tillförlitligheten hos AI-genererat innehÄll.
I det hÀr blogginlÀgget utforskar vi hur man bygger LLM-agenter för RAG frÄn grunden, och fördjupar sig i arkitekturen, implementeringsdetaljerna och avancerade tekniker. Vi tÀcker allt frÄn grunderna i RAG till att skapa sofistikerade agenter som kan utföra komplexa resonemang och uppgifter.
Innan vi börjar bygga vÄr LLM-agent, lÄt oss förstÄ vad RAG Àr och varför det Àr viktigt.
RAG, eller Retrieval-Augmented Generation, Àr en hybrid metod som kombinerar informationshÀmtning med textgenerering. I ett RAG-system:
- En frÄga anvÀnds för att hÀmta relevanta dokument frÄn en kunskapsbas.
- Dessa dokument matas sedan in i en sprÄkmodell tillsammans med den ursprungliga frÄgan.
- Modellen genererar ett svar baserat pÄ bÄde frÄgan och den hÀmtade informationen.
Detta tillvÀgagÄngssÀtt har flera fördelar:
- FörbÀttrad noggrannhet: Genom att jorda svar i hÀmtad information minskar RAG hallucinationer och förbÀttrar faktaprecisionen.
- Uppdaterad information: Kunskapsbasen kan uppdateras regelbundet, vilket gör att systemet kan komma Ät aktuell information.
- Ăppenhet: Systemet kan tillhandahĂ„lla kĂ€llor för sin information, öka förtroendet och möjliggöra faktakontroll.
FörstÄ LLM-agenter
NÀr du stÄr inför ett problem utan ett enkelt svar behöver du ofta följa flera steg, tÀnka noga och komma ihÄg vad du redan har provat. LLM-agenter Àr designade för exakt den hÀr typen av situationer i sprÄkmodellapplikationer. De kombinerar grundlig dataanalys, strategisk planering, datahÀmtning och förmÄgan att lÀra av tidigare ÄtgÀrder för att lösa komplexa problem.
Vad Àr LLM-agenter?
LLM-agenter Àr avancerade AI-system designade för att skapa komplex text som krÀver sekventiellt resonemang. De kan tÀnka framÄt, komma ihÄg tidigare konversationer och anvÀnda olika verktyg för att justera sina svar baserat pÄ situationen och stilen som behövs.
ĂvervĂ€g en frĂ„ga inom det juridiska omrĂ„det som: "Vilka Ă€r de potentiella rĂ€ttsliga resultaten av en specifik typ av kontraktsbrott i Kalifornien?" En grundlĂ€ggande LLM med ett RAG-system (Retrieval Augmented Generation) kan hĂ€mta nödvĂ€ndig information frĂ„n juridiska databaser.
För ett mer detaljerat scenario: âVilka Ă€r de vanligaste juridiska utmaningarna som företag stĂ„r inför med tanke pĂ„ nya dataskyddslagar, och hur har domstolarna hanterat dessa frĂ„gor?â Denna frĂ„ga gĂ„r djupare Ă€n att bara slĂ„ upp fakta. Det handlar om att förstĂ„ nya regler, deras inverkan pĂ„ olika företag och domstolarnas svar. En jurist skulle dela upp denna uppgift i deluppgifter, sĂ„som att hĂ€mta de senaste lagarna, analysera historiska fall, sammanfatta juridiska dokument och prognostisera trender baserat pĂ„ mönster.
Komponenter i LLM-agenter
LLM-agenter bestÄr i allmÀnhet av fyra komponenter:
- Agent/hjÀrna: KÀrnsprÄksmodellen som bearbetar och förstÄr sprÄk.
- Planering: FörmÄgan att resonera, bryta ner uppgifter och utveckla specifika planer.
- Minne: UpprÀtthÄller register över tidigare interaktioner och lÀr sig av dem.
- AnvÀndning av verktyg: Integrerar olika resurser för att utföra uppgifter.
Agent/hjÀrna
KÀrnan i en LLM-agent Àr en sprÄkmodell som bearbetar och förstÄr sprÄk baserat pÄ stora mÀngder data som den har trÀnats pÄ. Du börjar med att ge den en specifik uppmaning, vÀgleda agenten om hur den ska svara, vilka verktyg som ska anvÀndas och mÄlen att sikta mot. Du kan anpassa agenten med en persona som lÀmpar sig för sÀrskilda uppgifter eller interaktioner, vilket förbÀttrar dess prestanda.
Minne
Minneskomponenten hjÀlper LLM-agenter att hantera komplexa uppgifter genom att föra register över tidigare ÄtgÀrder. Det finns tvÄ huvudtyper av minne:
- Korttidsminne: Fungerar som ett anteckningsblock och hÄller reda pÄ pÄgÄende diskussioner.
- LÄngtids minne: Fungerar som en dagbok, lagrar information frÄn tidigare interaktioner för att lÀra sig mönster och fatta bÀttre beslut.
Genom att blanda dessa typer av minne kan agenten erbjuda mer skrÀddarsydda svar och komma ihÄg anvÀndarpreferenser över tid, vilket skapar en mer sammankopplad och relevant interaktion.
Planering
Planering gör det möjligt för LLM-agenter att resonera, bryta upp uppgifter i hanterbara delar och anpassa planer allteftersom uppgifterna utvecklas. Planeringen omfattar tvÄ huvudsteg:
- Planformulering: Dela upp en uppgift i mindre deluppgifter.
- Planreflektion: Granska och utvÀrdera planens effektivitet, inkludera feedback för att förfina strategier.
Metoder som Chain of Thought (CoT) och Tree of Thought (ToT) hjÀlper till i denna nedbrytningsprocess, vilket gör att agenter kan utforska olika vÀgar för att lösa ett problem.
För att grÀva djupare in i AI-agenternas vÀrld, inklusive deras nuvarande kapacitet och potential, övervÀg att lÀsa "Auto-GPT & GPT-Engineer: En djupgÄende guide till dagens ledande AI-agenter"
StÀlla in miljön
För att bygga vÄr RAG-agent behöver vi konfigurera vÄr utvecklingsmiljö. Vi kommer att anvÀnda Python och flera viktiga bibliotek:
- Langkedja: För orkestrering av vÄra LLM- och hÀmtningskomponenter
- Chroma: Som vÄr vektorbutik för dokumentinbÀddningar
- OpenAI:s GPT-modeller: Som vÄr bas LLM (du kan ersÀtta detta med en öppen kÀllkodsmodell om sÄ önskas)
- FastAPI: För att skapa ett enkelt API för att interagera med vÄr agent
LÄt oss börja med att stÀlla in vÄr miljö:
# Create a new virtual environment python -m venv rag_agent_env source rag_agent_env/bin/activate # On Windows, use `rag_agent_env\Scripts\activate` # Install required packages pip install langchain chromadb openai fastapi uvicorn
Nu ska vi skapa en ny Python-fil som heter rag_agent.py och importera de nödvÀndiga biblioteken:
from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.text_splitter import CharacterTextSplitter from langchain.llms import OpenAI from langchain.chains import RetrievalQA from langchain.document_loaders import TextLoader import os # Set your OpenAI API key os.environ["OPENAI_API_KEY"] = "your-api-key-here"
Att bygga ett enkelt RAG-system
Nu nÀr vi har konfigurerat vÄr miljö, lÄt oss bygga ett grundlÀggande RAG-system. Vi börjar med att skapa en kunskapsbas frÄn en uppsÀttning dokument och anvÀnder sedan detta för att besvara frÄgor.
Steg 1: Förbered dokumenten
Först mÄste vi ladda och förbereda vÄra dokument. I det hÀr exemplet antar vi att vi har en textfil som heter knowledge_base.txt med information om AI och maskininlÀrning.
# Load the document loader = TextLoader("knowledge_base.txt") documents = loader.load() # Split the documents into chunks text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) # Create embeddings embeddings = OpenAIEmbeddings() # Create a vector store vectorstore = Chroma.from_documents(texts, embeddings)
Steg 2: Skapa en hÀmtningsbaserad QA-kedja
Nu nÀr vi har vÄr vektorbutik kan vi skapa en hÀmtningsbaserad QA-kedja:
# Create a retrieval-based QA chain qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=vectorstore.as_retriever())
Steg 3: FrÄga systemet
Vi kan nu frÄga vÄrt RAG-system:
query = "What are the main applications of machine learning?" result = qa.run(query) print(result)
Steg 4: Skapa en LLM-agent
Ăven om vĂ„rt enkla RAG-system Ă€r anvĂ€ndbart, Ă€r det ganska begrĂ€nsat. LĂ„t oss förbĂ€ttra det genom att skapa en LLM-agent som kan utföra mer komplexa uppgifter och resonera kring informationen den hĂ€mtar.
En LLM-agent Àr ett AI-system som kan anvÀnda verktyg och fatta beslut om vilka ÄtgÀrder som ska vidtas. Vi skapar en agent som inte bara kan svara pÄ frÄgor utan Àven utföra webbsökningar och grundlÀggande berÀkningar.
LÄt oss först definiera nÄgra verktyg för vÄr agent:
from langchain.agents import Tool from langchain.tools import DuckDuckGoSearchRun from langchain.tools import BaseTool from langchain.agents import initialize_agent from langchain.agents import AgentType # Define a calculator tool class CalculatorTool(BaseTool): name = "Calculator" description = "Useful for when you need to answer questions about math" def _run(self, query: str) try: return str(eval(query)) except: return "I couldn't calculate that. Please make sure your input is a valid mathematical expression." # Create tool instances search = DuckDuckGoSearchRun() calculator = CalculatorTool() # Define the tools tools = [Tool(name="Search",func=search.run,description="Useful for when you need to answer questions about current events"), Tool(name="RAG-QA",func=qa.run,description="Useful for when you need to answer questions about AI and machine learning"), Tool(name="Calculator",func=calculator._run,description="Useful for when you need to perform mathematical calculations") ] # Initialize the agent agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True )
Nu har vi en agent som kan anvÀnda vÄrt RAG-system, utföra webbsökningar och göra berÀkningar. LÄt oss testa det:
result = agent.run("What's the difference between supervised and unsupervised learning? Also, what's 15% of 80?") print(result)
Denna agent visar en viktig fördel med LLM-agenter: de kan kombinera flera verktyg och resonemangssteg för att svara pÄ komplexa frÄgor.
FörbÀttra agenten med avancerade RAG-tekniker
Ăven om vĂ„rt nuvarande RAG-system fungerar bra, finns det flera avancerade tekniker vi kan anvĂ€nda för att förbĂ€ttra dess prestanda:
a) Semantisk sökning med tÀtpassagehÀmtning (DPR)
IstÀllet för att anvÀnda enkel inbÀddningsbaserad hÀmtning kan vi implementera DPR för mer exakt semantisk sökning:
from transformers import DPRQuestionEncoder, DPRContextEncoder question_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base") context_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base") # Function to encode passages def encode_passages(passages): return context_encoder(passages, max_length=512, return_tensors="pt").pooler_output # Function to encode query def encode_query(query): return question_encoder(query, max_length=512, return_tensors="pt").pooler_output
b) FrÄgeexpansion
Vi kan anvÀnda frÄgeexpansion för att förbÀttra hÀmtningsprestandan:
from transformers import T5ForConditionalGeneration, T5Tokenizer model = T5ForConditionalGeneration.from_pretrained("t5-small") tokenizer = T5Tokenizer.from_pretrained("t5-small") def expand_query(query): input_text = f"expand query: {query}" input_ids = tokenizer.encode(input_text, return_tensors="pt") outputs = model.generate(input_ids, max_length=50, num_return_sequences=3) expanded_queries = [tokenizer.decode(output, skip_special_tokens=True) for output in outputs] return expanded_queries
c) Iterativ förfining
Vi kan implementera en iterativ förfiningsprocess dÀr agenten kan stÀlla uppföljningsfrÄgor för att förtydliga eller utöka dess initiala hÀmtning:
def iterative_retrieval(initial_query, max_iterations=3): query = initial_query for _ in range(max_iterations): result = qa.run(query) clarification = agent.run(f"Based on this result: '{result}', what follow-up question should I ask to get more specific information?") if clarification.lower().strip() == "none": break query = clarification return result # Use this in your agent's process
Implementering av ett Multi-Agent-system
För att hantera mer komplexa uppgifter kan vi implementera ett system med flera agenter dÀr olika agenter specialiserar sig pÄ olika omrÄden. HÀr Àr ett enkelt exempel:
class SpecialistAgent: def __init__(self, name, tools): self.name = name self.agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) def run(self, query): return self.agent.run(query) # Create specialist agents research_agent = SpecialistAgent("Research", [Tool(name="RAG-QA", func=qa.run, description="For AI and ML questions")]) math_agent = SpecialistAgent("Math", [Tool(name="Calculator", func=calculator._run, description="For calculations")]) general_agent = SpecialistAgent("General", [Tool(name="Search", func=search.run, description="For general queries")]) class Coordinator: def __init__(self, agents): self.agents = agents def run(self, query): # Determine which agent to use if "calculate" in query.lower() or any(op in query for op in ['+', '-', '*', '/']): return self.agents['Math'].run(query) elif any(term in query.lower() for term in ['ai', 'machine learning', 'deep learning']): return self.agents['Research'].run(query) else: return self.agents['General'].run(query) coordinator = Coordinator({'Research': research_agent, 'Math': math_agent, 'General': general_agent}) # Test the multi-agent system result = coordinator.run("What's the difference between CNN and RNN? Also, calculate 25% of 120.") print(result)
Detta multiagentsystem möjliggör specialisering och kan hantera ett bredare utbud av frÄgor mer effektivt.
UtvÀrdera och optimera RAG-agenter
För att sÀkerstÀlla att vÄr RAG-agent presterar bra mÄste vi implementera utvÀrderingsmÄtt och optimeringstekniker:
a) Relevansbedömning
Vi kan anvÀnda mÀtvÀrden som BLEU, ROUGE eller BERTScore för att utvÀrdera relevansen av hÀmtade dokument:
from bert_score import score def evaluate_relevance(query, retrieved_doc, generated_answer): P, R, F1 = score([generated_answer], [retrieved_doc], lang="en") return F1.mean().item()
b) UtvÀrdering av svarskvalitet
Vi kan anvÀnda mÀnsklig utvÀrdering eller automatiserade mÀtvÀrden för att bedöma svarens kvalitet:
from nltk.translate.bleu_score import sentence_bleu def evaluate_answer_quality(reference_answer, generated_answer): return sentence_bleu([reference_answer.split()], generated_answer.split()) # Use this to evaluate your agent's responses
Framtida riktningar och utmaningar
NÀr vi ser pÄ framtiden för RAG-agenter dyker flera spÀnnande riktningar och utmaningar upp:
a) Multimodal RAG: Utökar RAG för att införliva bild-, ljud- och videodata.
b) Federerad RAG: Implementering av RAG över distribuerade, integritetsbevarande kunskapsbaser.
c) Kontinuerligt lÀrande: Utveckla metoder för RAG-agenter för att uppdatera sina kunskapsbaser och modeller över tid.
d) Etiska betÀnkligheter: Ta itu med partiskhet, rÀttvisa och transparens i RAG-system.
e) Skalbarhet: Optimering av RAG för storskaliga realtidsapplikationer.
Slutsats
Att bygga LLM-agenter för RAG frÄn grunden Àr en komplex men givande process. Vi har gÄtt igenom grunderna i RAG, implementerat ett enkelt system, skapat en LLM-agent, förbÀttrat den med avancerade tekniker, utforskat system med flera agenter och diskuterat utvÀrderings- och optimeringsstrategier.