Ключевые компоненты RAG-системы:
- эмбеддинговая модель преобразует текст в вектора
- векторное хранилище позволяет эффективно искать релевантные фрагменты
- LLM отвечает за генерацию финального ответа
- а промпт задаёт строгие правила обработки контекста
*Каждый из этих элементов выполняет свою роль в общей архитектуре и обеспечивает точность, управляемость и воспроизводимость ответа.*
*Однако сами по себе эти компоненты не образуют рабочий пайплайн – их необходимо связать в единый поток данных.*
Нам нужно определить, как запрос пользователя передаётся в retriever, как найденные документы форматируются, как они попадают в промпт и как затем передаются модели.
За координацию всех этих шагов отвечает цепочка LangChain, которая позволяет собрать весь процесс в понятный и детерминированный конвейер.
Именно для этого мы создаём **RAG-chain: объект, который описывает полный маршрут данных – от входного вопроса до финального текстового ответа.**
RAG-chain создаёт цепочку обработки данных в стиле LangChain – **по сути, конвейер, где каждый шаг передаёт результат следующему**. Синтаксис построен на операторе `|`, который работает как "передай дальше".
В данном случае цепочка объединяет: retriever, форматтер документов, промпт, модель и парсер результата.
```python
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
# Chain
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
```
`retriever` - возвращает структурированные объекты Document, но LLM ожидает обычный текст, поэтому функция занимается сериализацией и нормализацией данных.
`format_docs` – это функция-постпроцессор, которая принимает список документов от retriever’а и преобразует их в одну текстовую строку, пригодную для подстановки в промпт.
>Благодаря функции `format_docs` можно конвертировать документ в человекочитаемый блок. Кроме этого можно извлечь метаданные (source, page) и добавить их перед текстом, чтобы модель понимала происхождение фрагмента. Это улучшает интерпретацию контекста и помогает модели ссылаться на источники, если системный промпт это требует.