Поиск и извлечение данных
Всё, что модель знает, она узнала до определённой даты и из открытых текстов. Ваш регламент отпусков, вчерашний созвон с клиентом и внутренняя вики туда не входят. Чтобы модель отвечала по вашим данным, их нужно ей дать — и дать правильно. В уроке разбираем четыре способа, от самого простого до того, который используют в продуктах.
Способ 1: положить документ в промпт
Если документ помещается в запрос, самое надёжное — вставить его целиком. Современные модели Claude работают с очень длинным контекстом: десятки и сотни страниц за раз. Правила из предыдущих уроков:
- Документ — в тег
<document>, несколько документов — в<documents>с номером и источником у каждого. - Длинные документы — в начало промпта, вопрос и инструкции — в конец. По данным документации, это заметно повышает качество ответа на многодокументных задачах.
- Просить цитаты до ответа: «сначала выпиши в
<quotes>фрагменты, относящиеся к вопросу, потом отвечай только по ним». Это и фокусировка, и защита от галлюцинаций. - Дать выход: «если в документах нет ответа, скажи об этом».
<documents>
<document index="1">
<source>Регламент отпусков.md</source>
<content>…</content>
</document>
<document index="2">
<source>Памятка по командировкам.md</source>
<content>…</content>
</document>
</documents>
Ответь на вопрос сотрудника, опираясь только на документы выше.
Сначала в <quotes> приведи относящиеся к вопросу фрагменты
с указанием источника. Затем в <answer> дай ответ. Если документы
не содержат ответа, напиши это в <answer>.
<question>Можно ли взять отпуск на три дня без заявления за две недели?</question>Для одноразовых вопросов в чате этого достаточно: прикрепили файл, задали вопрос по правилам выше.
Способ 2: проекты в чате
Если к одним и тем же документам вы обращаетесь регулярно, в чате Claude есть проекты с базой знаний: документы загружаются один раз и доступны во всех разговорах проекта. Инструкции проекта играют роль системного промпта — туда и стоит положить правила про цитаты и выход.
Для команды это самый быстрый способ сделать «ассистента по внутренней документации» без единой строки кода. Ограничение — объём базы: если документов больше, чем помещается в контекст, нужен настоящий поиск.
Способ 3: встроенный веб-поиск
Для вопросов о внешнем мире — свежие версии библиотек, новости, документация сторонних сервисов — у Claude есть веб-поиск. В чате он включается сам, когда модель решает, что нужны актуальные данные, или по вашей просьбе «поищи в интернете». В API это серверный инструмент: вы добавляете его в список tools, а поиск выполняется на стороне Anthropic и возвращает результаты с указанием источников. Есть и инструмент для загрузки конкретной страницы по ссылке. Названия и параметры — в документации.
С точки зрения промпта это обычный вызов инструментов из прошлого урока: вы можете попросить «прежде чем отвечать про версии, проверь в поиске» или, наоборот, «не ищи, отвечай по документам ниже».
Способ 4: поиск по своей базе (RAG)
Когда документов тысячи — вся вики, весь трекер, вся переписка, — в промпт они не помещаются. Тогда работает схема, которую называют RAG (retrieval-augmented generation, генерация с извлечением): сначала найти относящиеся к вопросу фрагменты, потом положить в промпт только их.
Как это устроено, по шагам:
- Документы заранее режут на фрагменты (абзац, раздел, страница).
- Для каждого фрагмента считают эмбеддинг — числовой вектор, который отражает смысл текста. Похожие по смыслу тексты получают близкие векторы. Эмбеддинги считает отдельная модель; Anthropic своих не выпускает, в документации есть рекомендации по сторонним.
- Векторы хранят в базе, умеющей искать ближайшие.
- Когда приходит вопрос, для него тоже считают вектор, находят десяток ближайших фрагментов — и это и есть «извлечение».
- Найденные фрагменты кладут в промпт в
<documents>с источниками, и дальше всё как в способе 1: цитаты, ответ, выход.
Модель в этой схеме появляется только на пятом шаге. Всё до него — обычная инженерия: качество нарезки, выбор модели эмбеддингов, число возвращаемых фрагментов. Но промпт на последнем шаге решает, будет ли ответ точным: те же цитаты, те же источники, тот же выход.
Упрощённый пример, чтобы увидеть форму. Вместо векторов — поиск по словам; в продукте на этом месте будет векторная база.
import anthropic
client = anthropic.Anthropic()
docs = {
"Регламент отпусков": "Заявление на отпуск подаётся не позднее чем за 14 дней. "
"Отпуск до 3 дней можно согласовать с руководителем за 3 дня.",
"Памятка по командировкам": "Билеты покупает офис-менеджер по заявке в трекере…",
"Оборудование": "Ноутбук выдаётся в первый рабочий день…",
}
def retrieve(question, k=2):
words = set(question.lower().split())
scored = sorted(
docs.items(),
key=lambda kv: -len(words & set(kv[1].lower().split())),
)
return scored[:k]
question = "Можно ли взять отпуск на три дня без заявления за две недели?"
found = retrieve(question)
documents = "\n".join(
f'<document index="{i+1}"><source>{name}</source><content>{text}</content></document>'
for i, (name, text) in enumerate(found)
)
prompt = f"""<documents>
{documents}
</documents>
Ответь на вопрос, опираясь только на документы. Сначала в <quotes>
приведи относящиеся фрагменты с источником, затем в <answer> ответ.
Если ответа в документах нет, скажи об этом.
<question>{question}</question>"""
response = client.messages.create(
model="claude-opus-5", max_tokens=800,
messages=[{"role": "user", "content": prompt}],
)
print(response.content[0].text)Для нечитающих код: программа выбрала два документа, наиболее похожих на вопрос, и собрала из них промпт по шаблону из способа 1. Всё остальное — знакомый вам промпт-инжиниринг.
Что зависит от промпта, а что нет
Если ответ неточный, сначала проверьте, что нашёл поиск. Модель не может ответить по фрагменту, которого ей не дали. Половина проблем RAG — это проблемы извлечения: не тот фрагмент, слишком короткий фрагмент, нужный абзац разрезан пополам.
Если фрагменты правильные, а ответ всё равно плох — работайте с промптом: цитаты до ответа, источник у каждой цитаты, явный выход, вопрос после документов. Попросите модель указывать, из какого документа взят каждый факт: это сразу покажет, где она опирается на извлечённое, а где на собственные знания.
Пример из работы
Команда поддержки внутреннего продукта отвечает на одни и те же вопросы по документации на сотни страниц. Первая версия ассистента — проект в чате с загруженной документацией — закрыла большинство вопросов за день настройки. Когда документация перестала помещаться, разработчики собрали RAG: нарезка по разделам, векторная база, промпт с цитатами и источниками. Промпт при этом почти не изменился — изменился только способ, которым документы попадают в него.
Попробуйте сами
10–15 мин на рабочем месте- Возьмите два-три внутренних документа (регламент, памятку, FAQ) и задайте по ним три вопроса в чате: с прямым ответом, с ответом, собранным из двух документов, и без ответа. Используйте шаблон с
<documents>,<quotes>и выходом. Правильно ли модель указывает источники? - Создайте проект в Claude с этими же документами и правилами в инструкциях. Задайте те же вопросы в новом разговоре. Проверьте, что ответы не хуже.
- Задайте вопрос о свежей версии библиотеки или сервиса, который вы используете, сначала запретив поиск («отвечай по памяти и укажи, насколько уверен»), потом попросив проверить в интернете. Сравните ответы с реальностью.
Коротко
- Модель не знает ваших документов и событий после даты обучения; данные нужно дать.
- Помещается в промпт — вставляйте целиком: документы в начале в
<documents>, вопрос в конце, цитаты до ответа, выход. - Регулярная работа с одними документами — проекты в чате с инструкциями вместо системного промпта.
- Внешний мир — встроенный веб-поиск, в API это серверный инструмент с источниками.
- Не помещается — RAG: нарезка, эмбеддинги, поиск ближайших фрагментов, и тот же промпт на последнем шаге.
- Плохой ответ — сначала проверьте, что нашёл поиск, потом промпт.
Видеоверсия
Сценарий озвучки · 503 слова, ≈ 4 мин
Всё, что модель знает, она узнала до определённой даты и из открытых текстов. Ваш регламент отпусков, вчерашний созвон и внутренняя вики туда не входят. Чтобы модель отвечала по вашим данным, их нужно ей дать — и дать правильно. Разберём четыре способа.
Первый — положить документ в промпт. Если он помещается, это самое надёжное. Современные модели Claude работают с очень длинным контекстом — десятки и сотни страниц. Правила знакомые: документ в тег, несколько документов — в общий тег с номером и источником у каждого. Длинные документы в начало промпта, вопрос в конец: по данным документации, это заметно повышает качество. Просить цитаты до ответа и давать выход, если ответа в документах нет. Для одноразового вопроса в чате этого достаточно: прикрепили файл, задали вопрос.
Второй способ — проекты в чате. Если к одним документам вы обращаетесь регулярно, загрузите их в проект один раз, а в инструкции проекта положите правила про цитаты и выход. Для команды это самый быстрый способ сделать ассистента по внутренней документации без единой строки кода. Ограничение — объём: если документов больше, чем помещается, нужен настоящий поиск.
Третий — встроенный веб-поиск. Для свежих версий библиотек, новостей, чужой документации. В чате он включается сам или по просьбе «поищи в интернете». В API это серверный инструмент: добавляете в список инструментов, поиск выполняется на стороне Anthropic и возвращает результаты с источниками. С точки зрения промпта это обычный вызов инструментов.
Четвёртый — поиск по своей базе, то, что называют «раг», генерация с извлечением. Когда документов тысячи, в промпт они не помещаются, и схема такая. Документы заранее режут на фрагменты. Для каждого считают эмбеддинг — числовой вектор, отражающий смысл текста; похожие тексты получают близкие векторы. Векторы хранят в базе, которая умеет искать ближайшие. Когда приходит вопрос, для него тоже считают вектор, находят десяток ближайших фрагментов — это и есть извлечение. Найденные фрагменты кладут в промпт с источниками, и дальше всё как в первом способе: цитаты, ответ, выход. Модель появляется только на последнем шаге. Всё до него — обычная инженерия: качество нарезки, выбор модели эмбеддингов, число фрагментов. Но промпт на последнем шаге решает, будет ли ответ точным.
Что зависит от промпта, а что нет. Если ответ неточный, сначала проверьте, что нашёл поиск. Модель не может ответить по фрагменту, которого ей не дали. Половина проблем такой системы — это проблемы извлечения: не тот фрагмент, нужный абзац разрезан пополам. Если фрагменты правильные, а ответ плох — работайте с промптом. И попросите модель указывать, из какого документа взят каждый факт: сразу видно, где она опирается на извлечённое, а где на собственную память.
Пример из работы. Команда поддержки внутреннего продукта отвечает на одни и те же вопросы по документации на сотни страниц. Первая версия — проект в чате с загруженной документацией — закрыла большинство вопросов за день. Когда документация перестала помещаться, собрали поиск по базе. Промпт при этом почти не изменился — изменился только способ, которым документы в него попадают.
Попробуйте: возьмите два-три внутренних документа и задайте по ним три вопроса — с прямым ответом, с ответом из двух документов и без ответа. Проверьте, правильно ли модель указывает источники. На этом курс закончен. Вернитесь к промпту из первого урока и перепишите его — теперь у вас есть всё, чтобы сделать это хорошо.
