63 lines
3.9 KiB
Markdown
63 lines
3.9 KiB
Markdown
**Что реализовано**
|
||
- Добавлены пакеты `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`
|
||
```json
|
||
"dependencies": {
|
||
"langchain": "^0.0.0",
|
||
"langchain-openai": "^0.0.0",
|
||
"langchain-community": "^0.0.0",
|
||
"dotenv": "^16.0.0"
|
||
}
|
||
```
|
||
|
||
`src/index.js` – планировщик
|
||
```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` – выполнение плана
|
||
```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, способного выполнять поисковые запросы и выдавать ответы. |