Ці патрэбныя Deep Agents пэўныя мадэлі? Банкаўскае дэма з LangSmith
LangChain Deep Agents на паперы не залежыць ад мадэлі, а на практыцы — залежыць. Банкаўскі агент з пяццю інструментамі, трасіраваны ў LangSmith, паказвае, дзе кожная мадэль спатыкаецца.
Крыніцы: Beyond Simple Agents: Engineering DeepAgents for Enterprise with LangChain — 2
Парадоксальным пытаннем, якое вылучваеця ў момент праектавання агентаў з фрэймворку Deep Agents, ёсць тое, чы робіцься гэта за дапамою певнага мадэлі, каб усё працавало належна. Чыстая адказ мае два аспекты. З архітэктурнай точкі зору Deep Agents не залежыць ад таго, якую модэль вы выберазе. У практыцы ж рэзултаты сільна залежаць ад выбранай вам модэлі.
Архітэктурна незалежны ад мадэлі
У фрэймворку няма нічога, што прыкрэпляе конкрэтную модэль, і код гэта падтверджае. Можна выкарыстоўваць будзь-яю модэль чату:
from langchain.chat_models import init_chat_model
# Swap any model in — the harness doesn't care
agent = create_deep_agent(
model=init_chat_model("openai:gpt-4o"),
tools=[...],
system_prompt="..."
)
# Or Anthropic
agent = create_deep_agent(
model=init_chat_model("anthropic:claude-opus-4-6"),
tools=[...],
)
# Or Google
agent = create_deep_agent(
model=init_chat_model("google_vertexai:gemini-2.0-flash"),
tools=[...],
)
Інструмент планавання, файлавая сістэма, стварэнне падагентаў і дэталізаваныя запіты — гэтыя чатыры асновны элементы рэалізаваны на роўні фрэймворку. LangGraph забезпечвае срэду выканання, а LLM — гэта проста механізм разумовых вычыслаў, падключаны да гэтай сістэмы.
Практычна чутлівы да модэляў
Фрэймворк апіраецца на такія формы поведзення, якія не всі модэлі выконваюць на однакова якосць.
- Надзеяны вызыв інструментаў. Усі працэсы залежаць ад таго, чы ўсё лягае ў правы фармат з правымі параметрамі. Слабейшыя модэлі выдумваюць назвы інструментаў, пасылаюць неправыя тыпы параметраў або проста прыпінаюць вызыв і адпавядаюць у прозе.
- Выпэлнэнне дугіх сістэмных запытаў. Вбудованыя запыты ёсць дужа дзялёнымі. У яных прашацца модэль спачатку спланаваць, выкарыстоўваць спіс задач, ізолюваць кантэкст у падагентах і пераканацца ў правільнасці сваей працы. Модэлі, якія паслухаюць інструкцыі па-свойму, пачынаюць адхіляцца ад гэтых правіл на серэдзіні задання.
Прыбліжнае распадзеленне модэляў
| Ранг модэля | Працовая здатнасць з глыбокім агентам |
|---|---|
| Мадэлі высокага рангу | Надзеяны выкарыстоўванне інструментаў, адпаведнае выконанне складных запітоў, саўмеласнае веданне працы ў даволі дзяўгіх задачах |
| Сільныя мадэлі серэдньага рангу | Падыходзяць для большасці задач, але іноды маюць проблемы ў даволі дзяўгіх ланцоў задач |
| Менжыя або мадэлі на відкрытым кодзе | Рэзультаты ўсёлякія: часта трапляюцца бягы в фармаце інструментаў, адхіленьцы ў адпаведзях на запіты і пранарэшчанне працы |
Назвы рангаў ўжо ўзятыя як прыклады з часу напісання тэксту, а рангі модэляў быстра зменшаюцца, таму тэставаць трэба на сасвойых задачах.
Асновны вывад
Уявіце сабе кузов гоночнага автомабіля з можлівасцю замены двагуна: што бы вы не установілі, максымальная швальдзіна будзе вялічынай двагуна. Сістэма падтрымкі забезпечвае структуру: планаванне, памяць, падагенты і маршрутызацыю. Модэль жа дае можлівасць правільна выкарыстоўваць усё гэта. Для практычнага выкарыстоўвання, а ўсё болей у банку, дзе вымышлены спіс банкаматаў або фальшывы інвестыцыйны спеціяліст можа завесты серйозныя наследкі, трэба вжываць перэдовыя модэлі і не екануваць на якосці модэляў.
Час стварыць ўсё гэта
Дастатнько тэорыі. Дакументацыя без запуску коду — гэта вядомы жарт: дваста стораніц дакументаў, пятнаццац дыяграм, апрануты файл README, але нічога, што б фактычна працавало. Таму жо тут ёсць працуючы дэманстрацыйны прыклад з пяцьма інструментамі для банкавугледу і фальшывымі дадзеннямі.
Швыракі старт
Створыце API ключ у консэльтацыянтэ Антропік, а пасля налаеце праект:
mkdir firstdeepagent && cd firstdeepagent
uv add deepagent anthropic
export ANTHROPIC_API_KEY='asdkjfbaepiufas;dkjcnaisdf'
touch agent.py bank_tools.py mock_data.py
Этыя каманды ствараюць папку, інсталююць пакеты, экспортуяць ключ (выкорыстоўваюце свой справжні ключ, ніколі не тыя, якія былі зафіксаваны), і ствараюць тры файлы. Інструменты для bank_tools.py ўключаюць:
from mock_data import (OFFICERS_DATA, PORTFOLIO_DATA, ATM_DATA,
RETIREMENT_DATA, LOCATIONS_DATA)
def get_atm_centers(zipcode: str) -> dict:
data = ATM_DATA.get(str(zipcode).strip())
if not data:
return {
"error": f"No ATM data for zipcode '{zipcode}'.",
"available_zipcodes": list(ATM_DATA.keys()),
}
return {"zipcode": zipcode, "atm_centers": data, "total": len(data)}
def get_investment_officers(city: str) -> dict:
key = city.strip().lower()
data = OFFICERS_DATA.get(key)
if not data:
return {
"error": f"No investment officers found in '{city}'.",
"available_cities": [c.title() for c in OFFICERS_DATA],
}
return {"city": city, "officers": data, "total": len(data)}
def get_portfolio_companies(sector: str = "all") -> dict:
companies = PORTFOLIO_DATA
if sector and sector.lower() != "all":
companies = [c for c in companies if sector.lower() in c["sector"].lower()]
return {"companies": companies, "total": len(companies), "total_aum": "$6.35B"}
def get_retirement_plans(plan_type: str = "all") -> dict:
plans = RETIREMENT_DATA
if plan_type and plan_type.lower() != "all":
plans = [
p for p in plans
if plan_type.lower() in p["name"].lower() or plan_type.lower() in p["type"].lower()
]
return {"plans": plans, "total": len(plans)}
def get_bank_locations(city: str = "all") -> dict:
locations = LOCATIONS_DATA
if city and city.lower() != "all":
locations = [l for l in locations if city.lower() in l["city"].lower()]
total_branches = sum(l["branches"] for l in locations)
return {"locations": locations, "total_branches": total_branches}
Модуль mock_data зберагае прыкладныя запісі, а модуль tools-config — схемы інструментаў, супарабоцанне ад імен да функцый і запрошэнне для сістэмы. Храніце іх у адзінаковых файлах, каб код агента заставаўся малым. Галоўны цыкл для agent.py выглядае так:
import os
import json
import anthropic
from tools_config import TOOL_SCHEMAS, TOOL_FN_MAP, SYSTEM_PROMPT
def run_agent(client: anthropic.Anthropic, conversation: list[dict]) -> str:
MAX_ITERATIONS = 10
messages = list(conversation)
for _ in range(MAX_ITERATIONS):
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
system=SYSTEM_PROMPT,
tools=TOOL_SCHEMAS,
messages=messages,
)
tool_use_blocks = [b for b in response.content if b.type == "tool_use"]
if not tool_use_blocks:
text_parts = [b.text for b in response.content if b.type == "text"]
return "\n".join(text_parts).strip()
tool_results = []
for block in tool_use_blocks:
fn = TOOL_FN_MAP.get(block.name)
result = fn(**block.input) if fn else {"error": f"Unknown tool: {block.name}"}
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": json.dumps(result),
})
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "user", "content": tool_results})
return "[Max iterations reached — partial answer may be incomplete.]"
def main():
api_key = os.environ.get("ANTHROPIC_API_KEY")
if not api_key:
print("Error: ANTHROPIC_API_KEY environment variable not set.")
print(" export ANTHROPIC_API_KEY=your_key_here")
raise SystemExit(1)
client = anthropic.Anthropic(api_key=api_key)
conversation: list[dict] = []
print("XYZ Bank Agent — type 'quit' to exit.\n")
while True:
try:
user_input = input("You > ").strip()
except (EOFError, KeyboardInterrupt):
print("\nGoodbye!")
break
if not user_input:
continue
if user_input.lower() in {"quit", "exit", "q"}:
print("Goodbye!")
break
conversation.append({"role": "user", "content": user_input})
answer = run_agent(client, conversation)
conversation.append({"role": "assistant", "content": answer})
print(f"\n{answer}\n")
if __name__ == "__main__":
main()
Запуск
Убедзіцеся, што кантэнт ключа выэкспортаваны, а пасля запусціце агента за дапамою uv run agent.py. Прыклад сесіі:
XYZ Bank Agent — type 'quit' to exit.
You > Who are the investment officers in Chicago? Also what retirement plans do you offer?
Here's everything you need!
---
## 👔 Investment Officers in Chicago
| Name | Title | Specialty | Phone | Email |
|---|---|---|---|---|
| **Margaret Chen** | Senior Investment Officer | Equities & ETFs | 312-555-0101 | m.chen@xyzbank.com |
| **David Okafor** | Investment Officer | Fixed Income | 312-555-0182 | d.okafor@xyzbank.com |
| **Sarah Kowalski** | Wealth Manager | Retirement Planning | 312-555-0147 | s.kowalski@xyzbank.com |
---
## 🏦 Retirement Plans Offered by XYZ Bank
1. **XYZ Gold 401(k)**
- Min. Contribution: $50/month | Employer match up to 6%
- Features: Roth option, target date funds, low expense ratios
2. **XYZ Silver IRA (Traditional)**
- Min. Contribution: $25/month
- Features: Tax-deferred growth, flexible contributions, 600+ fund choices
3. **XYZ Roth IRA**
- Min. Contribution: $25/month
- Features: Tax-free withdrawals, no required minimum distributions, estate planning benefits
4. **XYZ Executive SEP-IRA**
- Contribute up to 25% of income
- Features: High contribution limits, self-employed friendly, simple administration
---
If you'd like to learn more about any of these plans or get in touch with one of our Chicago investment officers (especially **Sarah Kowalski**, who specializes in retirement planning!), feel free to ask! 😊
You >
Агент раздзеляе запіт на практычныя крокі, выбірае правыя інструменты, запускае ўсё гэта і збірае рынкты. Калі дапамагае ментальная карта, тады праграма выглядае так: запіт, план, вызовы інструментаў, засобраныя рынкты, фінальная адпаведзь.
Возможнасць назірання
Такія сістэмы патрабуюць тэлеметрыі, таму трэба дадаць LangSmith. Інтэграцыя простая: два зменныя сераўісу і апошнія тры радкі коду. LangSmith абгортае вашы існуючыя вызовы заместо таго, каб заменіць іх.
Гэты скрыпт вызывае безпосерэдня Anthropic SDK, а не LangChain; таму, каб павышыць дакладнасць логаў, можна за бажаннем адзначыць run_agent() атрыбутам @traceable:
from langsmith import traceable
@traceable(name="xyz-bank-agent-run")
def run_agent(client, conversation):
....................
....................
Кожны выклік інструмента, рашынка модэлю, колькасць токенаў і час адпаведзення праказуюцца на панелі керування LangSmith, без якой-лебе перархітактуры цыклу агента. Заўёрніце яго знову з болей шырокым запітам:
uv run agent.py
XYZ Bank Agent — type 'quit' to exit.
You > Show ATMs in 10001, investment officers in New York, and all branch locations
Here's a complete overview across all three categories:
---
## 🏧 ATMs in ZIP Code 10001
| ATM Name | Address | Hours | Fee |
|---|---|---|---|
| Midtown Manhattan ATM | 350 5th Ave | 24/7 | No fee |
| Penn Station ATM | 8 W 31st St | 24/7 | $2.50 (non-members) |
---
## 💼 Investment Officers — New York
1. **James Thornton** — Chief Investment Officer
- Specialty: Alternative Assets
- 📞 212-555-0201 | ✉️ j.thornton@xyzbank.com
2. **Priya Nair** — Investment Officer
- Specialty: ESG Portfolios
- 📞 212-555-0233 | ✉️ p.nair@xyzbank.com
---
## 🏦 All Branch Locations (61 Branches Nationwide)
| City | Branches | Flagship Address | Hours |
|---|---|---|---|
| Chicago | 14 | 200 W Adams St, Chicago IL 60606 | Mon–Fri 9am–5pm, Sat 9am–1pm |
| New York | 22 | 1 World Trade Center, NY 10007 | Mon–Fri 8am–6pm, Sat 9am–2pm |
| Los Angeles | 11 | 333 S Grand Ave, LA 90071 | Mon–Fri 9am–5pm, Sat 9am–1pm |
| Houston | 8 | 1000 Main St, Houston TX 77002 | Mon–Fri 9am–5pm |
| Boston | 6 | 100 Federal St, Boston MA 02110 | Mon–Fri 9am–5pm, Sat 10am–1pm |
---
Is there anything else you'd like to explore, such as retirement plans or our investment portfolio? 😊
You > What companies are in XYZ Bank's portfolio? List only Technology sector companies
Here are the **Technology sector companies** in XYZ Bank's investment portfolio:
---
## 💻 Technology Portfolio Companies
| Company | Stake | Value | Rating |
|---|---|---|---|
| **Apex Technologies Inc.** | 4.2% | $840M | A+ |
| **Sentinel Cybersecurity** | 7.3% | $1.5B | A+ |
---
### 📊 Summary
- **Total Technology Holdings:** 2 companies
- **Total Portfolio AUM:** $6.35B
- Both companies carry an **A+ rating**, reflecting strong investment quality.
---
Would you like to explore other sectors, view the full portfolio, or learn about our investment officers? Let me know! 😊
You >
Потым ачынайце сайт LangSmith і перакладзіце запісаныя рэзультаты выканання. Кожны запуск паказвае своі крокі разам з вхіднымі данымі, выходнымі данымі, часам выканання і памяткамі пра адміністрацыю.
Бесплатны ўровень
На момент напісання план Developer ёсць бесплатным: 5,000 трагов на месяц без неабяжнасці вікорыстоўвання карточкі дакументацыі. Ён включае повны аналіз кожнага кроку, ў тым вхідныя і выходныя даныя, час адпаведзення, відвяджанне токенаў і памяткі пра адміністрацыю, а таксама інструмент для швыракіх тэстаў. Ён обмежаны однай пазіцыяй і аднам працоўным просторам, з 14-дзённым збераганням трагоў, што падходзіць для індывідуальных протатыпаў і доказоў концэпцыі. LangSmith заявляе, што не трэнуе мадэлі на вашых трагах, якія застаюцца прыватнымі для вашай організацыі. Пераконтавайцеся з чыннымі планамі перад тым, як спалагацца на гэтыя ліміты.
Корачэй кажучы, пачніце з безплатнага рэжыму. Ён не каштуе нічога, на ўстановку патрабуеяцца прыблізна чвэртак гадзіны, і адразу ж показвае кожны вызов інструменту і прыметку. Перайшоўце на вышэйшы рэжым толькі тады, калі пачне растаць навантажэння з боку рэальных корыстнікаў.
Што робіць далей
- Заменіце штучныя даны на рэальныя істочнікі, такія як сістэма центральнага банкавання, CRM або внутраніе API.
- Створыце іерархію, у якой оркестратор-шлюз направляе запыткі да агентаў домэна.
- Дадзіце правілы, якія вважліва адхроняюць запыткі, якія не належаць да сферы дзеяння, і перадаюць іх людзям.
- Зберагачыце історыю размовы між кожнымі крокамі за дапамою Redis або базы дадзеных.
- Дадзіце меморыю межа сесый, каб памятаць прыходзячых корыстнікаў пра ўсе яныя ранейзькі запыткі і прывычкі.
- Установіце ліміты частоты і бюджэты токенав на кожнага корыстніка і на кожную сесыю.
- Створыце набор з 30-50 рэпрэзентатывных запыткаў з прыняцамымі рэзультатамі.