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

Дзяржавы агент LangGraph з возможнасцю адчытання дадзейнаў за дапамой LlamaIndex і кодаванняя HITL

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

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

Крыніцы: Building a Multi-Agent Research and Coding Assistant with LangGraph and LlamaIndex- Week3 of Learning AI engineering

Ператворэнне акадэмічных артыкулоў у практычныя эксперыменты зазвычай ўключае медленны цыкл чытання, стварэння падсумкаў, напісання коду і адлучэння бягаў. Сістэма з калькуляцыяй стану і колькома агентамі можа вытрымаць большую частку гэтага навантажэння: LangGraph для маршрутацыі, LlamaIndex для спецыялізаванага пошуку, а таксама інструмент для напісання коду праз CLI, які праходзіць праз апраўленне чалавеком.

1. Розумны прыём дадзеных: не всі фрагменты роўны

Абсалютнае раздзелэнне PDF-файлаў, Python-кода і CSV-файлаў за адной стратэгіяй разрушае якасць пошуку. Перад індэксаванням у ChromaDB неабходна выконваць раздзелэнне з урахоўванням фармату — фрагменты для прозы, логічныя блакі для коду, фрагменты з урахоўваннем рэядкаў для табелей:

# 5. Setup Chunkers
pdf_chunker = SentenceSplitter(chunk_size=512, chunk_overlap=50)
python_chunker = CodeSplitter(language='python')
csv_reader = CSVReader(concat_rows=False)

# 6. Route and Chunk Data
for doc in documents:
    file_name = doc.metadata.get("file_name", "")
    if file_name.endswith(".pdf"):
        nodes = pdf_chunker.get_nodes_from_documents([doc])
    elif file_name.endswith(".py"):
        nodes = python_chunker.get_nodes_from_documents([doc])
    elif file_name.endswith(".csv"):
        # CSVs are chunked row-by-row by our custom reader
        all_nodes.append(doc)

Эмбеддынгі (на прыклад, Ollama’s all-minilm) тады відбіваюць структуру, а не проста дэталі сімвалаў.

2. «Мозг» LangGraph: класыфікацыя намеру

LangChain апранае модэлі, запросы і інструменты; LangGraph керуе тэчаннем выканання. Адна спяшчаная канцэдарыя State пераводзіць даныя праз кожны вузел. Маршрутызацыя ключоўых слоў у вольным тэксце ёсць нестабільной, таму структураваныя выходны даныя за дапамогою Pydantic прыводзяць да выкарыстоўвання Literal інтэнцыі ад локальнага модэля, такога як llama3.2:3b:

class IntentClassifier(BaseModel):
    message_intent: Literal['chat', 'code', 'knowledge'] = Field(
        ...,
        description="Classify the user intent. 'code' for implementation, 'knowledge' for research details, 'chat' for general tasks."
    )

Умовныя рэшткі пасля таго надзеямося без проблем, не парсуючы бессэнсавых даных.

3. Шлях знанняў: паралельны пошук

Складныя дакладніцкія запіты рэдка калі падходзяць пад аднаго пошуку на адпоўнасць. Разгледзіце шлях знанняў як чатырох агентаў LlamaIndex адразу — abstract_agent, methodology_agent, limitations_agent і conclusion_agent — кожны з якім мае спецыяльны запіт. Адзінавайце частковыя рэзультаты за дапамогою функціі operator.add з LangGraph, каб аўтары не перакрылі адзін другога:

class State(TypedDict):
    messages: Annotated[list, add_messages]
    message_intent: str | None
    next_node: str | None
    context: Annotated[list[str], operator.add] # Safely appends parallel findings

analyst_agent чытае сумаведамлены кантэкст і аналізуе плюсы, мінусы і прасоўкі.

4. Спынак межа между даследжэннямі і дзеяннямі: кодаванне з удзелам чалавека

Шлях кодавання ператварае намеры на команды для CLI-інструмента для кодавання праз падпрацэкты. Неконтрольваны доступ да шэлу ўскладнюе сітуацыю, таму LangGraph interrupt() зупіняе працэс на чаканне падтверджэння:

def accept_coding(state: State):
    user_prompt = state['messages'][-1].content
    decision = interrupt(f'About to run Claude Code with request:\n\n{user_prompt}\n\nApprove? (yes/no, or type a revised request)')

    text = str(decision).strip().lower()

    if text in ['y', 'yes', 'approve', 'ok']:
        return {'next_node': 'coding_agent'}
    if text in ['n', 'no', 'deny', 'cancel']:
        return {'messages': [{'role': 'assistant', 'content': 'Coding request denied.'}], 'next_node': 'denied'}

    # Allows the user to dynamically edit the prompt mid-flight
    return {'messages': [{'role': 'user', 'content': text}], 'next_node': 'accept_coding'}

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

Заключэнне

Раздзелення працэса запошукі інфармацыі (LlamaIndex) ад керування станам і маршрутацыі (LangGraph) дае можлівасць стварыць модульную схему, якая можа даследжваць і дзейсці, пакуль чалавек контролюе крытычныя етапы падтверджэння.

Урокі з аператыўнай працы

  • Разбіўка тэксту з урахоўваннем фармату прадае ся сама ў той момент, калі запошук коду больш не вяртае непূরнага функцый.
  • Структураваныя літэралы намерэння працуюць лепшая за рутэры на адпаведнасці з рэгулярнымі выразамі, калі корыстнікі фарфоразуюць тое ж самае цялевае заведамленне пяццю разамі.
  • Паралельныя спецыялістскія прыстроі для пошуку патрабуюць прыбутковых элементаў; прынцып „першы, хто запісаў, той і выграе“ ёст крытым багам з втратай дадзэнняў.
  • HITL для каманды shell ёсць непрыемлемым паляваннем за межамі тымчасовай сандбокс-асяроддзя.
  • Зберагаюце версіяванне індэксаў LlamaIndex разам з хешам корпусу дакументаў, каб методалогія і абмежэнні заставаліся сувязанымі пасля паўтарнага запрацоўвання дадзэнняў.
  • Граф ёст продуктам: вузлы можна заменіць, але контракт стану і шлюзы затверджэння ёст тым, што робіць працэс пераходу з даследжэнняў да коду достатна безпечным для ўжыцтва ў кожны дзень.

    Пашаговы апіс

    1. Запрацоўвайце дакументы і зошыты з адпаведным падраздэлачам фармата; перабудуйце колекцыю Chroma, калі змянююцца вучоркі.
    2. Класіфікуйце выказванні корыстніка як знаёмства чы рэзерваванне коду (або болей дробныя катэгорыі па меры росту продукту).
  • Па тэме знанняў: распрашчыце іх між чатырма спецыялістамі-пошукавальнікамі, зменшыце ўжо за дапамогою operator.add, а пасля сінтэзаваце за дапамогою аналізатора.
  • Па тэме кодавання: створыце команду CLI, паслаўце ёю просьбу пра адзначэнне, выконайце ёю толькі в мячыку для тэставання, а стандартны выхід і памяткі прыключэння верніце ў стан чату.
  • Зберагаюце контрольныя пункты графа, калі трэба продакаваць дзялёныя сесіі доследжэння пасля перыяду спячкі ноутбука.
  • Такой цыкл дастатковы, каб заменіць купу тады-тады складзеных зошыцяў на адну надзеючуюся паверхню агента.