AGI och framtidens AI

Bygga LLM-agenter fÃķr RAG frÃĨn scratch och bortom: En komplett guide

mm
LÃĪgg till Unite.AI bland dina fÃķredragna kÃĪllor pÃĨ Google

LLM:er som GPT-3, GPT-4 och deras Ãķppen kÃĪllkods motsvarighet kÃĪmpar ofta med att hÃĪmta uppdaterad information och kan ibland generera hallucinationer eller felaktig information.

Retrieval-Augmented Generation (RAG) ÃĪr en teknik som kombinerar kraften i LLM:er med extern kunskapshÃĪmtning. RAG lÃĨter oss grunda LLM-svar i faktiska, uppdaterade uppgifter, vilket fÃķrbÃĪttrar betydligt noggrannheten och tillfÃķrlitligheten hos AI-genererat innehÃĨll.

I den hÃĪr bloggposten kommer vi att utforska hur man bygger LLM-agenter fÃķr RAG frÃĨn scratch, med djupgÃĨende diskussioner om arkitektur, implementationsdetaljer och avancerade tekniker. Vi kommer att tÃĪcka allt frÃĨn RAG-grunderna till att skapa sofistikerade agenter som kan utfÃķra komplexa resonemang och uppgifter.

Innan vi dyker in i att 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 hybridapproach 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.
  • De hÃĪr dokumenten 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.
RAG

RAG

Den hÃĪr approachen har flera fÃķrdelar:

  • FÃķrbÃĪttrad noggrannhet: Genom att grunda svar i hÃĪmtad information minskar RAG hallucinationer och fÃķrbÃĪttrar faktisk noggrannhet.
  • Uppdaterad information: Kunskapsbasen kan uppdateras regelbundet, vilket gÃķr att systemet kan komma ÃĨt aktuell information.
  • Transparens: Systemet kan tillhandahÃĨlla kÃĪllor fÃķr sin information, vilket Ãķkar fÃķrtroendet och mÃķjliggÃķr faktakontroll.

Att fÃķrstÃĨ LLM-agenter

 

NÃĪr du stÃĨr infÃķr ett problem med inget enkelt svar behÃķver du ofta fÃķlja flera steg, tÃĪnka noga och komma ihÃĨg vad du har provat tidigare. LLM-agenter ÃĪr utformade fÃķr exakt sÃĨdana situationer i sprÃĨkmodellstillÃĪmpningar. De kombinerar grundlig dataanalys, strategisk planering, datahÃĪmtning och fÃķrmÃĨgan att lÃĪra av tidigare handlingar fÃķr att lÃķsa komplexa problem.

Vad ÃĪr LLM-agenter?

LLM-agenter ÃĪr avancerade AI-system utformade fÃķr att skapa komplex text som krÃĪver sekventiellt resonemang. De kan tÃĪnka i fÃķrvÃĪg, komma ihÃĨg tidigare samtal och anvÃĪnda olika verktyg fÃķr att anpassa sina svar efter situationen och den stil som behÃķvs.

ÖvervÃĪg en frÃĨga inom juridik som: “Vilka ÃĪr de potentiella rÃĪttsliga resultaten av en specifik typ av kontraktbrott i Kalifornien?” En grundlÃĪggande LLM med ett RAG-system kan hÃĪmta den nÃķdvÃĪndiga informationen frÃĨn juridiska databaser.

FÃķr en mer detaljerad scenarie: “I ljuset av nya dataskyddslagar, vilka ÃĪr de vanliga rÃĪttsliga utmaningarna som fÃķretag stÃĨr infÃķr, och hur har domstolarna hanterat dessa frÃĨgor?” Den hÃĪr frÃĨgan grÃĪver djupare ÃĪn att bara leta upp fakta. Det handlar om att fÃķrstÃĨ nya regler, deras pÃĨverkan pÃĨ olika fÃķretag och domstolarnas svar. En LLM-agent skulle bryta ner den hÃĪr uppgiften i underuppgifter, som att hÃĪmta de senaste lagarna, analysera historiska fall, sammanfatta juridiska dokument och fÃķrutsÃĪga trender baserat pÃĨ mÃķnster.

LLM-agenter bestÃĨr av

LLM-agenter bestÃĨr vanligtvis av fyra komponenter:

  1. Agent/hjÃĪrna: Den grundlÃĪggande sprÃĨkmodellen som bearbetar och fÃķrstÃĨr sprÃĨk.
  2. Planering: FÃķrmÃĨgan att resonera, bryta ner uppgifter och utveckla specifika planer.
  3. Minne: HÃĨller koll pÃĨ tidigare interaktioner och lÃĪr av dem.
  4. VerktygsanvÃĪndning: Integrerar olika resurser fÃķr att utfÃķra uppgifter.

Agent/hjÃĪrna

I hjÃĪrtat av en LLM-agent finns 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 prompt, som vÃĪgleder agenten om hur den ska svara, vilka verktyg den ska anvÃĪnda och vilka mÃĨl den ska strÃĪva efter. Du kan anpassa agenten med en persona som passar fÃķr specifika uppgifter eller interaktioner, vilket fÃķrbÃĪttrar dess prestanda.

Minne

Minneskomponenten hjÃĪlper LLM-agenter att hantera komplexa uppgifter genom att hÃĨlla koll pÃĨ tidigare handlingar. Det finns tvÃĨ huvudtyper av minne:

  • Korttidsminne: Fungerar som en anteckningsbok, som hÃĨller koll pÃĨ pÃĨgÃĨende diskussioner.
  • LÃĨngtidsminne: Fungerar som en dagbok, som lagrar information frÃĨn tidigare interaktioner fÃķr att lÃĪra av mÃķnster och fatta bÃĪttre beslut.

Genom att kombinera dessa typer av minne kan agenten erbjuda mer anpassade svar och komma ihÃĨg anvÃĪndarpreferenser Ãķver tid, vilket skapar en mer sammanhÃĪngande och relevant interaktion.

Planering

Planering mÃķjliggÃķr fÃķr LLM-agenter att resonera, bryta ner uppgifter i hanterbara delar och anpassa planer nÃĪr uppgifter utvecklas. Planering omfattar tvÃĨ huvudstadier:

  • Planformulering: Att bryta ner en uppgift i mindre underuppgifter.
  • Planreflektion: Att granska och bedÃķma planens effektivitet, med feedback fÃķr att fÃķrbÃĪttra strategier.

Metoder som Chain of Thought (CoT) och Tree of Thought (ToT) hjÃĪlper till i den hÃĪr nedbrytningsprocessen, vilket mÃķjliggÃķr fÃķr agenter att utforska olika vÃĪgar fÃķr att lÃķsa ett problem.

FÃķr att dyka djupare in i vÃĪrlden av AI-agenter, inklusive deras nuvarande fÃķrmÃĨgor och potential, kan du lÃĪsa “Auto-GPT & GPT-Engineer: En djupgÃĨende guide till dagens ledande AI-agenter”

Att stÃĪlla in miljÃķn

FÃķr att bygga vÃĨr RAG-agent behÃķver vi stÃĪlla in vÃĨr utvecklingsmiljÃķ. Vi kommer att anvÃĪnda Python och flera nyckellibrarier:

  • LangChain: FÃķr att orkestrera vÃĨr LLM och hÃĪmtningskomponenter
  • Chroma: Som vÃĨr vektorlagring fÃķr dokumentinbÃĪddningar
  • OpenAI:s GPT-modeller: Som vÃĨr grundlÃĪggande LLM (du kan ersÃĪtta detta med en Ãķppen kÃĪllkodsmodell om du fÃķredrar)
  • FastAPI: FÃķr att skapa en enkel API fÃķr att interagera med vÃĨr agent

LÃĨt oss bÃķrja med att stÃĪlla in vÃĨr miljÃķ:


<p># Skapa en ny virtuell miljÃķ
python -m venv rag_agent_env
source rag_agent_env/bin/activate # PÃĨ Windows, anvÃĪnd `rag_agent_env\Scripts\activate`</p>

<p># Installera nÃķdvÃĪndiga paket
pip install langchain chromadb openai fastapi uvicorn

Nu, lÃĨt oss skapa en ny Python-fil som heter rag_agent.py och importera de nÃķdvÃĪndiga biblioteken:


<p>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</p>

<p># StÃĪll in din OpenAI API-nyckel
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;din-api-nyckel-hÃĪr&quot;</p>

Att bygga ett enkelt RAG-system

Nu nÃĪr vi har vÃĨr miljÃķ instÃĪlld, lÃĨt oss bygga ett grundlÃĪggande RAG-system. Vi kommer att bÃķrja med att skapa en kunskapsbas frÃĨn en uppsÃĪttning dokument, sedan anvÃĪnda den fÃķr att svara pÃĨ frÃĨgor.

Steg 1: FÃķrbered dokumenten

FÃķrst behÃķver vi ladda och fÃķrbereda vÃĨra dokument. FÃķr det hÃĪr exemplet, lÃĨt oss anta att vi har en textfil som heter knowledge_base.txt med nÃĨgra uppgifter om AI och maskinlÃĪrning.


<p># Ladda dokumentet
loader = TextLoader(&quot;knowledge_base.txt&quot;)
documents = loader.load()</p>

<p># Dela dokumenten i bitar
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)</p>

<p># Skapa inbÃĪddningar
embeddings = OpenAIEmbeddings()</p>

<p># Skapa en vektorlagring
vectorstore = Chroma.from_documents(texts, embeddings)</p>

Steg 2: Skapa en hÃĪmtningsbaserad QA-kedja

Nu nÃĪr vi har vÃĨr vektorlagring, kan vi skapa en hÃĪmtningsbaserad QA-kedja:


<p># Skapa en hÃĪmtningsbaserad QA-kedja
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type=&quot;stuff&quot;, retriever=vectorstore.as_retriever())</p>

Steg 3: FrÃĨga systemet

Vi kan nu frÃĨga vÃĨrt RAG-system:


<p>frÃĨga = &quot;Vilka ÃĪr de viktigaste tillÃĪmpningarna av maskinlÃĪrning?&quot;
resultat = qa.run(frÃĨga)
print(resultat)

Steg 4: Skapa en LLM-agent

Medan 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 om den information 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 kommer att skapa en agent som inte bara kan svara pÃĨ frÃĨgor, utan ocksÃĨ utfÃķra webbsÃķkningar och grundlÃĪggande berÃĪkningar.

FÃķrst, lÃĨt oss definiera nÃĨgra verktyg fÃķr vÃĨr agent:


<p>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</p>

<p># Definiera ett kalkylverktyg
class CalculatorTool(BaseTool):
name = &quot;Kalkylator&quot;
description = &quot;AnvÃĪndbart nÃĪr du behÃķver svara pÃĨ matematiska frÃĨgor&quot;</p>

<p>def _run(self, frÃĨga: str)
try:
return str(eval(frÃĨga))
except:
return &quot;Jag kunde inte berÃĪkna det. Se till att din inmatning ÃĪr ett giltigt matematiskt uttryck.&quot;</p>

<p># Skapa verktygsinstanser
sÃķk = DuckDuckGoSearchRun()
kalkylator = CalculatorTool()</p>

<p># Definiera verktygen
verktyg = [Tool(name=&quot;SÃķk&quot;, func=sÃķk.run, description=&quot;AnvÃĪndbart nÃĪr du behÃķver svara pÃĨ frÃĨgor om aktuella hÃĪndelser&quot;),
Tool(name=&quot;RAG-QA&quot;, func=qa.run, description=&quot;AnvÃĪndbart nÃĪr du behÃķver svara pÃĨ frÃĨgor om AI och maskinlÃĪrning&quot;),
Tool(name=&quot;Kalkylator&quot;, func=kalkylator._run, description=&quot;AnvÃĪndbart nÃĪr du behÃķver utfÃķra matematiska berÃĪkningar&quot;)
]</p>

<p># Initiera agenten
agent = initialize_agent(verktyg, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)</p>

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 den:


<p>resultat = agent.run(&quot;Vad ÃĪr skillnaden mellan Ãķvervakad och oÃķvervakad inlÃĪrning? Och vad ÃĪr 15% av 80?&quot;)
print(resultat)</p>

Den hÃĪr agenten demonstrerar en viktig fÃķrdel med LLM-agenter: de kan kombinera flera verktyg och resonemangssteg fÃķr att svara pÃĨ komplexa frÃĨgor.

Att fÃķrbÃĪttra agenten med avancerade RAG-tekniker

Medan vÃĨrt nuvarande RAG-system fungerar bra, finns det flera avancerade tekniker som vi kan anvÃĪnda fÃķr att fÃķrbÃĪttra dess prestanda:

a) Semantisk sÃķkning med Dense Passage Retrieval (DPR)

I stÃĪllet fÃķr att anvÃĪnda enkel inbÃĪddningsbaserad hÃĪmtning, kan vi implementera DPR fÃķr mer exakt semantisk sÃķkning:


<p>from transformers import DPRQuestionEncoder, DPRContextEncoder</p>

<p>frÃĨgekodare = DPRQuestionEncoder.from_pretrained(&quot;facebook/dpr-question_encoder-single-nq-base&quot;)
sammanhangskodare = DPRContextEncoder.from_pretrained(&quot;facebook/dpr-ctx_encoder-single-nq-base&quot;)</p>

<p># Funktion fÃķr att koda passager
def koda_passager(passager):
return sammanhangskodare(passager, max_length=512, return_tensors=&quot;pt&quot;).pooler_output</p>

<p># Funktion fÃķr att koda frÃĨga
def koda_frÃĨga(frÃĨga):
return frÃĨgekodare(frÃĨga, max_length=512, return_tensors=&quot;pt&quot;).pooler_output</p>

b) FrÃĨgeexpansion

Vi kan anvÃĪnda frÃĨgeexpansion fÃķr att fÃķrbÃĪttra hÃĪmtningsprestanda:


<p>from transformers import T5ForConditionalGeneration, T5Tokenizer</p>

<p>modell = T5ForConditionalGeneration.from_pretrained(&quot;t5-small&quot;)
tokenisatÃķr = T5Tokenizer.from_pretrained(&quot;t5-small&quot;)</p>

<p>def expandera_frÃĨga(frÃĨga):
inmatningstext = f&quot;expandera frÃĨga: {frÃĨga}&quot;
inmatningsid = tokenisatÃķr.encode(inmatningstext, return_tensors=&quot;pt&quot;)
utgÃĨngar = modell.generate(inmatningsid, max_length=50, num_return_sequences=3)
expanderade_frÃĨgor = [tokenisatÃķr.decode(utgÃĨng, skip_special_tokens=True) for utgÃĨng in utgÃĨngar]
return expanderade_frÃĨgor</p>

c) Iterativ fÃķrfining

Vi kan implementera en iterativ fÃķrfiningsprocess dÃĪr agenten kan stÃĪlla fÃķljdfrÃĨgor fÃķr att fÃķrtydliga eller expandera sin initiala hÃĪmtning:


<p>def iterativ_hÃĪmtning(inledande_frÃĨga, max_iterationer=3):
frÃĨga = inledande_frÃĨga
for _ in range(max_iterationer):
resultat = qa.run(frÃĨga)
fÃķrtydligande = agent.run(f&quot;Baseras pÃĨ det hÃĪr resultatet: &#039;{resultat}&#039;, vilken fÃķljdfrÃĨga bÃķr jag stÃĪlla fÃķr att fÃĨ mer specifik information?&quot;)
if fÃķrtydligande.lower().strip() == &quot;ingen&quot;:
break
frÃĨga = fÃķrtydligande
return resultat</p>

# AnvÃĪnd det hÃĪr i din agents process

Att implementera ett multiagent-system

FÃķr att hantera mer komplexa uppgifter kan vi implementera ett multiagent-system dÃĪr olika agenter specialiserar sig pÃĨ olika omrÃĨden. HÃĪr ÃĪr ett enkelt exempel:


<p>class SpecialistAgent:
def __init__(self, name, verktyg):
self.name = name
self.agent = initialize_agent(verktyg, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)</p>

<p>def run(self, frÃĨga):
return self.agent.run(frÃĨga)</p>

<p># Skapa specialistagenter
forskningsagent = SpecialistAgent(&quot;Forskning&quot;, [Tool(name=&quot;RAG-QA&quot;, func=qa.run, description=&quot;FÃķr AI- och ML-frÃĨgor&quot;)])
matematikagent = SpecialistAgent(&quot;Matematik&quot;, [Tool(name=&quot;Kalkylator&quot;, func=kalkylator._run, description=&quot;FÃķr berÃĪkningar&quot;)])
allmÃĪnagent = SpecialistAgent(&quot;AllmÃĪnt&quot;, [Tool(name=&quot;SÃķk&quot;, func=sÃķk.run, description=&quot;FÃķr allmÃĪnna frÃĨgor&quot;)])</p>

<p>class Koordinator:
def __init__(self, agenter):
self.agenter = agenter</p>

<p>def run(self, frÃĨga):
# BestÃĪm vilken agent som ska anvÃĪndas
if &quot;berÃĪkna&quot; in frÃĨga.lower() or any(op in frÃĨga for op in [&#039;+&#039;, &#039;-&#039;, &#039;*&#039;, &#039;/&#039;]):
return self.agenter[&#039;Matematik&#039;].run(frÃĨga)
elif any(term in frÃĨga.lower() for term in [&#039;ai&#039;, &#039;maskinlÃĪrning&#039;, &#039;djupinlÃĪrning&#039;]):
return self.agenter[&#039;Forskning&#039;].run(frÃĨga)
else:
return self.agenter[&#039;AllmÃĪnt&#039;].run(frÃĨga)</p>

<p>koordinator = Koordinator({&#039;Forskning&#039;: forskningsagent, &#039;Matematik&#039;: matematikagent, &#039;AllmÃĪnt&#039;: allmÃĪnagent})</p>

<p># Testa multiagent-systemet
resultat = koordinator.run(&quot;Vad ÃĪr skillnaden mellan CNN och RNN? Och berÃĪkna 25% av 120.&quot;)
print(resultat)</p>

Det hÃĪr multiagent-systemet mÃķjliggÃķr specialisering och kan hantera en bredare variation av frÃĨgor mer effektivt.

Att utvÃĪrdera och optimera RAG-agenter

FÃķr att sÃĪkerstÃĪlla att vÃĨr RAG-agent fungerar bra, behÃķver vi implementera utvÃĪrderingsmetoder och optimeringstekniker:

a) RelevansutvÃĪrdering

Vi kan anvÃĪnda metoder som BLEU, ROUGE eller BERTScore fÃķr att utvÃĪrdera relevansen hos hÃĪmtade dokument:


<p>from bert_score import score</p>

<p>def utvÃĪrdera_relevans(frÃĨga, hÃĪmtat_dokument, genererat_svar):
P, R, F1 = score([genererat_svar], [hÃĪmtat_dokument], lang=&quot;sv&quot;)
return F1.mean().item()</p>

b) SvarskvalitetsutvÃĪrdering

Vi kan anvÃĪnda mÃĪnsklig utvÃĪrdering eller automatiserade metoder fÃķr att bedÃķma svarskvalitet:


<p>from nltk.translate.bleu_score import sentence_bleu</p>

<p>def utvÃĪrdera_svarskvalitet(referenssvar, genererat_svar):
return sentence_bleu([referenssvar.split()], genererat_svar.split())</p>

<p># AnvÃĪnd det hÃĪr fÃķr att utvÃĪrdera din agents svar

Framtida riktningar och utmaningar

NÃĪr vi ser framÃĨt mot framtiden fÃķr RAG-agenter, finns det flera spÃĪnnande riktningar och utmaningar:

a) Multi-modal RAG: Att utÃķka RAG till att omfatta bild-, ljud- och videodata.

b) Federerad RAG: Att implementera RAG Ãķver distribuerade, sekretessbevarande kunskapsbaser.

c) Kontinuerligt lÃĪrande: Att utveckla metoder fÃķr RAG-agenter att uppdatera sina kunskapsbaser och modeller Ãķver tid.

d) Etiska ÃķvervÃĪganden: Att hantera fÃķrdomar, rÃĪttvishet och transparens i RAG-system.

e) Skalbarhet: Att optimera RAG fÃķr stora, realtidsapplikationer.

Slutsats

Att bygga LLM-agenter fÃķr RAG frÃĨn scratch ÃĪr en komplex men givande process. Vi har tÃĪckt grunderna i RAG, implementerat ett enkelt system, skapat en LLM-agent, fÃķrbÃĪttrat den med avancerade tekniker, utforskat multiagent-system och diskuterat utvÃĪrderings- och optimeringstekniker.

Jag har tillbringat de senaste fem ÃĨren med att dyka djupt in i den fascinerande vÃĪrlden av MaskinlÃĪrning och DjupinlÃĪrning. Min passion och expertis har lett mig till att bidra till Ãķver 50 olika mjukvaruprojekt, med sÃĪrskild fokus pÃĨ AI/ML. Min pÃĨgÃĨende nyfikenhet har ocksÃĨ lett mig mot Naturlig SprÃĨkbehandling, ett omrÃĨde som jag ÃĪr angelÃĪgen om att utforska vidare.