Реализация Question Answering (ответы на вопросы по документам)
QA по документам — система, принимающая вопрос на естественном языке и возвращающая ответ, найденный или синтезированный на основе корпуса документов. Это основа для корпоративных поисковых систем, баз знаний и автоматических помощников.
Архитектуры QA-систем
Extractive QA: ответ — точный фрагмент из документа. Модель выбирает span (начало/конец) в найденном документе. deepset/roberta-base-squad2, sberbank-ai/rubert-base-cased-qa — готовые модели. Преимущество: нет галлюцинаций. Недостаток: ответ должен буквально быть в тексте.
RAG (Retrieval-Augmented Generation): наиболее распространённый production-подход. Ретривер находит релевантные документы, LLM синтезирует ответ. Ответ может обобщать информацию из нескольких источников.
Long-context LLM: Claude 3.5 (200K токенов) или Gemini Pro (1M токенов) — весь корпус документов в контексте. Для небольших баз знаний (< 500 страниц) это проще RAG.
RAG Pipeline
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Qdrant
from langchain.chains import RetrievalQA
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Qdrant.from_existing_collection(
embeddings=embeddings,
url="http://localhost:6333",
collection_name="docs"
)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # или "map_reduce" для длинных документов
retriever=vectorstore.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True,
)
result = qa_chain.invoke({"query": "Каков порядок расторжения договора?"})
# result["result"] — ответ
# result["source_documents"] — источники
Контроль галлюцинаций
Критически важно для доверия к системе:
- Цитирование источников: каждый факт в ответе → ссылка на документ/параграф
- Faithfulness check: отдельный промпт проверяет, подтверждается ли ответ контекстом
- Явный отказ: если информации нет в документах — «В доступных документах нет ответа на этот вопрос»
- Confidence scoring: оценка уверенности (logprobs или отдельная chain)
Advanced retrieval
Базовый top-K retriever недостаточен для сложных вопросов:
- HyDE (Hypothetical Document Embeddings): сначала LLM генерирует гипотетический ответ, затем ищет по его эмбеддингу
- Multi-query: переформулировать вопрос 3–5 способами, объединить результаты
- Parent-child chunks: хранить мелкие chunks для поиска, но передавать в LLM родительский более широкий контекст
Работа с таблицами и структурированными данными
QA по таблицам — отдельная задача. Варианты:
- Text2SQL: LLM генерирует SQL-запрос, выполняет, возвращает результат
- Table serialization: таблица → Markdown/CSV → в контекст LLM
- TAPAS (Google): специализированная модель для QA по таблицам
Метрики качества
- Exact Match (EM): доля вопросов с точно правильным ответом (для extractive)
- F1 score: token overlap ответа с эталоном
- RAGAS: специализированная библиотека для evaluation RAG: faithfulness, answer relevance, context precision, context recall







