Claude в Google Vertex AI

Подключение Claude через Google Cloud — авторизация, регионы, биллинг.

100 уроков, первые 3 бесплатно. Полный доступ: 1490 руб.

Уроки курса

  1. Welcome to the course
  2. Overview of Claude models
  3. Accessing the API
  4. Vertex AI Setup
  5. Making a request
  6. Multi-turn conversations
  7. Chat exercise
  8. System prompts
  9. System prompts exercise
  10. Temperature
  11. Course satisfaction survey
  12. Response streaming
  13. Controlling model output
  14. Structured data
  15. Structured data exercise
  16. Quiz on accessing Claude with the API
  17. Prompt evaluation
  18. A typical eval workflow
  19. Generating test datasets
  20. Running the eval
  21. Model based grading
  22. Code based grading
  23. Exercise on prompt evals
  24. Quiz on prompt evaluation
  25. Prompt engineering
  26. Being clear and direct
  27. Being specific
  28. Structure with XML tags
  29. Providing examples
  30. Exercise on prompting
  31. Quiz on prompt engineering techniques
  32. Introducing tool use
  33. Project overview
  34. Tool functions
  35. Tool schemas
  36. Handling message blocks
  37. Sending tool results
  38. Multi-turn conversations with tools
  39. Implementing multiple turns
  40. Using multiple tools
  41. The batch tool
  42. Tools for structured data
  43. The text edit tool
  44. The web search tool
  45. Quiz on tool use with Claude
  46. Introducing Retrieval Augmented Generation
  47. Text chunking strategies
  48. Text embeddings
  49. The full RAG flow
  50. Implementing the RAG flow
  51. BM25 lexical search
  52. A Multi-index RAG pipeline
  53. Reranking results
  54. Contextual retrieval
  55. Quiz on Retrieval Augmented Generation
  56. Extended thinking
  57. Image support
  58. PDF support
  59. Citations
  60. Prompt caching
  61. Rules of prompt caching
  62. Prompt caching in action
  63. Quiz on features of Claude
  64. Introducing MCP
  65. MCP clients
  66. Project setup
  67. Defining tools with MCP
  68. The server inspector
  69. Implementing a client
  70. Defining resources
  71. Accessing resources
  72. Defining prompts
  73. Prompts in the client
  74. MCP review
  75. Quiz on Model Context Protocol
  76. Anthropic apps
  77. Claude Code setup
  78. Claude Code in action
  79. Enhancements with MCP servers
  80. Parallelizing Claude Code
  81. Automated debugging
  82. Computer use
  83. How computer use works
  84. Agents and workflows
  85. Parallelization workflows
  86. Chaining workflows
  87. Routing workflows
  88. Agents and tools
  89. Environment inspection
  90. Workflows vs agents
  91. Quiz on agents and workflows
  92. Final assessment quiz
  93. Course Wrap Up
  94. Course Description
  95. Course Description
  96. Course Description
  97. Course Description
  98. Course Description
  99. Course Description
  100. Course Description

Внедрение рабочего процесса RAG: Пошаговое руководство

В мире больших языковых моделей (LLM), таких как Claude, способность получать и использовать внешнюю информацию является ключевой для создания по-настоящему мощных и актуальных приложений. Именно здесь на сцену выходит Retrieval-Augmented Generation (RAG) – подход, который позволяет LLM выходить за рамки своих изначально обученных знаний, обращаясь к внешним источникам данных. Концептуально мы уже понимаем, как работает RAG, а теперь давайте углубимся в его практическую реализацию, пройдя все пять этапов этого процесса на конкретном примере.

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

Подготовка векторной базы данных

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

Векторная база данных обрабатывает несколько ключевых задач:

По сути, векторная база данных служит "памятью" нашей системы RAG, позволяя ей быстро находить нужную информацию среди огромного объема данных.

Пять шагов реализации RAG

Давайте подробно рассмотрим каждый этап процесса RAG, чтобы понять, как он работает на практике.

Шаг 1: Разделение текста на фрагменты (Chunking)

Первый шаг в процессе RAG — это подготовка исходного документа. Большие документы не могут быть целиком переданы в LLM из-за ограничений на размер контекстного окна (количество tokens, которые модель может обработать за один раз). Кроме того, для эффективного поиска нам нужны более мелкие, сфокусированные единицы информации.

Поэтому мы разбиваем наш исходный документ на управляемые фрагменты (chunks). Мы используем подход, основанный на разделении по секциям, что позволяет нам сохранять логическую структуру документа. Например, если у нас есть файл report.md, мы можем использовать функцию, такую как chunk_by_section(text), чтобы разделить его на логические разделы. Это гарантирует, что каждый фрагмент содержит связную часть информации, что улучшает качество последующего поиска.

Шаг 2: Генерация эмбеддингов для каждого фрагмента

После того как текст разбит на фрагменты, следующим шагом является преобразование каждого текстового фрагмента в числовое представление, называемое embedding. Эмбеддинг — это вектор чисел, который улавливает семантическое значение текста. Тексты со схожим смыслом будут иметь эмбеддинги, которые расположены близко друг к другу в многомерном векторном пространстве.

Для генерации этих эмбеддингов мы используем специализированную модель эмбеддингов. Например, функция generate_embedding(chunks) берет наши текстовые фрагменты и преобразует их в соответствующие векторы. Эти эмбеддинги позволяют нам выполнять математические сравнения между различными частями текста, что невозможно сделать напрямую с сырым текстом.

Шаг 3: Хранение эмбеддингов в векторной базе данных

Теперь, когда у нас есть эмбеддинги для каждого фрагмента, мы создаем нашу векторную базу данных (например, инициализируем store = VectorIndex()) и заполняем ее этими эмбеддингами и соответствующим им исходным текстом. Это критически важный шаг:

for embedding, chunk in zip(embeddings, chunks):
    store.add_vector(embedding, {"content": chunk})

Обратите внимание, что мы храним как сам эмбеддинг (числовой вектор), так и оригинальное текстовое содержимое ("content": chunk). Это имеет решающее значение, потому что, когда мы позже будем извлекать похожие эмбеддинги, нам нужен доступ к фактическому тексту, а не только к числовым векторам. Сам по себе эмбеддинг бесполезен для нас как разработчиков или для LLM — нам нужен человекочитаемый контент, который он представляет, чтобы использовать его для генерации ответа.

Шаг 4: Генерация эмбеддинга для пользовательского запроса

Когда пользователь задает вопрос, например: "Что делал отдел разработки программного обеспечения в прошлом году?", нам необходимо преобразовать этот запрос в эмбеддинг. Этот эмбеддинг должен быть создан в том же векторном пространстве, что и эмбеддинги наших хранимых документов. Это достигается с помощью той же модели эмбеддингов, которую мы использовали для наших документов:

user_embedding = generate_embedding("What did the software engineering dept do last year?")

Таким образом, запрос пользователя становится точкой в том же многомерном пространстве, где хранятся все наши фрагменты документов, что позволяет нам искать семантически похожие фрагменты.

Шаг 5: Поиск релевантных документов

Наконец, мы используем наш VectorIndex для поиска наиболее релевантных фрагментов, сравнивая эмбеддинг пользовательского запроса с эмбеддингами всех хранимых документов. База данных находит векторы, которые "ближе всего" к вектору запроса в высокоразмерном пространстве, используя метрики сходства, такие как cosine distance.

results = store.search(user_embedding, 2)

Эта операция возвращает, например, два наиболее похожих фрагмента вместе с их показателями косинусного расстояния. Чем ниже показатель расстояния, тем более похожим считается контент на наш запрос.

Полученные фрагменты текста затем могут быть переданы LLM (например, Claude) в качестве дополнительного контекста, чтобы модель могла сгенерировать более точный и обоснованный ответ на запрос пользователя.

Понимание результатов и важность хранения контента

Когда мы выполняем этот пример с запросом об отделе разработки программного обеспечения, мы получаем два релевантных раздела:

Как упоминалось, чем ниже показатель расстояния, тем более похожим является контент на наш запрос. Оба результата релевантны нашему вопросу о том, чего достиг отдел разработки программного обеспечения.

Вы можете задаться вопросом, почему мы храним исходный текст вместе с каждым эмбеддингом. Причина очень практична: эмбеддинги — это всего лишь массивы чисел, которые не имеют прямого значения для человека. Когда наш поиск возвращает наиболее похожие эмбеддинги, нам нужен фактический текстовый контент, чтобы понять, что было найдено, и использовать его для генерации ответов. LLM не может "читать" вектор; ей нужен текст.

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

Заключение

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

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