Дзяржавы агент LangGraph з возможнасцю адчытання дадзейнаў за дапамой LlamaIndex і кодаванняя HITL
Формат-завісна часткаваэ, структураваная маршрутацыя намерэнняў, паралельныя спецыялістскія скарбнікі даных і кодаванне CLI з абсалютным карантэнам ператвараюць дакументы на безпечныя, выконвальныя експерыменты.
Ператворэнне акадэмічных артыкулоў у практычныя эксперыменты зазвычай ўключае медленны цыкл чытання, стварэння падсумкаў, напісання коду і адлучэння бягаў. Сістэма з калькуляцыяй стану і колькома агентамі можа вытрымаць большую частку гэтага навантажэння: 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) дае можлівасць стварыць модульную схему, якая можа даследжваць і дзейсці, пакуль чалавек контролюе крытычныя етапы падтверджэння.
Урокі з аператыўнай працы
- Разбіўка тэксту з урахоўваннем фармату прадае ся сама ў той момент, калі запошук коду больш не вяртае непূরнага функцый.
Граф ёст продуктам: вузлы можна заменіць, але контракт стану і шлюзы затверджэння ёст тым, што робіць працэс пераходу з даследжэнняў да коду достатна безпечным для ўжыцтва ў кожны дзень.
Пашаговы апіс
- Запрацоўвайце дакументы і зошыты з адпаведным падраздэлачам фармата; перабудуйце колекцыю Chroma, калі змянююцца вучоркі.
- Класіфікуйце выказванні корыстніка як знаёмства чы рэзерваванне коду (або болей дробныя катэгорыі па меры росту продукту).
operator.add, а пасля сінтэзаваце за дапамогою аналізатора.Такой цыкл дастатковы, каб заменіць купу тады-тады складзеных зошыцяў на адну надзеючуюся паверхню агента.