LLM (Large Language Model) – это **последний этап RAG-цепочки**, который:
- получает **вопрос пользователя**;
- получает **контекст**, отобранный retriever’ом и отформатированный (`format_docs`);
- **формулирует ответ**, опираясь на системный промпт и переданный контекст.
Важно:
В RAG **LLM не ищет информацию** и не принимает решений о том, _что_ подать в контекст.
Она только отвечает на основе того, **что ей дали**.
Поэтому в RAG LLM – это:
> не "умная база знаний", а интерпретатор и генератор ответа.
## Какие бывают LLM в LangChain
LangChain отделяет **тип модели** от **провайдера**, поэтому один и тот же код может работать с локальной моделью, OpenAI, Anthropic и т.д.
### Основные типы моделей
|Тип модели|Что это|Когда использовать|
|---|---|---|
|**Chat models**|Модели, работающие с сообщениями (`system`, `human`, `assistant`)|RAG, чат-боты, ассистенты|
|**LLM (completion)**|Старый формат "один текст → один текст"|Редко используется в новых RAG|
В RAG почти всегда используются **chat-модели**.
### Провайдеры chat-моделей
|Провайдер|Пример|Особенности|
|---|---|---|
|OpenAI|GPT-4, GPT-4o|Качество, но платно|
|Ollama|Mistral, Gemma, Llama|Локально, контроль данных|
|Anthropic|Claude|Хорош с длинным контекстом|
|HuggingFace|Inference API|Гибкость, много моделей|
LangChain даёт **единый интерфейс**, поэтому смена модели – это замена 2–3 строк кода.
```python
# Будем использовать модль с поддержкой Русского языка:
# <https://huggingface.co/bartowski/Mistral-Nemo-Instruct-2407-GGUF>
# ollama pull hf.co/bartowski/Mistral-Nemo-Instruct-2407-GGUF:Q4_K_M
# если железо начинает лагать, возьмите модель попроще. Например: gemma3:4b
# ollama pull gemma3:4b
from langchain_openai import ChatOpenAI
OLLAMA_BASE_URL = '<http://127.0.0.1:11434/v1>'
# LLM_MODEL = 'hf.co/bartowski/Mistral-Nemo-Instruct-2407-GGUF:Q4_K_M'
LLM_MODEL = 'gemma3:4b'
llm = ChatOpenAI(
api_key='None',
base_url=OLLAMA_BASE_URL,
model=LLM_MODEL
)
```
Чтобы протестировать модель, используем метод `invoke()`:
```python
llm.invoke('Привет! Ты кто?')
```