Блоки содержимого результатов поиска обеспечивают естественные цитирования с надлежащим указанием источника, привнося цитирования качества веб-поиска в ваши пользовательские приложения. Эта функция особенно мощна для приложений RAG (Retrieval-Augmented Generation), где вам нужно, чтобы Claude точно указывал источники. Функция результатов поиска доступна на следующих моделях:
  • Claude Opus 4.1 (claude-opus-4-1-20250805)
  • Claude Opus 4 (claude-opus-4-20250514)
  • Claude Sonnet 4.5 (claude-sonnet-4-5-20250929)
  • Claude Sonnet 4 (claude-sonnet-4-20250514)
  • Claude Sonnet 3.7 (устарела) (claude-3-7-sonnet-20250219)
  • Claude 3.5 Haiku (claude-3-5-haiku-20241022)

Ключевые преимущества

  • Естественные цитирования - Достигните того же качества цитирования, что и веб-поиск, для любого содержимого
  • Гибкая интеграция - Используйте в возвращаемых значениях инструментов для динамического RAG или как содержимое верхнего уровня для предварительно загруженных данных
  • Надлежащее указание источника - Каждый результат включает информацию об источнике и названии для четкого указания источника
  • Не требуются обходные пути на основе документов - Исключает необходимость в обходных путях на основе документов
  • Согласованный формат цитирования - Соответствует качеству и формату цитирования функции веб-поиска Claude

Как это работает

Результаты поиска можно предоставить двумя способами:
  1. Из вызовов инструментов - Ваши пользовательские инструменты возвращают результаты поиска, обеспечивая динамические приложения RAG
  2. Как содержимое верхнего уровня - Вы предоставляете результаты поиска непосредственно в сообщениях пользователя для предварительно загруженного или кэшированного содержимого
В обоих случаях Claude может автоматически цитировать информацию из результатов поиска с надлежащим указанием источника.

Схема результата поиска

Результаты поиска используют следующую структуру:
{
  "type": "search_result",
  "source": "https://example.com/article",  // Обязательно: URL источника или идентификатор
  "title": "Article Title",                  // Обязательно: Название результата
  "content": [ // Обязательно: Массив текстовых блоков
    {
      "type": "text",
      "text": "The actual content of the search result..."
    }
  ],
  "citations": {                             // Необязательно: Конфигурация цитирования
    "enabled": true                          // Включить/отключить цитирования для этого результата
  }
}

Обязательные поля

ПолеТипОписание
typestringДолжно быть "search_result"
sourcestringURL источника или идентификатор содержимого
titlestringОписательное название для результата поиска
contentarrayМассив текстовых блоков, содержащих фактическое содержимое

Необязательные поля

ПолеТипОписание
citationsobjectКонфигурация цитирования с логическим полем enabled
cache_controlobjectПараметры управления кэшем (например, {"type": "ephemeral"})
Каждый элемент в массиве content должен быть текстовым блоком с:
  • type: Должно быть "text"
  • text: Фактическое текстовое содержимое (непустая строка)

Метод 1: Результаты поиска из вызовов инструментов

Наиболее мощный вариант использования - возврат результатов поиска из ваших пользовательских инструментов. Это обеспечивает динамические приложения RAG, где инструменты получают и возвращают релевантное содержимое с автоматическими цитированиями.

Пример: Инструмент базы знаний

from anthropic import Anthropic
from anthropic.types import (
    MessageParam,
    TextBlockParam,
    SearchResultBlockParam,
    ToolResultBlockParam
)

client = Anthropic()

# Define a knowledge base search tool
knowledge_base_tool = {
    "name": "search_knowledge_base",
    "description": "Search the company knowledge base for information",
    "input_schema": {
        "type": "object",
        "properties": {
            "query": {
                "type": "string",
                "description": "The search query"
            }
        },
        "required": ["query"]
    }
}

# Function to handle the tool call
def search_knowledge_base(query):
    # Your search logic here
    # Returns search results in the correct format
    return [
        SearchResultBlockParam(
            type="search_result",
            source="https://docs.company.com/product-guide",
            title="Product Configuration Guide",
            content=[
                TextBlockParam(
                    type="text",
                    text="To configure the product, navigate to Settings > Configuration. The default timeout is 30 seconds, but can be adjusted between 10-120 seconds based on your needs."
                )
            ],
            citations={"enabled": True}
        ),
        SearchResultBlockParam(
            type="search_result",
            source="https://docs.company.com/troubleshooting",
            title="Troubleshooting Guide",
            content=[
                TextBlockParam(
                    type="text",
                    text="If you encounter timeout errors, first check the configuration settings. Common causes include network latency and incorrect timeout values."
                )
            ],
            citations={"enabled": True}
        )
    ]

# Create a message with the tool
response = client.messages.create(
    model="claude-sonnet-4-5",  # Works with all supported models
    max_tokens=1024,
    tools=[knowledge_base_tool],
    messages=[
        MessageParam(
            role="user",
            content="How do I configure the timeout settings?"
        )
    ]
)

# When Claude calls the tool, provide the search results
if response.content[0].type == "tool_use":
    tool_result = search_knowledge_base(response.content[0].input["query"])
    
    # Send the tool result back
    final_response = client.messages.create(
        model="claude-sonnet-4-5",  # Works with all supported models
        max_tokens=1024,
        messages=[
            MessageParam(role="user", content="How do I configure the timeout settings?"),
            MessageParam(role="assistant", content=response.content),
            MessageParam(
                role="user",
                content=[
                    ToolResultBlockParam(
                        type="tool_result",
                        tool_use_id=response.content[0].id,
                        content=tool_result  # Search results go here
                    )
                ]
            )
        ]
    )

Метод 2: Результаты поиска как содержимое верхнего уровня

Вы также можете предоставить результаты поиска непосредственно в сообщениях пользователя. Это полезно для:
  • Предварительно загруженного содержимого из вашей инфраструктуры поиска
  • Кэшированных результатов поиска из предыдущих запросов
  • Содержимого из внешних служб поиска
  • Тестирования и разработки

Пример: Прямые результаты поиска

from anthropic import Anthropic
from anthropic.types import (
    MessageParam,
    TextBlockParam,
    SearchResultBlockParam
)

client = Anthropic()

# Provide search results directly in the user message
response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    messages=[
        MessageParam(
            role="user",
            content=[
                SearchResultBlockParam(
                    type="search_result",
                    source="https://docs.company.com/api-reference",
                    title="API Reference - Authentication",
                    content=[
                        TextBlockParam(
                            type="text",
                            text="All API requests must include an API key in the Authorization header. Keys can be generated from the dashboard. Rate limits: 1000 requests per hour for standard tier, 10000 for premium."
                        )
                    ],
                    citations={"enabled": True}
                ),
                SearchResultBlockParam(
                    type="search_result",
                    source="https://docs.company.com/quickstart",
                    title="Getting Started Guide",
                    content=[
                        TextBlockParam(
                            type="text",
                            text="To get started: 1) Sign up for an account, 2) Generate an API key from the dashboard, 3) Install our SDK using pip install company-sdk, 4) Initialize the client with your API key."
                        )
                    ],
                    citations={"enabled": True}
                ),
                TextBlockParam(
                    type="text",
                    text="Based on these search results, how do I authenticate API requests and what are the rate limits?"
                )
            ]
        )
    ]
)

print(response.model_dump_json(indent=2))

Ответ Claude с цитированиями

Независимо от того, как предоставляются результаты поиска, Claude автоматически включает цитирования при использовании информации из них:
{
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "To authenticate API requests, you need to include an API key in the Authorization header",
      "citations": [
        {
          "type": "search_result_location",
          "source": "https://docs.company.com/api-reference",
          "title": "API Reference - Authentication",
          "cited_text": "All API requests must include an API key in the Authorization header",
          "search_result_index": 0,
          "start_block_index": 0,
          "end_block_index": 0
        }
      ]
    },
    {
      "type": "text",
      "text": ". You can generate API keys from your dashboard",
      "citations": [
        {
          "type": "search_result_location",
          "source": "https://docs.company.com/api-reference",
          "title": "API Reference - Authentication",
          "cited_text": "Keys can be generated from the dashboard",
          "search_result_index": 0,
          "start_block_index": 0,
          "end_block_index": 0
        }
      ]
    },
    {
      "type": "text",
      "text": ". The rate limits are 1,000 requests per hour for the standard tier and 10,000 requests per hour for the premium tier.",
      "citations": [
        {
          "type": "search_result_location",
          "source": "https://docs.company.com/api-reference",
          "title": "API Reference - Authentication",
          "cited_text": "Rate limits: 1000 requests per hour for standard tier, 10000 for premium",
          "search_result_index": 0,
          "start_block_index": 0,
          "end_block_index": 0
        }
      ]
    }
  ]
}

Поля цитирования

Каждое цитирование включает:
ПолеТипОписание
typestringВсегда "search_result_location" для цитирований результатов поиска
sourcestringИсточник из исходного результата поиска
titlestring или nullНазвание из исходного результата поиска
cited_textstringТочный цитируемый текст
search_result_indexintegerИндекс результата поиска (начиная с 0)
start_block_indexintegerНачальная позиция в массиве содержимого
end_block_indexintegerКонечная позиция в массиве содержимого
Примечание: search_result_index относится к индексу блока содержимого результата поиска (начиная с 0), независимо от того, как были предоставлены результаты поиска (вызов инструмента или содержимое верхнего уровня).

Несколько блоков содержимого

Результаты поиска могут содержать несколько текстовых блоков в массиве content:
{
  "type": "search_result",
  "source": "https://docs.company.com/api-guide",
  "title": "API Documentation",
  "content": [
    {
      "type": "text",
      "text": "Authentication: All API requests require an API key."
    },
    {
      "type": "text",
      "text": "Rate Limits: The API allows 1000 requests per hour per key."
    },
    {
      "type": "text",
      "text": "Error Handling: The API returns standard HTTP status codes."
    }
  ]
}
Claude может цитировать конкретные блоки, используя поля start_block_index и end_block_index.

Расширенное использование

Объединение обоих методов

Вы можете использовать результаты поиска на основе инструментов и содержимое верхнего уровня в одном разговоре:
# First message with top-level search results
messages = [
    MessageParam(
        role="user",
        content=[
            SearchResultBlockParam(
                type="search_result",
                source="https://docs.company.com/overview",
                title="Product Overview",
                content=[
                    TextBlockParam(type="text", text="Our product helps teams collaborate...")
                ],
                citations={"enabled": True}
            ),
            TextBlockParam(
                type="text",
                text="Tell me about this product and search for pricing information"
            )
        ]
    )
]

# Claude might respond and call a tool to search for pricing
# Then you provide tool results with more search results

Объединение с другими типами содержимого

Оба метода поддерживают смешивание результатов поиска с другим содержимым:
# In tool results
tool_result = [
    SearchResultBlockParam(
        type="search_result",
        source="https://docs.company.com/guide",
        title="User Guide",
        content=[TextBlockParam(type="text", text="Configuration details...")],
        citations={"enabled": True}
    ),
    TextBlockParam(
        type="text",
        text="Additional context: This applies to version 2.0 and later."
    )
]

# In top-level content
user_content = [
    SearchResultBlockParam(
        type="search_result",
        source="https://research.com/paper",
        title="Research Paper",
        content=[TextBlockParam(type="text", text="Key findings...")],
        citations={"enabled": True}
    ),
    {
        "type": "image",
        "source": {"type": "url", "url": "https://example.com/chart.png"}
    },
    TextBlockParam(
        type="text",
        text="How does the chart relate to the research findings?"
    )
]

Управление кэшем

Добавьте управление кэшем для лучшей производительности:
{
  "type": "search_result",
  "source": "https://docs.company.com/guide",
  "title": "User Guide",
  "content": [{"type": "text", "text": "..."}],
  "cache_control": {
    "type": "ephemeral"
  }
}

Управление цитированиями

По умолчанию цитирования отключены для результатов поиска. Вы можете включить цитирования, явно установив конфигурацию citations:
{
  "type": "search_result",
  "source": "https://docs.company.com/guide",
  "title": "User Guide",
  "content": [{"type": "text", "text": "Important documentation..."}],
  "citations": {
    "enabled": true  // Enable citations for this result
  }
}
Когда citations.enabled установлено на true, Claude будет включать ссылки на цитирования при использовании информации из результата поиска. Это обеспечивает:
  • Естественные цитирования для ваших пользовательских приложений RAG
  • Указание источника при взаимодействии с собственными базами знаний
  • Цитирования качества веб-поиска для любого пользовательского инструмента, который возвращает результаты поиска
Если поле citations опущено, цитирования отключены по умолчанию.
Цитирования - это все или ничего: либо все результаты поиска в запросе должны иметь включенные цитирования, либо все должны иметь их отключенными. Смешивание результатов поиска с различными параметрами цитирования приведет к ошибке. Если вам нужно отключить цитирования для некоторых источников, вы должны отключить их для всех результатов поиска в этом запросе.

Лучшие практики

Для поиска на основе инструментов (Метод 1)

  • Динамическое содержимое: Используйте для поиска в реальном времени и динамических приложений RAG
  • Обработка ошибок: Возвращайте соответствующие сообщения при сбое поиска
  • Ограничения результатов: Возвращайте только наиболее релевантные результаты, чтобы избежать переполнения контекста

Для поиска верхнего уровня (Метод 2)

  • Предварительно загруженное содержимое: Используйте, когда у вас уже есть результаты поиска
  • Пакетная обработка: Идеально подходит для обработки нескольких результатов поиска одновременно
  • Тестирование: Отлично подходит для тестирования поведения цитирования с известным содержимым

Общие лучшие практики

  1. Эффективно структурируйте результаты
    • Используйте четкие, постоянные URL-адреса источников
    • Предоставляйте описательные названия
    • Разбивайте длинное содержимое на логические текстовые блоки
  2. Поддерживайте согласованность
    • Используйте согласованные форматы источников в вашем приложении
    • Убедитесь, что названия точно отражают содержимое
    • Сохраняйте согласованное форматирование
  3. Обрабатывайте ошибки корректно
    def search_with_fallback(query):
        try:
            results = perform_search(query)
            if not results:
                return {"type": "text", "text": "No results found."}
            return format_as_search_results(results)
        except Exception as e:
            return {"type": "text", "text": f"Search error: {str(e)}"}
    

Ограничения

  • Блоки содержимого результатов поиска доступны на Claude API и Google Cloud’s Vertex AI
  • Внутри результатов поиска поддерживается только текстовое содержимое (без изображений или других медиа)
  • Массив content должен содержать по крайней мере один текстовый блок