AGI a budoucnost AI

Budování LLM Agentů pro RAG od Základu a dál: Komplexní Průvodce

mm
Přidejte Unite.AI mezi své preferované zdroje na Google

LLM jako GPT-3, GPT-4 a jejich open-source protějšky často zápasí s aktuálním získááním informací a někdy generují halucinace nebo nesprávné informace.

Retrieval-Augmented Generation (RAG) je technika, která kombinuje sílu LLM s externím získááním znalostí. RAG umožňuje uzemnit odpovědi LLM v faktických, aktuálních informacích, což významně zlepšuje přesnost a spolehlivost generovaného obsahu AI.

V tomto blogovém příspěvku prozkoumáme, jak postavit LLM agenty pro RAG od základu, ponoříme se do architektury, detailů implementace a pokročilých technik. Pokryjeme vše od základů RAG až po vytváření sofistikovaných agentů schopných komplexního uvažování a provádění úkolů.

Než začneme budovat našeho LLM agenta, pochopíme, co je RAG a proč je důležité.

RAG, nebo Retrieval-Augmented Generation, je hybridní přístup, který kombinuje získávání informací s generací textu. V systému RAG:

  • Dotaz je použit k získání relevantních dokumentů z znalostní báze.
  • Tito dokumenty jsou poté vloženi do jazykového modelu spolu s původním dotazem.
  • Model generuje odpověď založenou na dotazu a získaných informacích.
RAG

RAG

Tento přístup má několik výhod:

  • Vylepšená přesnost: Uzemňováním odpovědí v získaných informacích RAG snižuje halucinace a zlepšuje faktickou přesnost.
  • Aktuální informace: Znalostní báze může být pravidelně aktualizována, což umožňuje systému přístup k aktuálním informacím.
  • Průhlednost: Systém může poskytnout zdroje pro své informace, což zvyšuje důvěru a umožňuje faktické ověření.

Pochopení LLM Agentů

 

Když jste konfrontováni s problémem bez jednoduché odpovědi, často potřebujete následovat několik kroků, pečlivě uvažovat a pamatovat si, co jste již vyzkoušeli. LLM agenti jsou navrženi právě pro tyto typy situací v aplikacích jazykových modelů. Kombinují důkladnou analýzu dat, strategické plánování, získávání dat a schopnost učit se z předchozích akcí, aby řešili komplexní problémy.

Co jsou LLM Agenti?

LLM agenti jsou pokročilé systémy AI navržené pro vytváření komplexního textu, který vyžaduje sekvenční uvažování. Mohou uvažovat dopředu, pamatovat si předchozí konverzace a používat různé nástroje, aby upravili své odpovědi na základě situace a stylu.

Připomeňme si otázku z právní oblasti, jako je: “Jaké jsou potenciální právní důsledky porušení konkrétního typu smlouvy v Kalifornii?” Základní LLM s RAG systémem může získat nezbytné informace z právních databází.

Pro podrobnější scénář: “Vzhledem k novým zákonům o ochraně osobních údajů, jaké jsou běžné právní výzvy, kterým čelí společnosti, a jak soudy řešily tyto problémy?” Tato otázka sahá hlouběji než jen hledání faktů. Je to o pochopení nových pravidel, jejich dopadu na různé společnosti a reakcích soudů. LLM agent by rozdělil tuto úlohu na podúkoly, jako je získání nejnovějších zákonů, analýza historických případů, souhrn právních dokumentů a předpověď trendů na základě vzorců.

Komponenty LLM Agentů

LLM agenti se obecně skládají ze čtyř komponent:

  1. Agent/Mozek: Jádrem jazykového modelu, který zpracovává a rozumí jazyku.
  2. Plánování: Schopnost uvažovat, rozdělit úkoly a vyvinout konkrétní plány.
  3. Paměť: Udržuje záznamy o předchozích interakcích a učí se z nich.
  4. Použití nástrojů: Integruje různé zdroje pro provádění úkolů.

Agent/Mozek

V jádru LLM agenta je jazykový model, který zpracovává a rozumí jazyku na základě rozsáhlých dat, na kterých byl vyškolován. Začnete tím, že mu dáte konkrétní prompt, který agenta nasměruje, jak odpovědět, které nástroje použít a jaké cíle sledovat. Můžete agenta přizpůsobit osobnosti vhodné pro konkrétní úkoly nebo interakce, což zlepšuje jeho výkon.

Paměť

Komponent paměti pomáhá LLM agentům zvládat komplexní úkoly udržováním záznamu o předchozích akcích. Existují dva hlavní typy paměti:

  • Krátkodobá paměť: Jedná se jako poznámka, která sleduje probíhající diskuse.
  • Dlouhodobá paměť: Funkce jako deník, který ukládá informace z předchozích interakcí, aby se naučil vzorce a činil lepší rozhodnutí.

Kombinací těchto typů paměti může agent nabízet více přizpůsobené odpovědi a pamatovat si uživatelské preference s časem, vytvářející tak více propojenou a relevantní interakci.

Plánování

Plánování umožňuje LLM agentům uvažovat, rozdělit úkoly na zvládnutelné části a přizpůsobit plány, jak úkoly postupují. Plánování zahrnuje dvě hlavní fáze:

  • Formulace plánu: Rozdělení úkolu na menší podúkoly.
  • Reflexe plánu: Přezkoumání a hodnocení efektivity plánu, začlenění zpětné vazby pro úpravu strategií.

Metody, jako je Chain of Thought (CoT) a Tree of Thought (ToT), pomáhají v tomto procesu rozkladu, umožňující agentům prozkoumat různé cesty pro řešení problému.

Pro hlubší pohled do světa agentů AI, včetně jejich současných schopností a potenciálu, zvažte čtení “Auto-GPT & GPT-Engineer: An In-Depth Guide to Today’s Leading AI Agents”

Nastavení Prostředí

Abyste postavili náš RAG agent, musíme nastavit naše vývojové prostředí. Budeme používat Python a několik klíčových knihoven:

  • LangChain: Pro orchestraci našich LLM a komponent získávání
  • Chroma: Jako náš vektorový sklad pro dokumentové vložení
  • OpenAI’s GPT modely: Jako náš základ LLM (můžete jej nahradit open-source modelem, pokud je preferován)
  • FastAPI: Pro vytvoření jednoduchého API pro interakci s naším agentem

Začneme nastavením našeho prostředí:


<p># Vytvořte nové virtuální prostředí
python -m venv rag_agent_env
source rag_agent_env/bin/activate # Na Windows použijte `rag_agent_env\Scripts\activate`</p>

<p># Nainstalujte požadované balíčky
pip install langchain chromadb openai fastapi uvicorn

Nyní vytvořte nový soubor Pythonu nazvaný rag_agent.py a importujte nezbytné knihovny:


<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># Nastavte klíč API OpenAI
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;your-api-key-here&quot;</p>

Stavba Jednoduchého RAG Systému

Teď, když máme nastavené naše prostředí, postavíme základní RAG systém. Začneme vytvořením znalostní báze z sady dokumentů a poté ji použijeme k odpovědi na dotazy.

Krok 1: Příprava Dokumentů

Nejprve musíme načíst a připravit naše dokumenty. Pro tento příklad předpokládejme, že máme textový soubor nazvaný knowledge_base.txt s některými informacemi o AI a strojovém učení.


<p># Načtěte dokument
loader = TextLoader(&quot;knowledge_base.txt&quot;)
documents = loader.load()</p>

<p># Rozdělte dokumenty na části
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)</p>

<p># Vytvořte vložení
embeddings = OpenAIEmbeddings()</p>

<p># Vytvořte vektorový sklad
vectorstore = Chroma.from_documents(texts, embeddings)</p>

Krok 2: Vytvoření RAG Zřetězení

Teď, když máme náš vektorový sklad, můžeme vytvořit RAG zřetězení:


<p># Vytvořte RAG zřetězení
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type=&quot;stuff&quot;, retriever=vectorstore.as_retriever())</p>

Krok 3: Dotazování Systému

Nyní můžeme dotázat náš RAG systém:


<p>query = &quot;Jaké jsou hlavní aplikace strojového učení?&quot;
result = qa.run(query)
print(result)

Krok 4: Vytvoření LLM Agent

Zatímco náš jednoduchý RAG systém je užitečný, je poměrně omezený. Zlepšime ho vytvořením LLM agenta, který může provádět komplexnější úkoly a uvažovat o informacích, které získá.

LLM agent je systém AI, který může používat nástroje a činit rozhodnutí o akcích, které má podniknout. Vytvoříme agenta, který může nejen odpovědět na otázky, ale také provádět webové vyhledávání a základní výpočty.

Nejprve definujeme některé nástroje pro našeho agenta:


<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># Definujte nástroj pro výpočet
class CalculatorTool(BaseTool):
name = &quot;Calculator&quot;
description = &quot;Užitečný pro matematické otázky&quot;</p>

<p>def _run(self, query: str)
try:
return str(eval(query))
except:
return &quot;Nemohu spočítat. Ujistěte se, že váš vstup je platný matematický výraz.&quot;</p>

<p># Vytvořte instance nástrojů
search = DuckDuckGoSearchRun()
calculator = CalculatorTool()</p>

<p># Definujte nástroje
tools = [Tool(name=&quot;Search&quot;, func=search.run, description=&quot;Užitečný pro aktuální události&quot;),
Tool(name=&quot;RAG-QA&quot;, func=qa.run, description=&quot;Užitečný pro AI a strojové učení&quot;),
Tool(name=&quot;Calculator&quot;, func=calculator._run, description=&quot;Užitečný pro matematické výpočty&quot;)
]</p>

<p># Inicializujte agenta
agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)</p>

Nyní máme agenta, který může použít náš RAG systém, provádět webové vyhledávání a provádět výpočty. Otestujeme ho:


<p>result = agent.run(&quot;Jaký je rozdíl mezi dohledem a nesledovaným učením? A co je 15% z 80?&quot;)
print(result)</p>

Tento agent demonstruje klíčovou výhodu LLM agentů: mohou kombinovat více nástrojů a kroků uvažování, aby odpověděli na komplexní dotazy.

Vylepšení Agentů s Pokročilými RAG Technikami

Zatímco náš současný RAG systém funguje dobře, existují several pokročilé techniky, které můžeme použít k vylepšení jeho výkonu:

a) Semantické Vyhledávání s Dense Passage Retrieval (DPR)

Místo použití jednoduchého vložení založeného na vyhledávání můžeme implementovat DPR pro přesnější semantické vyhledávání:


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

<p>question_encoder = DPRQuestionEncoder.from_pretrained(&quot;facebook/dpr-question_encoder-single-nq-base&quot;)
context_encoder = DPRContextEncoder.from_pretrained(&quot;facebook/dpr-ctx_encoder-single-nq-base&quot;)</p>

<p># Funkce pro kódování pasáží
def encode_passages(passages):
return context_encoder(passages, max_length=512, return_tensors=&quot;pt&quot;).pooler_output</p>

<p># Funkce pro kódování dotazu
def encode_query(query):
return question_encoder(query, max_length=512, return_tensors=&quot;pt&quot;).pooler_output</p>

b) Rozšíření Dotazu

Můžeme použít rozšíření dotazu, aby se zlepšilo vyhledávání:


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

<p>model = T5ForConditionalGeneration.from_pretrained(&quot;t5-small&quot;)
tokenizer = T5Tokenizer.from_pretrained(&quot;t5-small&quot;)</p>

<p>def expand_query(query):
input_text = f&quot;expand query: {query}&quot;
input_ids = tokenizer.encode(input_text, return_tensors=&quot;pt&quot;)
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</p>

c) Iterativní Upravování

Můžeme implementovat iterativní proces upravování, kde agent může klást následné otázky, aby vyjasnil nebo rozšířil své počáteční vyhledávání:


<p>def iterative_retrieval(initial_query, max_iterations=3):
query = initial_query
for _ in range(max_iterations):
result = qa.run(query)
clarification = agent.run(f&quot;Based on this result: &#039;{result}&#039;, what follow-up question should I ask to get more specific information?&quot;)
if clarification.lower().strip() == &quot;none&quot;:
break
query = clarification
return result</p>

# Použijte to ve svém agentovi

Implementace Víceagentního Systému

Abyste zvládli komplexnější úkoly, můžete implementovat víceagentní systém, kde se různé agenti specializují na různé oblasti. Zde je jednoduchý příklad:


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

<p>def run(self, query):
return self.agent.run(query)</p>

<p># Vytvořte specialisty agentů
research_agent = SpecialistAgent(&quot;Research&quot;, [Tool(name=&quot;RAG-QA&quot;, func=qa.run, description=&quot;For AI and ML questions&quot;)])
math_agent = SpecialistAgent(&quot;Math&quot;, [Tool(name=&quot;Calculator&quot;, func=calculator._run, description=&quot;For calculations&quot;)])
general_agent = SpecialistAgent(&quot;General&quot;, [Tool(name=&quot;Search&quot;, func=search.run, description=&quot;For general queries&quot;)])</p>

<p>class Coordinator:
def __init__(self, agents):
self.agents = agents</p>

<p>def run(self, query):
# Určete, který agent použít
if &quot;calculate&quot; in query.lower() or any(op in query for op in [&#039;+&#039;, &#039;-&#039;, &#039;*&#039;, &#039;/&#039;]):
return self.agents[&#039;Math&#039;].run(query)
elif any(term in query.lower() for term in [&#039;ai&#039;, &#039;machine learning&#039;, &#039;deep learning&#039;]):
return self.agents[&#039;Research&#039;].run(query)
else:
return self.agents[&#039;General&#039;].run(query)</p>

<p>coordinator = Coordinator({&#039;Research&#039;: research_agent, &#039;Math&#039;: math_agent, &#039;General&#039;: general_agent})</p>

<p># Otestujte víceagentní systém
result = coordinator.run(&quot;Jaký je rozdíl mezi CNN a RNN? A spočítejte 25% z 120.&quot;)
print(result)</p>

<p>Tento víceagentní systém umožňuje specializaci a může zvládat širší rozsah dotazů účinněji.</p>

Hodnocení a Optimalizace RAG Agentů

Abyste zajistili, že váš RAG agent funguje dobře, musíte implementovat metriky hodnocení a techniky optimalizace:
<h3>a) Hodnocení Relevance</h3>
Můžete použít metriky, jako je BLEU, ROUGE nebo BERTScore, pro hodnocení relevance získaných dokumentů:

[code language="PYTHON"]

from bert_score import score

<p>def evaluate_relevance(query, retrieved_doc, generated_answer):
P, R, F1 = score([generated_answer], [retrieved_doc], lang=&quot;en&quot;)
return F1.mean().item()</p>

b) Hodnocení Kvality Odpovědi

Můžete použít hodnocení lidského nebo automatického pro posouzení kvality odpovědi:


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

<p>def evaluate_answer_quality(reference_answer, generated_answer):
return sentence_bleu([reference_answer.split()], generated_answer.split())</p>

<p># Použijte to pro hodnocení odpovědí vašeho agenta

Budoucí Směry a Výzvy

Jak se díváme do budoucnosti RAG agentů, objevují se několik zajímavých směrů a výzev:

a) Multimodální RAG: Rozšíření RAG o zahrnutí obrazových, audio a video dat.

b) Federovaný RAG: Implementace RAG napříč distribuovanými, soukromými znalostními bázemi.

c) Contínuální Učení: Rozvoj metod pro RAG agenty, aby aktualizovali své znalostní báze a modely s časem.

d) Etické Úvahy: Řešení problémů, jako je zkreslení, spravedlnost a transparentnost v RAG systémech.

e) Škálovatelnost: Optimalizace RAG pro velké, reálné aplikace.

Závěr

Stavba LLM agentů pro RAG od základu je složitý, ale odměňující proces. Prošli jsme základy RAG, implementovali jsme základní systém, vytvořili jsme LLM agenta, vylepšili jsme ho pokročilými technikami, prozkoumali jsme víceagentní systémy a diskutovali jsme o hodnocení a optimalizaci strategiích.

Já pět let se ponořím do fascinujícího světa strojového učení a hlubokého učení. Mé vášně a odborné znalosti mě vedly k tomu, abych se podílel na více než 50 různých projektech softwarového inženýrství, se zvláštním zaměřením na AI/ML. Mé pokračující zvědavosti mě také přivedly k přirozenému jazykovému zpracování, oblasti, kterou jsem ochoten prozkoumat dále.