Anslut dig till vÄrt nÀtverk!

Artificiell allmÀn intelligens

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

mm
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.
RAG

RAG

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:

  1. Agent/hjÀrna: KÀrnsprÄksmodellen som bearbetar och förstÄr sprÄk.
  2. Planering: FörmÄgan att resonera, bryta ner uppgifter och utveckla specifika planer.
  3. Minne: UpprÀtthÄller register över tidigare interaktioner och lÀr sig av dem.
  4. 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.

Jag har Àgnat de senaste fem Ären Ät att fördjupa mig i den fascinerande vÀrlden av Machine Learning och Deep Learning. Min passion och expertis har lett mig till att bidra till över 50 olika programvaruutvecklingsprojekt, med sÀrskilt fokus pÄ AI/ML. Min pÄgÄende nyfikenhet har ocksÄ dragit mig mot Natural Language Processing, ett omrÄde som jag Àr ivrig att utforska vidare.