Галоўная / Артыкулы

Створыце чат-асистента для Вікіпеды на адміністрацыі RAG з LlamaIndex і ReAct.

Адаптаваць сторанкі Вікіпедыя па запатранню, уключаць часткі з малым кодувальнікам, і дазволіць агенту ReAct вызваць інструмент запитоў, каб адпаведзіць Chainlit заставаліся на падставе адзысканых доказаў.

Выдавец: REACTAPP.TOP6 хв чытання1383 слоў

Крыніцы: **I Built a ChatGPT-Like Wikipedia Assistant Using RAG, ReAct Agents, and LlamaIndex in Under 300 Lines of Python**

Введэнне

Моделі большых языков работаюць вельмі каляво, але такая калявасць не значыць, што яны ведаюць, чы рэспакт точны чы савечны. Калі запит выходзіць за межы першапрыёмнай базы дадзеных або калі ўпэўненасць моделі перакрывае наявныя доказы, яна можа стварыць правдопадобныя брехні.

Практычны чат-асистэнт на базе Вікіпедыя з технологіяй RAG запоўняе гэты прыём, спалучаючы індексаванне стороніц за патрэбай, семантычны пошук, агрупаванне доказаў, агента ReAct, які выбірае момент для пошуку, і інтэрфейс для дыялога, які дае адказы на аснове знайдзеных тэкстаў. Адказвальныя матэрыялы для стварэння такога асистэнта знаходзяцца пад назвай agentic-ai wiki RAG sample у рэпазітарыі data-etl-ml на GitHub.

Чаму RAG?

Без тэхнологій пошуку шлях ўздоўж якога працюе модель ёсць короткі і нестабільны:

  User Question
      ↓
      LLM
      ↓
    Answer

Усё залежыць ад таго, што модель запамятала пад час навучэння.

За дапамогою RAG доказы прадаюцца ўвесь час пры стварэнні адказаў:

User Question
      ↓
    Retriever
      ↓
Relevant Documents
      ↓
     LLM
      ↓
Grounded Answer

Модель дае адказы на аснове выкараных фрагментаў. Гэта зазвычай значыць меньшыя галюцинаціі, болей часоўы факты, адсутнасць цыклу дапрацоўкі для апштучвання веды, а таксама просты спосаб змены чы расшырэння корпуса.

Цель проекту

Стварыць чат-асистента, які дае адказы на падзеях Вікіпеды, якія выбраў корыстнік для індэксавання. Прыклад запиту:

Please index:
2023 United States banking crisis

Потым запытайце:

Which bank experienced the fastest bank run
in US history during 2023?

Адказ павінен цітаваць змест выкаранага абаротку, а не памяць самай модэлі.

Аптака системы

У загальных рысах система выглядае так:

Wikipedia Pages
        │
        ▼
 WikipediaReader
        │
        ▼
 SentenceSplitter
        │
        ▼
 Embeddings
 BAAI/bge-small-en
        │
        ▼
 VectorStoreIndex
        │
        ▼
 Query Engine
        │
        ▼
 QueryEngineTool
        │
        ▼
 ReAct Agent
        │
        ▼
 Chainlit UI

Важныя ўсё тры процесы: індэксавацыйны канал, який стварае можна шукваць векторны сховішч, і канал запытавання, який выкароўвае фрагменты і генеруе адказы.

Шаг 1: Чытанне ключа API OpenAI

Данные аброцэнкі павінны застаўцца праза імпульсу. Штодзе можна, ухіліцеся ад жорсткага кодавання:

api_key = "xxxxx"

Заместа таго зачынайце з файлу налаштаванняў:

def get_apikey():
    with open("apikeys.yml") as file:
        config = yaml.safe_load(file)

    return config["OPENAI_API_KEY"]

Секрэты застаюцца аддзеленымі ад логікі прыемліка.

Шаг 2: Розумеўце структуру коду

Праект складаецца з трох модуляў на Python:

utils.py
index_wikipages.py
chat_agent.py

utils.py зачынае клучы API і налаштавання. index_wikipages.py парсуе запыты да старонак, завантажае тэкст Вікіпедыі, уключае ўсё неабходнае і стварае індэксы. chat_agent.py споўна з’яеднвае агента ReAct, інструмент для запытоў і интерфейс Chainlit.

Шаг 3: Выяўленне старонак Вікіпедыі за дапамойкай структураванага выходу

Пользоватары можаць вводзіць спісы у свабоднай форме:

Please index:
London, Birmingham, New York

Індексатору патрэбны чыстыя масівы:

[
 "London",
 "Birmingham",
 "New York"
]

У заместа нестабільнага розбівання на строкі, модэль Pydantic зафіксавае структураваны выход:

class WikiPageList(BaseModel):
    pages: List[str]

Модэль аўтаматычна ператварае нейтральную мову на список старонак з адпаведнымі типамі дадзеных.

Шаг 4: Завантажэнне старонак Вікіпеды

LlamaIndex аднаёт прыемлівач, які спрыяе завантажэнню:

WikipediaReader

Процес завантажэння складаецца з калькі ліній коду:

loader = WikipediaReader()

documents = loader.load_data(
    pages=["2023 United States banking crisis"]
)

На гэтым этапе канал обробкі мае необработаныя дакументы старонак.

Шаг 5: Разбіўка дакументаў на часткі

Моделі паслаба справляюцца з вялікімі старонакамі, якія ўособлеваюцца як адны большы блокі. Їх трэба разбіць на перакрываючыяся часткі:

SentenceSplitter(
    chunk_size=150,
    chunk_overlap=45
)

Перакрыцце дапамагае зберагчы ідеі, якія распадзяюцца межаў частак:

Chunk A:
---------------------
Paragraph 1
Paragraph 2

Chunk B:
---------------------
Paragraph 2
Paragraph 3

Шаг 6: Стварэнне эмбеддынгаў

Необработаны тэкст недастаткова для семантычнага пошуку. Кожная частка ператвараецца ў вектор. Модель эмбеддынга, якая выкорыстоўваецца тут, ёсьць:

BAAI/bge-small-en

Запит на кшталт:

"What is Databricks?"

ператвараецца ў ўжоўтучны вектор:

[0.21, -0.44, 0.87 ...]

Часткі, якія семантычна адносуюцца, кластэруюцца поблізу адна адной у гэтым прасторы.

Шаг 7: Стварэнне векторнага індексу

LlamaIndex абгрупавае процес стварэння індексу:

index = VectorStoreIndex(nodes)

Рэзультатам ёсць вектарны індекс у памяці, які можа адказваць на запытанні пра сэмліранасць, напрыклад:

Find chunks similar to:
"fastest bank run in history"

Шаг 8: Стварэнне сэрч-энджына

Адкрыйце індекс як механізм запытанняў:

query_engine = index.as_query_engine(
    response_mode="compact",
    similarity_top_k=10,
    verbose=True
)
similarity_top_k = 10

Return 10 most relevant chunks

similarity_top_k кантролюе, сколькі суседніх фрагментаў будуць включаныя ў адказ.

Шаг 9: Стварэнне агента ReAct

ReAct значыць:

Reason + Act

Просты бот пераходзіць прымусова ад запытання да адказу:

Question
→ Answer

Агент ReAct включае логіку разумоўкі і выкарыстоўванне інструментаў:

Question
↓
Reason
↓
Choose Tool
↓
Observe Output
↓
Answer

Процес выкарыстоўвання інформацыі стае дынамічным, а не завжды актыўным чы роўна працюючым без перерыву.

Стварэнне інструментаў

Упакавайце механізм запытанняў у інструмент, які агент можа вызваць:

QueryEngineTool(
    query_engine=query_engine,
    metadata=ToolMetadata(
        name="Wikipedia"
    )
)

Тады агент ведае, што існуе можлівасць пошуку ў Вікіпедыі.

ReAct Loop

The agent internally performs:

Унутрана цей цыкл выглядае так:

Thought:
Need information about the banking crisis.

Action:
Wikipedia Tool

Observation:
Found relevant passages.

Answer:
Grounded response.

Такі шаблоны ўзаемадзеяння є болей надзеянымі, чым звычная адгукненне да паведамлення без жадных інструментаў.

Шаг 10: Стварэнне інтерфейса паўначынаючы Chainlit

Chainlit апранае шэл для чату з мінімальным колам стандартных элементаў. Панель налашоўкаў адкрывае:

Model
Wikipedia Pages

Прыклад налашоўкаў:

MODEL:
gpt-5-nano

Wikipedia Pages:
Please index:
2023 United States banking crisis

Налашоўкі ініцыязуюць стварэнне векторнага індексу ўсё раней, чым пачынаецца размова.

Дэманстрацыя

Пасля стварэння індексу:

2023 United States banking crisis

запыт на кшталт:

Which bank experienced the fastest
bank run in US history?

дае адпаведны адказ на кшталт:

Silicon Valley Bank (SVB)

Approximately $42 billion
was withdrawn in 10 hours.

Цыфры выклікаюцца з адзначаных доказаў, а не ўявай.

Усвойленыя урокі

Што працавало добра

LlamaIndex спакойвае процес стварэння індексу:

Documents
→ Nodes
→ Index

Агенты ReAct павяршаюць прыметкі ўжо калі трэба запрашваць даныя, таму пошук адбываецца толькі тады, калі гэта неабходна. Chainlit застаецца аднам з найшырэйшых спосабоў стварэння прыемлівага інтэрфейсу чату на базе ШІ.

Зьвязаныя проблемы

Сумеснае выкарыстоўванне Python 3.13 стварыла проблемы ў калькі разоў — комбінаціі Chainlit, Pydantic і LlamaIndex былі нестабільныя. Выкарыстоўванне фіксаваных версій:

Python 3.11

было набагато надзейнейшае.

Якосьць запрашвання даных вялікая меры вплывае на якосьць адказаў. Некалітасныя фрагменты даных прыводзяць да некалітасных адказаў. Важны урок: якосьць запрашвання даных часта мае большое значэнне, чым тое, які модель чату выкарыстоўваецца.

Будучыя павышэння

Наступнымі логічнымі крокамі є гібрыдны пошук:

Keyword Search
+
Semantic Search

Пераранжаванне рэзультатаў пасля першага запрашвання даных — запрашваць:

Top 50

Потым скачуце ў найкращыя варыянты. Цітаты, якія паказваюць абзацы пад кожным тверджэнням. А таксама база дадзеных з вектарамі з постаямым зберагчыкам узамен тымчасовага:

VectorStoreIndex

з такімі варыянтамі, як Chroma, Pinecone, Weaviate чыра Milvus.

Заключныя меркі

Этот проект – це стислы апুвядок саўременных патэранаў агентных систем: RAG, імбеддінгі, пошук вектараў, інструменты ReAct, UI Chainlit і оркестрацыя LlamaIndex. Стратэгічны падход є болей значым, чым якая-небудзь адна бібліятэка. Надзеяныя системы ствараюцца шляхом спалучэння модэлей з механізмамі пошуку, інструментамі та цыкламі разумавання – а не проста шляхом падбору максымальнай колькасці параметраў. Клонуйце прыклад 6_wiki_rag_react_project у папцы agentic-ai проекта data-etl-ml на GitHub, каб эксперыментаваць з усім комплексам.