Штучний загальний інтелект
Створення LLM агентів для RAG з нуля та далі: вичерпний посібник

LLM, такі як GPT-3, GPT-4 та їхні аналоги з відкритим вихідним кодом, часто мають проблеми з пошуком актуальної інформації та іноді можуть генерувати галюцинації або невірну інформацію.
Пошуково-доповнена генерація (RAG) це техніка, яка поєднує потужність LLM із зовнішнім пошуком знань. RAG дозволяє нам базувати відповіді LLM на фактичній актуальній інформації, значно покращуючи точність і надійність контенту, створеного ШІ.
У цій публікації блогу ми розглянемо, як створювати LLM-агенти для RAG з нуля, заглибившись в архітектуру, деталі реалізації та передові методи. Ми розглянемо все: від основ RAG до створення складних агентів, здатних до складних міркувань та виконання завдань.
Перш ніж ми заглибимося у створення нашого LLM-агента, давайте розберемося, що таке RAG і чому він важливий.
RAG, або Retrieval-Augmented Generation, — це гібридний підхід, який поєднує пошук інформації з генерацією тексту. У системі RAG:
- Запит використовується для отримання відповідних документів із бази знань.
- Потім ці документи вводяться в мовну модель разом із оригінальним запитом.
- Модель генерує відповідь на основі як запиту, так і отриманої інформації.
Цей підхід має кілька переваг:
- Покращена точність: ґрунтуючи відповіді на отриманій інформації, RAG зменшує галюцинації та покращує фактичну точність.
- Актуальна інформація: Базу знань можна регулярно оновлювати, дозволяючи системі отримувати доступ до актуальної інформації.
- прозорість: система може надавати джерела своєї інформації, підвищуючи довіру та дозволяючи перевірку фактів.
Розуміння LLM агентів
Коли ви стикаєтеся з проблемою без простої відповіді, вам часто потрібно виконати кілька кроків, ретельно подумати та згадати, що ви вже пробували. Агенти LLM розроблені саме для таких ситуацій у додатках мовної моделі. Вони поєднують у собі ретельний аналіз даних, стратегічне планування, пошук даних і здатність вчитися на минулих діях для вирішення складних проблем.
Що таке LLM агенти?
LLM-агенти — це передові системи штучного інтелекту, призначені для створення складного тексту, який потребує послідовного міркування. Вони можуть думати наперед, згадувати минулі розмови та використовувати різні інструменти, щоб коригувати свої відповіді відповідно до ситуації та необхідного стилю.
Розглянемо питання в юридичній сфері, наприклад: «Які потенційні правові наслідки певного типу порушення контракту в Каліфорнії?» Базовий LLM із системою розширеного пошуку (RAG) може отримувати необхідну інформацію з правових баз даних.
Для більш детального сценарію: «У світлі нових законів про конфіденційність даних, з якими поширеними юридичними викликами стикаються компанії, і як суди вирішували ці проблеми?» Це питання є глибшим, ніж просто пошук фактів. Йдеться про розуміння нових правил, їхнього впливу на різні компанії та відповідей судів. Агент LLM розбиває це завдання на підзавдання, такі як пошук останніх законів, аналіз історичних справ, узагальнення юридичних документів та прогнозування тенденцій на основі закономірностей.
Компоненти агентів LLM
Агенти LLM зазвичай складаються з чотирьох компонентів:
- Агент/Мозок: основна модель мови, яка обробляє та розуміє мову.
- Планування: Здатність міркувати, розподіляти завдання та розробляти конкретні плани.
- пам'ять: веде записи про минулі взаємодії та вчиться на них.
- Використання інструменту: Інтегрує різні ресурси для виконання завдань.
Агент/Мозок
В основі LLM-агента лежить мовна модель, яка обробляє та розуміє мову на основі величезних обсягів даних, на яких її було навчено. Ви починаєте з того, що даєте йому конкретну підказку, керуючи агентом, як реагувати, які інструменти використовувати та цілі, до яких потрібно прагнути. Ви можете налаштувати агента за допомогою особи, яка підходить для певних завдань або взаємодії, підвищуючи його продуктивність.
пам'ять
Компонент пам’яті допомагає агентам LLM виконувати складні завдання, зберігаючи записи про минулі дії. Є два основних типи пам'яті:
- Короткочасна пам'ять: Діє як блокнот, відстежуючи поточні обговорення.
- Довготривала пам'ять: функціонує як щоденник, зберігаючи інформацію про минулі взаємодії, щоб вивчати закономірності та приймати кращі рішення.
Поєднуючи ці типи пам’яті, агент може пропонувати більш індивідуальні відповіді та запам’ятовувати налаштування користувача з часом, створюючи більш зв’язану та відповідну взаємодію.
Планування
Планування дозволяє агентам LLM міркувати, розкладати завдання на керовані частини та адаптувати плани в міру розвитку завдань. Планування складається з двох основних етапів:
- Формулювання плану: розбиття завдання на менші підзавдання.
- План Рефлексія: перегляд і оцінка ефективності плану, врахування відгуків для вдосконалення стратегій.
Такі методи, як Ланцюг думок (CoT) і Дерево думок (ToT), допомагають у цьому процесі декомпозиції, дозволяючи агентам досліджувати різні шляхи вирішення проблеми.
Щоб глибше заглибитися у світ агентів ШІ, включно з їхніми поточними можливостями та потенціалом, варто прочитати «Auto-GPT & GPT-Engineer: поглиблений посібник для сучасних провідних агентів ШІ»
Налаштування середовища
Щоб створити нашого RAG-агента, нам потрібно налаштувати середовище розробки. Ми використовуватимемо Python та кілька ключових бібліотек:
- LangChain: Для оркестрування наших LLM і компонентів пошуку
- кольоровість: як наше векторне сховище для вставлення документів
- Моделі GPT OpenAI: як наш базовий LLM (за бажанням ви можете замінити це моделлю з відкритим кодом)
- FastAPI: для створення простого API для взаємодії з нашим агентом
Почнемо з налаштування нашого середовища:
# 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
Тепер створимо новий файл Python з назвою rag_agent.py та імпортуємо необхідні бібліотеки:
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"
Створення простої системи RAG
Тепер, коли наше середовище налаштоване, давайте створимо базову систему RAG. Ми почнемо зі створення бази знань з набору документів, а потім використовуватимемо її для відповідей на запити.
Крок 1: Підготуйте документи
Спочатку нам потрібно завантажити та підготувати наші документи. Для цього прикладу припустимо, що у нас є текстовий файл під назвою knowledge_base.txt з деякою інформацією про штучний інтелект та машинне навчання.
# 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)
Крок 2: Створіть ланцюжок контролю якості на основі пошуку
Тепер, коли у нас є наше векторне сховище, ми можемо створити ланцюжок контролю якості на основі пошуку:
# Create a retrieval-based QA chain qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=vectorstore.as_retriever())
Крок 3: Запитайте систему
Тепер ми можемо запитати нашу систему RAG:
query = "What are the main applications of machine learning?" result = qa.run(query) print(result)
Крок 4: Створення LLM Agent
Хоча наша проста система RAG корисна, вона досить обмежена. Давайте вдосконалимо її, створивши агента LLM, який може виконувати складніші завдання та міркувати про отриману інформацію.
Агент LLM – це система штучного інтелекту, яка може використовувати інструменти та приймати рішення про те, які дії виконувати. Ми створимо агента, який не лише може відповідати на запитання, але й виконувати веб-пошук та базові обчислення.
Спочатку визначимо деякі інструменти для нашого агента:
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 )
Тепер у нас є агент, який може використовувати нашу систему RAG, виконувати веб-пошук та обчислення. Давайте перевіримо це:
result = agent.run("What's the difference between supervised and unsupervised learning? Also, what's 15% of 80?") print(result)
Цей агент демонструє ключову перевагу агентів LLM: вони можуть поєднувати кілька інструментів і кроків міркування, щоб відповідати на складні запити.
Удосконалення агента за допомогою вдосконалених методів RAG
Хоча наша поточна система RAG працює добре, ми можемо використати кілька передових методів для підвищення її продуктивності:
a) Семантичний пошук із щільним пошуком переходів (DPR)
Замість використання простого пошуку на основі вбудовування ми можемо реалізувати DPR для більш точного семантичного пошуку:
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
б) Розширення запиту
Ми можемо використовувати розширення запиту для покращення продуктивності пошуку:
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) Ітеративне уточнення
Ми можемо реалізувати ітеративний процес уточнення, коли агент може задавати додаткові запитання, щоб уточнити або розширити свій початковий пошук:
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
Впровадження мультиагентної системи
Для виконання складніших завдань ми можемо реалізувати багатоагентну систему, де різні агенти спеціалізуються в різних областях. Ось простий приклад:
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)
Ця багатоагентна система дозволяє спеціалізуватись і може більш ефективно обробляти ширший діапазон запитів.
Оцінка та оптимізація агентів RAG
Щоб гарантувати належну роботу нашого агента RAG, нам потрібно впровадити оціночні показники та методи оптимізації:
a) Оцінка релевантності
Ми можемо використовувати такі показники, як BLEU, ROUGE або BERTScore, щоб оцінити релевантність отриманих документів:
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()
б) Оцінка якості відповіді
Ми можемо використовувати людську оцінку або автоматизовані показники для оцінки якості відповідей:
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
Майбутні напрямки та виклики
Дивлячись на майбутнє агентів RAG, з’являється кілька захоплюючих напрямків і завдань:
a) Мультимодальний RAG: розширення RAG для включення зображень, аудіо та відеоданих.
b) Федеративне RAG: Впровадження RAG у розподілених базах знань із збереженням конфіденційності.
c) Постійне навчання: Розробка методів для агентів RAG для оновлення своїх баз знань і моделей з часом.
d) Етичні міркування: вирішення проблеми упередженості, справедливості та прозорості в системах RAG.
e) масштабованість: Оптимізація RAG для великомасштабних додатків у реальному часі.
Висновок
Створення LLM-агентів для RAG з нуля – це складний, але корисний процес. Ми розглянули основи RAG, реалізували просту систему, створили LLM-агента, вдосконалили його за допомогою передових методів, дослідили багатоагентні системи та обговорили стратегії оцінки та оптимізації.