Stream-режим AI-агента: README.md
This commit is contained in:
@@ -0,0 +1,107 @@
|
|||||||
|
# Stream‑режим AI‑агента
|
||||||
|
|
||||||
|
## Описание проекта
|
||||||
|
|
||||||
|
Проект реализует **AI‑агент**, построенный на основе LangGraph и LangChain, который взаимодействует с LLM `llama3` через Ollama и использует эмбеддинги от Nomic.
|
||||||
|
Главная особенность – **потоковый вывод** (`stream`) вместо обычного `.invoke()`. Это позволяет видеть ответ токен за токеном в реальном времени, что особенно полезно при работе с длинными запросами или многократным вызовом инструментов.
|
||||||
|
|
||||||
|
## Предварительные требования
|
||||||
|
|
||||||
|
| Компонент | Версия / Минимальные требования | Как установить |
|
||||||
|
|-----------|---------------------------------|----------------|
|
||||||
|
| **Python** | 3.10+ (рекомендуется 3.11) | `python -m venv .venv && source .venv/bin/activate` |
|
||||||
|
| **Ollama** | Любая версия, поддерживающая `llama3` | [Официальная инструкция](https://ollama.com/download) |
|
||||||
|
| **LLM‑модель** (`llama3`) | Доступна в Ollama | `ollama pull llama3` |
|
||||||
|
| **Qdrant** (необязательно, если используете внешнее хранилище) | Любая версия | `docker run -p 6333:6333 qdrant/qdrant` |
|
||||||
|
|
||||||
|
> ⚠️ Если вы не планируете хранить состояние в Qdrant, можно использовать встроенный `MemorySaver`.
|
||||||
|
|
||||||
|
## Установка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Клонируйте репозиторий (или скачайте файлы)
|
||||||
|
git clone https://github.com/your-username/stream-ai-agent.git
|
||||||
|
cd stream-ai-agent
|
||||||
|
|
||||||
|
# Создайте и активируйте виртуальное окружение
|
||||||
|
python -m venv .venv
|
||||||
|
source .venv/bin/activate # Windows: .\.venv\Scripts\activate
|
||||||
|
|
||||||
|
# Установите зависимости
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
`requirements.txt` содержит:
|
||||||
|
|
||||||
|
```text
|
||||||
|
langgraph==0.1.*
|
||||||
|
langchain==0.2.*
|
||||||
|
langchain-ollama==0.0.*
|
||||||
|
nomic-embed-text==0.3.*
|
||||||
|
python-dotenv==1.0.*
|
||||||
|
```
|
||||||
|
|
||||||
|
## Запуск
|
||||||
|
|
||||||
|
### 1. Инициализация агента (файл `agent.py`)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Убедитесь, что переменная окружения OLLAMA_MODEL установлена (по умолчанию "llama3")
|
||||||
|
export OLLAMA_MODEL=llama3 # Linux/macOS
|
||||||
|
set OLLAMA_MODEL=llama3 # Windows
|
||||||
|
|
||||||
|
python agent.py
|
||||||
|
```
|
||||||
|
|
||||||
|
> Внутри `agent.py` реализован потоковый вывод:
|
||||||
|
> ```python
|
||||||
|
> for chunk in graph.stream(state):
|
||||||
|
> print(chunk, end="", flush=True)
|
||||||
|
> ```
|
||||||
|
|
||||||
|
### 2. Тестирование с примером запроса
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Запускаем скрипт и вводим запрос вручную
|
||||||
|
python agent.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Пример ввода:
|
||||||
|
|
||||||
|
```
|
||||||
|
User: Расскажи мне о последних достижениях в области квантовых вычислений.
|
||||||
|
```
|
||||||
|
|
||||||
|
Вывод будет появляться токен за токеном, пока модель генерирует ответ.
|
||||||
|
|
||||||
|
## Пример использования
|
||||||
|
|
||||||
|
```python
|
||||||
|
from langgraph.graph import StateGraph, START
|
||||||
|
from langchain_ollama import ChatOllama
|
||||||
|
from nomic_embed_text import NomicEmbedText
|
||||||
|
from langgraph.prebuilt.tool_executor import ToolExecutorNode
|
||||||
|
from langgraph.checkpoint.memory import MemorySaver
|
||||||
|
|
||||||
|
# Инициализация LLM и эмбеддингов
|
||||||
|
llm = ChatOllama(model=os.getenv("OLLAMA_MODEL", "llama3"))
|
||||||
|
embedder = NomicEmbedText()
|
||||||
|
|
||||||
|
# Создание графа с потоковым выводом
|
||||||
|
graph = StateGraph()
|
||||||
|
graph.add_node("agent_executor", ToolExecutorNode(llm=llm, tools=[]))
|
||||||
|
graph.set_entry_point(START)
|
||||||
|
graph.set_finish_point("agent_executor")
|
||||||
|
|
||||||
|
state = {"messages": [HumanMessage(content="Привет!")]}
|
||||||
|
|
||||||
|
# Потоковый вывод
|
||||||
|
for chunk in graph.stream(state):
|
||||||
|
print(chunk, end="", flush=True)
|
||||||
|
```
|
||||||
|
|
||||||
|
> В реальном проекте вы можете подключить собственные инструменты (API‑вызыватели, базы знаний и т.д.) через `ToolExecutorNode`.
|
||||||
|
|
||||||
|
## Лицензия
|
||||||
|
|
||||||
|
MIT © 2026.
|
||||||
Reference in New Issue
Block a user