45 lines
2.8 KiB
Markdown
45 lines
2.8 KiB
Markdown
**Что реализовано**
|
||
- Добавлен пакет `langchain-openai` в `requirements.txt`.
|
||
- В `src/agent.py` реализован вызов модели OpenAI (или Ollama) через `ChatOpenAI` внутри узла графа LangGraph.
|
||
- Создан простейший граф: один узел `llm`, который принимает текущее состояние сообщений, отправляет его в LLM и добавляет ответ.
|
||
- Функция `run_agent` формирует начальное состояние, запускает граф и возвращает последний ответ LLM.
|
||
|
||
**Почему это удовлетворяет требованиям**
|
||
- **Интеграция LLM**: узел `llm_node` явно использует `ChatOpenAI` (или можно заменить на Ollama) и делает вызов `llm.invoke(messages)`.
|
||
- **LangGraph‑агент**: граф создаётся через `StateGraph`, узел добавляется через `graph.add_node`, а запуск осуществляется через `graph.invoke`.
|
||
- **Пакет в требованиях**: упоминание `langchain-openai` в `requirements.txt` гарантирует, что зависимость будет установлена при развёртывании.
|
||
|
||
**Ключевые фрагменты кода**
|
||
|
||
`src/agent.py` – инициализация LLM
|
||
```python
|
||
llm = ChatOpenAI(
|
||
api_key=os.getenv("OPENAI_API_KEY"),
|
||
model="gpt-4o-mini",
|
||
)
|
||
```
|
||
|
||
`src/agent.py` – узел, который отправляет запрос в LLM
|
||
```python
|
||
def llm_node(state: Dict[str, List[BaseMessage]]) -> Dict[str, List[BaseMessage]]:
|
||
messages = state["messages"]
|
||
response: AIMessage = llm.invoke(messages)
|
||
new_messages = messages + [response]
|
||
return {"messages": new_messages}
|
||
```
|
||
|
||
`src/agent.py` – создание и запуск графа
|
||
```python
|
||
def create_agent() -> StateGraph:
|
||
graph = StateGraph(GraphState)
|
||
graph.add_node("llm", llm_node)
|
||
graph.set_entry_point("llm")
|
||
graph.add_edge("llm", END)
|
||
return graph
|
||
```
|
||
|
||
**Ограничения**
|
||
- Нет обработки ошибок при вызове LLM (например, таймауты, недоступность сервиса).
|
||
- Нет поддержки потокового вывода (streaming).
|
||
- Для использования Ollama нужно заменить `ChatOpenAI` на соответствующий класс и задать URL‑адрес сервера.
|
||
- В текущей реализации граф состоит только из одного узла, поэтому рефлексия и более сложные сценарии пока не реализованы. |