Практычныя прытамулі: Агентскі ІІ з LangChain — Частка 3: Выклік інструментаў у LangChain
Практычныя прыказкі: Агентскі ІІ з LangChain — Частка 3: Выклік інструментаў у LangChain: кантракты, перакрыцчы і слоты для коду для команд, якія викорыстоўваюць гэты патэрн.
Існавайце гэта як перапрацоўаны варыянт ідэй з матеріалу «Агентны ІІ з LangChain — Частка 3: Выклік інструментаў у LangChain» для працавальнікаў: чыстыя этапы, аранжаваныя блакі коду і прыметкі з восстанавлення, якія застаюцца пасля перадачы задання. Этап Апглэйда работае найкраща, калі яго розглядзаць як вимерную плошчу. Запісайце адна ідеальная транскрыпцыю, адзін прыклад неудачы і прыметкі з вярнення да пачатковага стану прычаму расшырэння масштаба. Запісвайце часы виконання і кост токенав або запытаў праза функцыйнае рэзультат. Відразлівае паказанне костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.
Канцэпціі выкліку інструментаў
У стадії «Канцэпты вызывання інструментаў» неабходна практычна вызначыць даннэ, якія будуць вводзіцца, адпаведальнага за выкананне крока, а таксама крэтыніяты выходу пры змены коду. Аператары должны магчымае перзапускіць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыемліка. Файлы сяродавішча, хранальнікі секрэтных дадзеных і флагі функцый належаць у аднам месца, якое аператары можаць пераглядаць, не чытаяўшы весь лянцуг задач.
1. Канфігурацыі системы
У стадії 1 «Канфігурацыя системы» неабяжна практычна вказаць інпуты, адміністратара крока та крэтэрыя завершэння пры зміне коду. Аперацыйныя працавнікі павінны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе перакрыцця та обробка некоректных паведамленняў є часткай продукту, а не элементамі пазнейшага доўрабкі. Автентыфікацыя павінна выконвацца на воратах, а пераправаленне праваў — на роўні дадзенаў. Толькі токен-носіцель не є межай арендаванага ресурсу.
OPENAI_API_KEY="<Your OpenAI API Key>"
TAVILY_API_KEY=<Your TAVILY API Key>
class BaseConfig(BaseSettings):
OPENAI_API_KEY: Optional[str]
PINECONE_API_KEY: Optional[str]
TAVILY_API_KEY: Optional[str]
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
2. Структура проекту
У стадії 2 «Структура проекта» неабяцо паказаць вхідныя даны, адміністратара шагу і крэтырыя для завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымаць перзапуск шагу з вядомай точкі контролю, не падозрываючы схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі шаг не выйшаў, прычына нехасабності должна вказываць на адну адпаведальнасць, а не на заплутаны ланцюг задач. Автентыфікуйцеся на входзе і паўторна автарызуйцеся на роўні дадзенняў. Толькі токэн-носіцель не є межай аб’екта выкарыстоўвання.
project/
|
├── tools
│ ├── get_sum.py # a simple LangChain tool example
| └── weather.py # get_weather LangChain tool using open source APIs
|
|── tool_call.py # implement tool-calling loop using LangChain tools
├── config.py # pydantic BaseConfig
├── .env # environment variable definition
├── .gitignore
└── requirements.txt # package requirements
3. Інструменты LangChain
Для стадіі 3 LangChain Tools неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы схованы стан. Спрыяйце цій стадіі як кантракту межы вхідных і перакананых выходных данаў. Дайце назвы артыфактам, узначыць перакананні успеху і адмовіцеся ад тых падчасных завершэнняў, калі няма інформацыі.
3.1. Што такое LangChain Tool?
Для стадіі 3.1 «Што такое?» неабяжна прадзеўначыць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры перадзмене коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы схованы стан. Запісваць час выконання і кост токена або запыту праза функцыйнальных рэзультатаў. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі траекторыя пераходзіць з дэмавай версіі ў спяльныя среды. Автентыфікацыя выканаўцая на воратах, а прадзеўначыць права зноў на роўні дадзенняў. Сам токен-носіцель не ёсць межай арэны выкарыстоўвання.
from langchain.tools import tool
@tool
def get_sum(a: int, b: int) -> int:
"""
get the summation of two integers
:param a: int, input integer
:param b: int, input integer
:return: int, the sum of a and b
"""
return a + b
3.2. Адбудаваць інструмент для прагнозавання парадкі
Для пункту 3.2 неабяжна рэалізацыя практыкі, якая включае апранэнне этапу, адзначэнне вхідных дадзеных, адпраўніка кроку і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі павінны магчымаецца перзапускаць крок з вядомага пункту контролю, не прымусваныя здагадвацца пра схованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыемліка. Файлы сераўнавання, хранальнікі секрэтных дадзеных і флагі функцыйяў павінны быць у адном месца, якое аперацыйныя працавнікі могу пераглядаць, не чытаючы весь ланцуг задач.
3.3. Канцэпцыя вызываў інструментаў
Для концэпцы ўражэй 3×3 неабходна перад змянай коду адзначыць вхідныя даны, адпаведальнага за кожны крок і критэрыя завершэння. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не прабуючы спадарожваць схованы стан. Неабходна адзначыць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія перакрыцця і обробка некоректных паведамленняў є часткай продукту, а не элементамі пазнейшай дапрацоўкі. Аутентыфікацыя выканаць у воратах, а прабачэнне прав на доступ — у роўні дадзеных. Толькі токэн-носіцель не є межай адпаведнае часткі продукту.
3.4. Выклік інструментаў у LangChain
Для стадіі 3 4 Tool Calling неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымае перадзеяць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына нехасабносці должна вказываць на адну адпаведальнасць, а не на заплутаны ланцужок задач. Автентыфікуйцеся на входзе і паўторна автарызуйцеся на роўні дадзенняў. Толькі токэн-носіцель не є межай аб’екта. Для стадіі 3 4 Tool Calling неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымае перадзеяць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісвайце час выконання і кост токэна або запыту разам з функцыйнымі рэзультатамі. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмавайнага режыма ў спяльныя среды.
3.4.1. Налашчэнне LLM і адзінакоў
Кал працуеце над стадіяй налашчэння 3 4 1, спачатку запісайце умовы: неабяжныя даннэ, сігнал успеху і тое, што выканаецца у разе частковага невыпалення. Такі список контроля дапамагае заліцварыць пазнейшыя змены ў кодзе. Зберагаюце налашчэнні за межамі коду аплікацыі. Файлы сераўнавання, храненні секрэтных дадзенаў і флагі функцыйяй должны знаходзіцца ў аднам месцы, куды аператары можаюць пераглядаць іх без неабяжнага чытання всіх элементаў. Кэшавайце стабільныя інструкцыі системы і схемы адзінакоў. Перадача тых сабе ідэнтычных дадзенаў є частым выклікам расходу ресурсаў.
class WeatherAssistant:
def __init__(self):
# initialize llm
self.llm = ChatOpenAI(api_key=api_key, model="gpt-4o-mini", temperature=0)
# initialize a tool dictionary
self.tools = {"get_weather": get_weather,
"tavily_search": TavilySearch(max_results=3, tavily_api_key=TAVILY_API_KEY)}
# bind LangChain tools to llm
self.llm_with_tools = self.llm.bind_tools(list(self.tools.values()))
# initialize messages to store message list
self.messages = []
# System prompt
self.system_prompt = f"""You are a helpful assistant for question-answering tasks.
When users ask about weather, use the get_weather tool to get weather. For other questions,
use web_search. If you don't know the answer, just say that you don't know.
Be conversational and helpful in your responses."""
self.messages.append(SystemMessage(content=self.system_prompt))
3.4.2. Адбудова цыклу вызывання адзінакоў
Калі працуеце над стадзіяй адканалення 3 4 2, спачатку запісайце контракт: неабяжлівыя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список перакладзець пазнейшыя змены коду ў правільным напрамку. Документавайце як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе контралі і обработка некоректных паведамленняў є часткай продукту, а не пазнейшым дапрацоўкам. Зявляйце логі з назвай інструмента, хэшам аргументаў, часам затрымкі і рэзультатам кожнага вызову. Без такога следу дэбаггінгавы агент траціць гадзіны на безрезультатныя циклы.
async def chat(self, message: str):
# Wrap User message in a HumanMessage and add it to message list
self.messages.append(HumanMessage(content=message))
# Get AI response (it may or may not contain tool calls)
response = await self.llm_with_tools.ainvoke(self.messages)
self.messages.append(response)
# If there is any tool calls in the AI response
if response.tool_calls:
# process tool calls
for tool_call in response.tool_calls:
# retrieve function name from tool_call, then
# retrieve the tool from tool dictionary, and invoke it,
# append resulting tool message to message list
tool = self.tools[tool_call["name"]]
tool_result = await tool.ainvoke(tool_call)
self.messages.append(tool_result)
# Get final response after tool execution
final_response = await self.llm_with_tools.ainvoke(self.messages)
self.messages.append(final_response)
3.4.3 Апробаванне ціклу
Калі працуеце на стадыі тэставання 3 4 3, спачатку запісайце «кантракт»: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контроля дапамагае заліцварваць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Запісвайце назву інструмента, хэш параметраў, час адпаведзі і рынак кожнага вызову. Без такога следу дэбаггін займае гадзіны. Калі працуеце на стадыі тэставання 3 4 3, спачатку запісайце «кантракт»: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контроля дапамагае заліцварваць пазнейшыя змены ў кодзе. Запісвайце часы выканання і кост токенаў або запытаў разам з функцыйнальнымі рынакамі. Візуабельнасць костаў з самага пачатку запобегае неспакойным рахункам, калі праця пераходзіць з дэмаверсіі ў спакульнаныя сераўысы.
async def main():
print("hello tool calling!")
assistant = WeatherAssistant()
message = "What is the temperature in Tokyo?"
await assistant.chat(message)
for msg in assistant.messages:
msg.pretty_print()
if __name__ == "__main__":
asyncio.run(main())
4. Абяроненні базовага цыклу вызывання інструментаў
Чатыро абяроненні гэтага этапу даўаюць наявныя рычынкі, калі іх спрыяваць як вимерную паверхню. Зберагачыце адна ідеальная транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштаб. Храніце настройкі парадульна ад коду прыемліка. Файлы сяродавішча, хранальнікі секрэтных дадзеных і флагі функцый должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль, не чытаючы весь граф. Адкрывайце інструменты з вузкімі схемамі та чысткімі пазначэннямі пабочных эфектаў. Хостам неабходна знать, якія вызывання мутуюць стан, перш чым яны автаматычна схваляюць іх.
5. Заключны вывод
Этап 5 «Заключныя падыткі» працюе найэфектывней, калі яго спрыяваць як меравальную плошчу. Запісайте адны ідеальны прыклад роботы, адзін прыклад неудачы і прыметку па адвярненню перад расшырэнням меж працы. Документавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія контраліны і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Чэк-ліст для эксплуатацыі
Калі працюеце над этапам чэк-ліста для эксплуатацыі, спачатку запісайте умовы працы: неабяжлівыя даннэ, сігнал успеху і тое, што выканаецца у разы частковай неудачы. Такі чэк-ліст дапамагае заставіць пазнейшыя змены коду быць чыстымі.
Спрыявайце этапу як угодзе між вхіднымі даннэмі і перакананымі выходнымі результатамі. Дайце назвы элементам, задаць критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння працы.
Зявіце назву інструмента логавання, хэш аргументаў, час затрымкі і рынак кожнага вызову. Дэбагаванне без такога следу адзначае гады часу.
Зберагайце стан графа ў простам і типаваным формате. Вярнутыя структуры маскуюць, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перарываў.
Калі дозволяе бюджет, дадзіце тэст на працясную працю, які перабірае критычны шлях у CI з фіксатрамі, а не з рэальнымі платнымі API.
Документавайце як шлях успеху, так і шлях вяснавання проблем. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Перш чым апранаваць стак, заморозьце версіі, зафіксавайце ідеальны транскрыпт для критычнага шляху і паказвайце способы абраткі. У спяльных средах неабходны ліміты частоты, перакананні ў прыналежнасці і чысткі власнік для змены секрэтных даных. Валіце надзейнасць працы над крэатіўнымі разовымі дэманстраціямі.
Запіскі для пакета d7ca1ebeb899: не класты ключі прадаўцоў у репазітарыю, задаць максымальны тэрмін дзейнасці токена на кожную сесію, а таксама зберагчы транскрыпціі празаўседле з фікстурамі для ацэнкі, каб пазнейшыя замены моделей заставаліся порównанымі.