Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π·ΠΈΠ½ΡƒΠŸΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ΡŒ
Найти Π² Π”Π·Π΅Π½Π΅
Бам сСбС Data Scientist

πŸ”₯ Магия LangGraph: БСкрСтная Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° управлСния историСй сообщСний Π² LLM Π·Π° 10 ΠΌΠΈΠ½ΡƒΡ‚

Часто ΠΌΠ½ΠΎΠ³ΠΈΠ΅ LLM Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ сообщСний, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ контСкст. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° истории сообщСний довольно частая ситуация, Ρ‚ΠΎ рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: Π‘ΠΏΠ΅Ρ€Π²Π° установим Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ: БостояниСм (State) Π² LangGraph ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ TypedDict, Pydantic model ΠΈΠ»ΠΈ dataclass. НиТС ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ TypedDict. Π’ состоянии Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ сообщСний. Π”Π°Π²Π°ΠΉΡ‚Π΅ построим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π³Ρ€Π°Ρ„Π° с ΠΎΠ΄Π½ΠΈΠΌ ΡƒΠ·Π»ΠΎΠΌ (node). Наш node - это просто функция Python, которая считываСт состояниС нашСго Π³Ρ€Π°Ρ„Π° ΠΈ вносит Π² Π½Π΅Π³ΠΎ измСнСния. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всСгда Π±ΡƒΠ΄Π΅Ρ‚ состояниС: Π­Ρ‚ΠΎΡ‚ ΡƒΠ·Π΅Π» (node) просто добавляСт сообщСниС Π² наш список сообщСний ΠΈ заполняСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅. Как Π²ΠΈΠ΄ΠΈΠΌ, ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ всю ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ сообщСний ΠΈ дополняСм Π½ΠΎΠ²Ρ‹ΠΌ сообщСниСм ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΄Π°Π»Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ простой Π³Ρ€Π°Ρ„, содСрТащий этот ΡƒΠ·Π΅Π». ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ StateGraph для опрСдСлСния Π³Ρ€Π°Ρ„Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с этим состояниСм. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ add_node для заполнСния нашСго Π³Ρ€Π°Ρ„Π°. Для удобства ΠΌΡ‹ часто провСряСм содСрТимоС объ
ОглавлСниС

Часто ΠΌΠ½ΠΎΠ³ΠΈΠ΅ LLM Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ сообщСний, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ контСкст.

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° истории сообщСний довольно частая ситуация, Ρ‚ΠΎ рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

  1. Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ State для опрСдСлСния схСмы Π³Ρ€Π°Ρ„Π°
  2. Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ reducers для управлСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ состояния.

Π‘ΠΏΠ΅Ρ€Π²Π° установим Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

pip install -U langgraph langchain
pip install -U langgraph langchain

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ простого Π³Ρ€Π°Ρ„Π°

БостояниСм (State) Π² LangGraph ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ TypedDict, Pydantic model ΠΈΠ»ΠΈ dataclass. НиТС ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ TypedDict.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ State

-3

Π’ состоянии Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ сообщСний.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ структуру Π³Ρ€Π°Ρ„Π°

Π”Π°Π²Π°ΠΉΡ‚Π΅ построим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π³Ρ€Π°Ρ„Π° с ΠΎΠ΄Π½ΠΈΠΌ ΡƒΠ·Π»ΠΎΠΌ (node). Наш node - это просто функция Python, которая считываСт состояниС нашСго Π³Ρ€Π°Ρ„Π° ΠΈ вносит Π² Π½Π΅Π³ΠΎ измСнСния. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всСгда Π±ΡƒΠ΄Π΅Ρ‚ состояниС:

-4

Π­Ρ‚ΠΎΡ‚ ΡƒΠ·Π΅Π» (node) просто добавляСт сообщСниС Π² наш список сообщСний ΠΈ заполняСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅. Как Π²ΠΈΠ΄ΠΈΠΌ, ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ всю ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ сообщСний ΠΈ дополняСм Π½ΠΎΠ²Ρ‹ΠΌ сообщСниСм ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΄Π°Π»Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ простой Π³Ρ€Π°Ρ„, содСрТащий этот ΡƒΠ·Π΅Π». ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ StateGraph для опрСдСлСния Π³Ρ€Π°Ρ„Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с этим состояниСм. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ add_node для заполнСния нашСго Π³Ρ€Π°Ρ„Π°.

-5

ИспользованиС Π³Ρ€Π°Ρ„Π°

-6
-7

Для удобства ΠΌΡ‹ часто провСряСм содСрТимоС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² сообщСний с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pretty-print:

-8

ОбновлСниС состояния Π³Ρ€Π°Ρ„Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π΅Π΄ΡŒΡŽΡΠ΅Ρ€ΠΎΠ² (reducers)

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π² состоянии ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-reducer, которая управляСт Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ обновлСния с ΡƒΠ·Π»ΠΎΠ². Если функция-reducer явно Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π°, Ρ‚ΠΎ прСдполагаСтся, Ρ‡Ρ‚ΠΎ всС обновлСния ΠΊΠ»ΡŽΡ‡Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΅Π΅.

Для схСм состояний TypedDict ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ reducer, снабдив ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»Π΅ состояния Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reducer.

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ наш ΡƒΠ·Π΅Π» ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» ΠΊΠ»ΡŽΡ‡ "сообщСния" Π² состоянии, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΊ Π½Π΅ΠΌΡƒ сообщСниС. НиТС ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ этому ΠΊΠ»ΡŽΡ‡Ρƒ reducer, Ρ‡Ρ‚ΠΎΠ±Ρ‹ обновлСния добавлялись автоматичСски:

-9

Π’Π΅ΠΏΠ΅Ρ€ΡŒ наш ΡƒΠ·Π΅Π» ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ:

-10

Π’Π΅ΠΏΠ΅Ρ€ΡŒ наша объявлСнная функция add Π±ΡƒΠ΄Π΅Ρ‚ сама Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡŽ списков.

-11
-12

MessagesState

LangGraph ΠΈΠΌΠ΅Π΅Ρ‚ встроСнный reducer add_messages, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ эти сообраТСния:

-13
-14
-15

Π­Ρ‚ΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ прСдставлСниС состояния для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‡Π°Ρ‚Π°. Для удобства Π² LangGraph встроСн MessagesState, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

-16

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄Π°Π½Π½Ρ‹ΠΉ MessageState сам Π΄Π΅Π»Π°Π΅Ρ‚ структуру:

-17

А ΠΌΡ‹ лишь дальшС ΠΎΡ‚ Π½Π΅Π³ΠΎ наслСдуСмся ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π». Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ самим Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ.

✨Основной Telegram-канал со всСми обновлСниями✨

Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΡ‚ΡŒΡΡ:

βœ”οΈ ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ Python с нуля Π·Π° 9 мСсяцСв πŸ”

#ai #ΠΈΠΈ #langchain #langgraph #llm #openai