Files
kuzakhmetovartur dbd910be14
CI / build (3.1) (push) Has been cancelled
CI / build (3.11) (push) Has been cancelled
CI / build (3.8) (push) Has been cancelled
CI / build (3.9) (push) Has been cancelled
feat: solution for '8. Самописный поисковый агент на основе deep agents from scratch'
2026-07-01 13:56:19 +03:00

3.9 KiB
Raw Permalink Blame History

Что реализовано

  • Добавлены пакеты langchain-openai и langchain-community в package.json.
  • Создан класс DeepAgent в src/index.js, реализующий шаблон «Deep Agents from Scratch».
  • Внутри агента реализован планировщик (LLMChain + PromptTemplate), который принимает запрос пользователя и возвращает JSON‑объект с типом действия (search или answer).
  • В зависимости от плана агент либо вызывает инструмент SerpAPI для веб‑поиска, либо возвращает готовый ответ.
  • Добавлена простая память (BufferMemory) для хранения истории диалога.
  • В main() инициализируются LLM, инструмент поиска, память и агент, а затем агент обрабатывает запрос, переданный в командной строке.

Почему это соответствует требованиям

  • LangChain: все взаимодействия с LLM и инструментами построены через langchain‑объекты (OpenAI, SerpAPI, LLMChain, PromptTemplate).
  • OpenAI API: используется OpenAI из langchain-openai с ключом из переменной окружения OPENAI_API_KEY.
  • Deep Agent: класс DeepAgent полностью соответствует шаблону «Deep Agents from Scratch» – отдельный планировщик, исполнитель и память.
  • Поиск: при выборе search агент вызывает SerpAPI.run(query) и возвращает результат.
  • Ответ: при выборе answer агент просто возвращает строку из плана.

Ключевые фрагменты кода

package.json

"dependencies": {
  "langchain": "^0.0.0",
  "langchain-openai": "^0.0.0",
  "langchain-community": "^0.0.0",
  "dotenv": "^16.0.0"
}

src/index.js планировщик

this.planner = new LLMChain({
  llm: this.llm,
  prompt: new PromptTemplate({
    inputVariables: ["input"],
    template: `You are a helpful assistant. Given the user query: "{input}"
Decide whether you need to perform a web search or can answer directly.
Respond in JSON format:
{
  "type": "search" | "answer",
  "query": "<search query>" | null,
  "answer": "<answer>" | null
}
If you choose "search", provide the search query in "query". If you choose "answer", provide the answer in "answer".`,
  }),
});

src/index.js выполнение плана

if (plan.type === "search" && plan.query) {
  const searchTool = this.tools.find((t) => t.name === "SerpAPI");
  const searchResult = await searchTool.run(plan.query);
  return searchResult;
} else if (plan.type === "answer" && plan.answer) {
  return plan.answer;
}

Ограничения

  • Планировщик возвращает JSON, но не проверяет корректность ключей type, query, answer более глубоко.
  • В случае ошибки в ответе LLM (невалидный JSON) агент выбрасывает исключение.
  • Параметры модели и инструмента заданы статически; для гибкой конфигурации можно добавить CLI‑параметры.

Таким образом, проект теперь содержит полноценного Deep Agent, использующего LangChain и OpenAI API, способного выполнять поисковые запросы и выдавать ответы.