Ключевые компоненты 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) и добавить их перед текстом, чтобы модель понимала происхождение фрагмента. Это улучшает интерпретацию контекста и помогает модели ссылаться на источники, если системный промпт это требует.