Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансияв ленте Talanto
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью
Разместить вакансию

Популярные направления

Все подборки
  • Backend вакансии
  • Python
  • DevOps вакансии
  • Бизнес-аналитик
  • QA вакансии
  • Продакт-менеджер

Разработка

  • Frontend вакансии
  • Fullstack вакансии
  • Mobile вакансии
  • iOS
  • Android
  • AI вакансии

По стеку

  • Java
  • Go
  • Node.js
  • Kotlin
  • Rust
  • .NET
  • C#
  • C++
  • PHP

DevOps и инфраструктура

  • CI/CD
  • Облачные технологии
  • Terraform / IaC
  • Linux-инфраструктура
  • Kubernetes
  • Мониторинг и Observability
  • Кибербезопасность
  • SRE

Аналитика и данные

  • Аналитик данных
  • Системный аналитик
  • Инженер данных
  • Data Scientist

Другие направления

  • Ручное тестирование
  • Проджект-менеджер
  • UI/UX дизайн

По регионам

  • Вакансии в Европе
  • Вакансии в США
  • Вакансии в Канаде
  • Работа в России

По формату

  • Удалённые вакансии
  • Релокация в США
  • Гибридная работа
  • Офисная работа

По уровню

  • Junior вакансии
  • Middle вакансии
  • Senior вакансии
КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме LangGraphВсе вопросы
LangGraphMiddleОпыт

Расскажите о случае, когда вы использовали LangGraph для pipeline, evaluation, optimization, deployment или debugging.

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Использовал LangGraph для построения RAG-агента с автоматической проверкой релевантности: если retrieval возвращал слабые результаты, граф делал шаг web-поиска перед генерацией. Checkpointing позволял возобновлять прерванные сессии.

Архитектура графа

from langgraph.graph import StateGraph, END
from langgraph.checkpoint.sqlite import SqliteSaver
from typing import TypedDict, Annotated
import operator

class AgentState(TypedDict):
    question: str
    documents: Annotated[list[str], operator.add]
    generation: str
    web_search_needed: bool
    iterations: int

Задача: RAG-агент с адаптивным retrieval

Нужно было построить агента для ответов на вопросы по внутренней документации компании. Проблема простого RAG: документация неполная, часть вопросов требовала актуальных данных из интернета. Решение — граф с условным web-поиском.

Узлы графа

from langchain_chroma import Chroma
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.tools import TavilySearchResults

vectorstore = Chroma(embedding_function=OpenAIEmbeddings(), persist_directory="./db")
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
web_search = TavilySearchResults(max_results=3, api_key="tvly-...")
llm = ChatOpenAI(model="gpt-4o", temperature=0)

def retrieve(state: AgentState) -> AgentState:
    docs = retriever.invoke(state["question"])
    return {"documents": [d.page_content for d in docs]}

def grade_documents(state: AgentState) -> str:
    """Проверяем релевантность через LLM."""
    grader_prompt = f"""Are these documents relevant to '{state['question']}'?
    Documents: {state['documents'][:2]}
    Answer yes or no only."""
    result = llm.invoke(grader_prompt).content.lower()
    if "no" in result or len(state["documents"]) == 0:
        return "web_search"
    return "generate"

def web_search_node(state: AgentState) -> AgentState:
    results = web_search.invoke(state["question"])
    web_docs = [r["content"] for r in results]
    return {"documents": web_docs, "web_search_needed": True}

def generate(state: AgentState) -> AgentState:
    context = "\n\n".join(state["documents"][:6])
    prompt = f"""Answer based on context:\n{context}\n\nQuestion: {state['question']}"""
    response = llm.invoke(prompt)
    return {"generation": response.content, "iterations": state.get("iterations", 0) + 1}

Сборка и компиляция

graph = StateGraph(AgentState)
graph.add_node("retrieve", retrieve)
graph.add_node("web_search", web_search_node)
graph.add_node("generate", generate)

graph.set_entry_point("retrieve")
graph.add_conditional_edges(
    "retrieve",
    grade_documents,
    {"web_search": "web_search", "generate": "generate"}
)
graph.add_edge("web_search", "generate")
graph.add_edge("generate", END)

with SqliteSaver.from_conn_string("checkpoints.db") as checkpointer:
    app = graph.compile(checkpointer=checkpointer)

Запуск и debugging

config = {"configurable": {"thread_id": "session-001"}, "recursion_limit": 5}

# Streaming для отладки промежуточных шагов
for event in app.stream({"question": "What is the deployment process?"}, config=config):
    for key, value in event.items():
        print(f"Node: {key}")
        if "generation" in value:
            print(f"Answer: {value['generation'][:200]}")

Оценка качества

После запуска добавили LangSmith evaluation: собирали вопросы из реального трафика, вручную размечали корректные ответы и запускали evaluate раз в неделю для выявления деградации.

Подводные камни

  • Grader на основе LLM добавляет 500–800ms к каждому запросу и стоит дополнительных токенов — для высоконагруженных систем замените на embedding-similarity score.
  • SqliteSaver не thread-safe при параллельных запросах — в production заменили на PostgreSQL через langgraph-checkpoint-postgres.
  • Web search через Tavily стоит денег за каждый запрос — без кэширования одинаковых вопросов расходы быстро растут.
  • Streaming через app.stream() несовместим с некоторыми ASGI-фреймворками без дополнительной обёртки для Server-Sent Events.
  • State schema нельзя изменить без миграции checkpoints — при добавлении нового поля все старые сессии теряют это поле.

Частые вопросы на собеседовании

  • Как LangGraph представляет состояние с помощью TypedDict и как оно передаётся между узлами?
  • Что является основной абстракцией в LangGraph — что такое nodes, edges и state?
  • Что такое LangGraph и как он расширяет LangChain для построения stateful агентских воркфлоу?
  • В каких data/AI-задачах LangGraph даёт реальный выигрыш, а где лучше выбрать другой инструмент или более простой pipeline?

Что портит ответ

  • Выдумывать опыт или говорить слишком общими фразами
  • Не объяснять свою личную роль в работе с LangGraph
  • Не показывать результат, метрики или извлечённые уроки

Что слушает интервьюер

  • Может подготовить честный пример использования LangGraph
  • Показывает свою роль, решения и результат
  • Умеет рефлексировать над trade-offs и уроками

Как вы знаете этот вопрос?

Проверить себя по теме LangGraph →
←Предыдущий вопросЧто такое функция-редуктор `add_messages` и как она обрабатывает обновления состояния для списков сообщений?Следующий вопрос→Как реализовать параллелизм с помощью `Send` API в LangGraph для fan-out операций?

Связанные темы

LangGraphexperience-storytellinglanggraphtechnical-communicationtechnology-selectiontrade-off-analysis