Elastic
Jina AI
Модели
API
keyboard_arrow_down
Читатель
Читайте URL-адреса и ищите информацию в Интернете для получения более подходящей подготовки для получения степени магистра права.
Вложения
Мультимодальные многоязычные векторные представления.
Реранкер
Инструмент переранжирования для максимизации релевантности результатов поиска.
Elastic Inference Service
Запускайте модели Jina непосредственно в Elasticsearch.
MCP terminalCLIarticlellms.txtsmart_toyАгентыdata_objectСхемаmenu_bookДокументы



Авторизоваться
login
Retrieval-Augmented Generation
Тестирование производительности моделей Embedding как конечных точек SageMaker
Настройка учетной записи AWS
Загрузка набора данных
Запуск конечной точки Jina Embeddings v2
Создание и индексация набора данных
Запуск конечной точки Jina Reranker v1
Определение функций запроса
Использование JumpStart для загрузки Mistral-Instruct
Запросы к модели
Завершение работы
Начните работу с моделями Jina AI на AWS Marketplace прямо сейчас
Технический блог
март 25, 2024

Новый уровень облачного ИИ: Jina Embeddings и Rerankers на Amazon SageMaker

Научитесь использовать модели Jina Embeddings и Reranking в полноценном AI-приложении на AWS, используя только компоненты, доступные в Amazon SageMaker и AWS Marketplace.
Abstract image with colorful wavy background featuring AWS, Embeddings, and Reranker logos.
Scott Martens, Saahil Ognawala • 21 минуты чтения

Jina Embeddings и Jina Reranker теперь доступны для использования с Amazon SageMaker через AWS Marketplace. Для корпоративных пользователей, которые высоко ценят безопасность, надежность и согласованность в своих облачных операциях, это размещает передовые AI-решения Jina AI в их частных развертываниях AWS, где они могут пользоваться всеми преимуществами проверенной, стабильной инфраструктуры AWS.

Благодаря полному набору моделей для embeddings и reranking в AWS Marketplace, пользователи SageMaker могут воспользоваться революционными окнами входного контекста размером 8k и ведущими многоязычными embeddings по конкурентным ценам. Вам не нужно платить за передачу моделей в AWS или из него, цены прозрачны, а выставление счетов интегрировано с вашей учетной записью AWS.

Модели, доступные в настоящее время на Amazon SageMaker, включают:

  • Jina Embeddings v2 Base - English
  • Jina Embeddings v2 Small - English
  • Двуязычные модели Jina Embeddings v2:
    • Немецкий/Английский
    • Китайский/Английский
    • Испанский/Английский
  • Jina Embeddings v2 Base - Code
  • Jina Reranker v1 Base - English
  • Jina ColBERT v1 - English
  • Jina ColBERT Reranker v1 - English

Полный список моделей смотрите на странице поставщика Jina AI в AWS Marketplace и воспользуйтесь семидневным бесплатным пробным периодом.

AWS Marketplace: Jina AI

В этой статье мы рассмотрим создание приложения Retrieval-augmented generation (RAG) исключительно с использованием компонентов Amazon SageMaker. Мы будем использовать модели Jina Embeddings v2 - English, Jina Reranker v1 и языковую модель Mistral-7B-Instruct.

Вы также можете следовать инструкциям в Python Notebook, который можно скачать или запустить в Google Colab.

tagRetrieval-Augmented Generation

Retrieval-augmented generation — это альтернативная парадигма в генеративном AI. Вместо того чтобы использовать большие языковые модели (LLM) для прямого ответа на запросы пользователей на основе того, что было изучено при обучении, она использует их способность к плавному производству языка, перенося логику и поиск информации во внешний аппарат, более подходящий для этого.

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

Схематично система RAG имеет как минимум четыре компонента:

  • Источник данных, обычно векторная база данных, подходящая для поиска информации с помощью AI.
  • Система поиска информации, которая обрабатывает запрос пользователя как поисковый запрос и извлекает данные, релевантные для ответа на него.
  • Система, часто включающая AI-based reranker, которая выбирает часть извлеченных данных и обрабатывает их в промпт для LLM.
  • LLM, например, одна из моделей GPT или модель с открытым исходным кодом, как Mistral, которая принимает запрос пользователя и предоставленные ей данные и генерирует ответ для пользователя.

Модели embeddings хорошо подходят для поиска информации и часто используются для этой цели. Модель текстовых embeddings принимает тексты в качестве входных данных и выводит embedding — высокоразмерный вектор, пространственное отношение которого к другим embeddings указывает на их семантическое сходство, т.е. схожие темы, содержание и связанные значения. Они часто используются при поиске информации, поскольку чем ближе embeddings, тем вероятнее пользователь будет доволен ответом. Их также относительно легко дообучить для улучшения производительности в конкретных областях.

Модели text reranker используют аналогичные принципы AI для сравнения коллекций текстов с запросом и сортировки их по семантическому сходству. Использование специализированной модели reranker вместо опоры только на модель embeddings часто значительно повышает точность результатов поиска. Reranker в приложении RAG выбирает некоторые результаты поиска информации, чтобы максимизировать вероятность того, что правильная информация содержится в промпте для LLM.

Maximizing Search Relevance and RAG Accuracy with Jina Reranker
Boost your search and RAG accuracy with Jina Reranker. Our new model improves the accuracy and relevance by 20% over simple vector search. Try it now for free!

tagТестирование производительности моделей Embedding как конечных точек SageMaker

Мы протестировали производительность и надежность модели Jina Embeddings v2 Base - English в качестве конечной точки SageMaker, работающей на инстансе g4dn.xlarge. В этих экспериментах мы непрерывно добавляли по одному новому пользователю каждую секунду, каждый из которых отправлял запрос, ждал ответа и повторял после его получения.

  • Для запросов менее 100 токенов, при количестве до 150 одновременных пользователей, время ответа на запрос оставалось ниже 100 мс. Затем время ответа линейно увеличивалось от 100 мс до 1500 мс с появлением большего числа одновременных пользователей.
    • При примерно 300 одновременных пользователях мы получили более 5 сбоев от API и завершили тест.
  • Для запросов от 1K до 8K токенов, при количестве до 20 одновременных пользователей, время ответа на запрос оставалось ниже 8 секунд. Затем время ответа линейно увеличивалось от 8 до 60 секунд с появлением большего числа одновременных пользователей.
    • При примерно 140 одновременных пользователях мы получили более 5 сбоев от API и завершили тест.
Four comparative graphs displaying "Small Context" versus "Large Context" results over time, assessing performance metrics.
Результаты тестовых запусков (слева: малый контекст, справа: большой контекст), показывающие влияние увеличения количества пользователей со временем на время отклика и частоту отказов.

На основании этих результатов можно сделать вывод, что для большинства пользователей с обычными задачами по встраиванию инстансы g4dn.xlarge или g5.xlarge должны удовлетворять их ежедневные потребности. Однако для крупных задач по индексированию, которые обычно выполняются гораздо реже, чем задачи поиска, пользователи могут предпочесть более производительный вариант. Полный список доступных инстансов Sagemaker можно найти в обзоре AWS EC2.

tagНастройка учетной записи AWS

Сначала вам понадобится учетная запись AWS. Если у вас еще нет учетной записи AWS, вы можете зарегистрироваться на сайте AWS.

AWS Console - Signup
Signup
⚠️
Вы не сможете выполнить этот учебник с учетной записью Free Tier, поскольку Amazon не предоставляет бесплатный доступ к SageMaker. Вы должны добавить способ оплаты в учетную запись, чтобы подписаться на модели Jina AI, даже если вы используете нашу семидневную бесплатную пробную версию.

tagНастройка инструментов AWS в вашей среде Python

Установите в вашей среде Python инструменты и библиотеки AWS, необходимые для этого учебника:

pip install awscli jina-sagemaker

Вам понадобится получить ключ доступа и секретный ключ доступа для вашей учетной записи AWS. Для этого следуйте инструкциям на сайте AWS.

Managing access keys for IAM users - AWS Identity and Access Management
Create, modify, view, or update access keys (credentials) for programmatic calls to AWS.
AWS Identity and Access Management

Также вам нужно будет выбрать регион AWS для работы.

Regions, Availability Zones, and Local Zones - Amazon Relational Database Service
Learn how Amazon cloud computing resources are hosted in multiple locations world-wide, including AWS Regions and Availability Zones.
Amazon Relational Database Service

Затем установите значения в переменных окружения. В Python или в блокноте Python вы можете сделать это с помощью следующего кода:

import os

os.environ["AWS_ACCESS_KEY_ID"] = <YOUR_ACCESS_KEY_ID>
os.environ["AWS_SECRET_ACCESS_KEY"] = <YOUR_SECRET_ACCESS_KEY>
os.environ["AWS_DEFAULT_REGION"] = <YOUR_AWS_REGION>
os.environ["AWS_DEFAULT_OUTPUT"] = "json"

Установите формат вывода по умолчанию как json.

Вы также можете сделать это через командное приложение AWS или путем настройки конфигурационного файла AWS в вашей локальной файловой системе. Дополнительные сведения см. в документации на сайте AWS.

tagСоздание роли

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

Эта роль должна:

  1. Иметь включенный доступ AmazonSageMakerFullAccess.
  2. Либо:
    1. Иметь полномочия на подписку AWS Marketplace и иметь включенные все три разрешения:
      1. aws-marketplace:ViewSubscriptions
      2. aws-marketplace:Unsubscribe
      3. aws-marketplace:Subscribe
    2. Либо ваша учетная запись AWS должна иметь подписку на jina-embedding-model.

Сохраните ARN (Amazon Resource Name) роли в переменной с именем role:

role = <YOUR_ROLE_ARN>

Дополнительную информацию см. в документации по ролям на сайте AWS.

IAM roles - AWS Identity and Access Management
Learn how and when to use IAM roles.
AWS Identity and Access Management

tagПодписка на модели Jina AI на AWS Marketplace

В этой статье мы будем использовать модель Jina Embeddings v2 base English. Подпишитесь на неё на AWS Marketplace.

AWS Marketplace: Jina Embeddings v2 Base - en
en

Информацию о ценах вы увидите, прокрутив страницу вниз. AWS взимает почасовую плату за модели из marketplace, поэтому вам будет выставлен счет за время с момента запуска конечной точки модели до её остановки. В этой статье мы покажем вам, как сделать и то, и другое.

Мы также будем использовать модель Jina Reranker v1 - English, на которую вам нужно будет подписаться.

AWS Marketplace: Jina Reranker v1 Base - en
en
Jina AI в настоящее время предлагает семидневную бесплатную пробную версию своих моделей. Вам все равно нужно будет платить за экземпляры AWS, на которых они работают, но в течение пробного периода вам не нужно дополнительно платить за модели.

После подписки получите ARN моделей для вашего региона AWS и сохраните их в переменных embedding_package_arn и reranker_package_arn соответственно. Код в этом руководстве будет ссылаться на них, используя эти имена переменных.

Если вы не знаете, как получить ARN, поместите название вашего региона Amazon в переменную region и используйте следующий код:

region = os.environ["AWS_DEFAULT_REGION"]

def get_arn_for_model(region_name, model_name):
    model_package_map = {
        "us-east-1": f"arn:aws:sagemaker:us-east-1:253352124568:model-package/{model_name}",
        "us-east-2": f"arn:aws:sagemaker:us-east-2:057799348421:model-package/{model_name}",
        "us-west-1": f"arn:aws:sagemaker:us-west-1:382657785993:model-package/{model_name}",
        "us-west-2": f"arn:aws:sagemaker:us-west-2:594846645681:model-package/{model_name}",
        "ca-central-1": f"arn:aws:sagemaker:ca-central-1:470592106596:model-package/{model_name}",
        "eu-central-1": f"arn:aws:sagemaker:eu-central-1:446921602837:model-package/{model_name}",
        "eu-west-1": f"arn:aws:sagemaker:eu-west-1:985815980388:model-package/{model_name}",
        "eu-west-2": f"arn:aws:sagemaker:eu-west-2:856760150666:model-package/{model_name}",
        "eu-west-3": f"arn:aws:sagemaker:eu-west-3:843114510376:model-package/{model_name}",
        "eu-north-1": f"arn:aws:sagemaker:eu-north-1:136758871317:model-package/{model_name}",
        "ap-southeast-1": f"arn:aws:sagemaker:ap-southeast-1:192199979996:model-package/{model_name}",
        "ap-southeast-2": f"arn:aws:sagemaker:ap-southeast-2:666831318237:model-package/{model_name}",
        "ap-northeast-2": f"arn:aws:sagemaker:ap-northeast-2:745090734665:model-package/{model_name}",
        "ap-northeast-1": f"arn:aws:sagemaker:ap-northeast-1:977537786026:model-package/{model_name}",
        "ap-south-1": f"arn:aws:sagemaker:ap-south-1:077584701553:model-package/{model_name}",
        "sa-east-1": f"arn:aws:sagemaker:sa-east-1:270155090741:model-package/{model_name}",
    }

    return model_package_map[region_name]

embedding_package_arn = get_arn_for_model(region, "jina-embeddings-v2-base-en")
reranker_package_arn = get_arn_for_model(region, "jina-reranker-v1-base-en")

tagЗагрузка набора данных

В этом руководстве мы будем использовать коллекцию видео с YouTube-канала TU Delft Online Learning. Этот канал производит различные образовательные материалы по предметам STEM. Его программирование лицензировано по CC-BY.

TU Delft Online Learning
Хотите сделать карьеру в науке, дизайне или инженерии? Тогда присоединяйтесь к сообществу онлайн-учащихся в TU Delft! В TU Delft онлайн-обучение означает активное обучение. Наши курсы разработаны, чтобы обеспечить вам увлекательный учебный опыт. Содержание курсов сложное и требовательное, способствующее вашему личностному росту и профессиональному развитию, при этом вы можете наслаждаться гибкостью и доступностью, которые предлагают наши онлайн-курсы, чтобы совмещать обучение с другими приоритетами вашей жизни. Начните учиться сегодня: https://online-learning.tud…
YouTube

Мы загрузили 193 видео с канала и обработали их с помощью модели распознавания речи Whisper с открытым исходным кодом от OpenAI. Мы использовали самую маленькую модель openai/whisper-tiny для преобразования видео в транскрипты.

Транскрипты были организованы в CSV-файл, который вы можете скачать отсюда.

Каждая строка файла содержит:

  • Название видео
  • URL видео на YouTube
  • Текстовую расшифровку видео

Чтобы загрузить эти данные в Python, сначала установите pandas и requests:

pip install requests pandas

Загрузите данные CSV непосредственно в DataFrame Pandas с именем tu_delft_dataframe:

import pandas

# Load the CSV file
tu_delft_dataframe = pandas.read_csv("https://raw.githubusercontent.com/jina-ai/workshops/feat-sagemaker-post/notebooks/embeddings/sagemaker/tu_delft.csv")

Вы можете проверить содержимое, используя метод DataFrame head(). В ноутбуке это должно выглядеть примерно так:

Фрейм данных, показывающий названия вебинаров, такие как "Green Teams in Hospitals," с их URL-адресами YouTube и вводными текстовыми отрывками,

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

tagЗапуск конечной точки Jina Embeddings v2

Приведенный ниже код запустит экземпляр ml.g4dn.xlarge на AWS для запуска модели встраивания. Это может занять несколько минут.

import boto3
from jina_sagemaker import Client

# Choose a name for your embedding endpoint. It can be anything convenient.
embeddings_endpoint_name = "jina_embedding"

embedding_client = Client(region_name=boto3.Session().region_name)
embedding_client.create_endpoint(
    arn=embedding_package_arn,
    role=role,
    endpoint_name=embeddings_endpoint_name,
    instance_type="ml.g4dn.xlarge",
    n_instances=1,
)

embedding_client.connect_to_endpoint(endpoint_name=embeddings_endpoint_name)

Измените instance_type, чтобы выбрать другой тип облачного экземпляра AWS, если это необходимо.

⚠️
AWS начнет выставлять вам счет за время, как только эта команда вернется. Вам будет выставляться счет почасово, пока вы не остановите этот экземпляр. Чтобы сделать это, следуйте инструкциям в разделе Завершение работы.

tagСоздание и индексация набора данных

Теперь, когда мы загрузили данные и запустили модель Jina Embeddings v2, мы можем подготовить и проиндексировать данные. Мы будем хранить данные в векторном хранилище FAISS, векторной базе данных с открытым исходным кодом, специально разработанной для приложений ИИ.

Сначала установите оставшиеся предварительные требования для нашего RAG-приложения:

pip install tdqm numpy faiss-cpu

tagРазбиение на чанки

Нам нужно будет взять отдельные транскрипты и разбить их на более мелкие части, т.е. "чанки", чтобы мы могли поместить несколько текстов в промпт для LLM. Приведенный ниже код разбивает отдельные транскрипты на границах предложений, гарантируя, что все чанки по умолчанию содержат не более 128 слов.

def chunk_text(text, max_words=128):
    """
    Divide text into chunks where each chunk contains the maximum number 
    of full sentences with fewer words than `max_words`.
    """
    sentences = text.split(".")
    chunk = []
    word_count = 0

    for sentence in sentences:
        sentence = sentence.strip(".")
        if not sentence:
          continue

        words_in_sentence = len(sentence.split())
        if word_count + words_in_sentence <= max_words:
            chunk.append(sentence)
            word_count += words_in_sentence
        else:
            # Yield the current chunk and start a new one
            if chunk:
              yield ". ".join(chunk).strip() + "."
            chunk = [sentence]
            word_count = words_in_sentence

    # Yield the last chunk if it's not empty
    if chunk:
        yield " ".join(chunk).strip() + "."

tagПолучение Embeddings для каждого чанка

Нам нужен embedding для каждого чанка, чтобы сохранить его в базе данных FAISS. Чтобы получить их, мы передаем текстовые чанки в конечную точку модели embeddings Jina AI, используя метод embedding_client.embed(). Затем мы добавляем текстовые чанки и векторы embeddings в pandas dataframe tu_delft_dataframe как новые столбцы chunks и embeddings:

import numpy as np
from tqdm import tqdm

tqdm.pandas()

def generate_embeddings(text_df):
    chunks = list(chunk_text(text_df["Text"]))
    embeddings = []

    for i, chunk in enumerate(chunks):
      response = embedding_client.embed(texts=[chunk])
      chunk_embedding = response[0]["embedding"]
      embeddings.append(np.array(chunk_embedding))

    text_df["chunks"] = chunks
    text_df["embeddings"] = embeddings
    return text_df

print("Embedding text chunks ...")
tu_delft_dataframe = generate_embeddings(tu_delft_dataframe)
## если вы используете Google Colab или Python notebook,
## удалите строку выше и раскомментируйте следующую строку:
# tu_delft_dataframe = tu_delft_dataframe.progress_apply(generate_embeddings, axis=1)

tagНастройка семантического поиска с помощью Faiss

Код ниже создает базу данных FAISS и вставляет чанки и векторы embeddings путем итерации по tu_delft_pandas:

import faiss

dim = 768  # размерность embeddings Jina v2
index_with_ids = faiss.IndexIDMap(faiss.IndexFlatIP(dim))
k = 0

doc_ref = dict()

for idx, row in tu_delft_dataframe.iterrows():
    embeddings = row["embeddings"]
    for i, embedding in enumerate(embeddings):
        normalized_embedding = np.ascontiguousarray(np.array(embedding, dtype="float32").reshape(1, -1))
        faiss.normalize_L2(normalized_embedding)
        index_with_ids.add_with_ids(normalized_embedding, k)
        doc_ref[k] = (row["chunks"][i], idx)
        k += 1

tagЗапуск конечной точки Jina Reranker v1

Как и в случае с моделью Jina Embedding v2 выше, этот код запустит экземпляр ml.g4dn.xlarge на AWS для работы модели ранжирования. Аналогично, выполнение может занять несколько минут.

import boto3
from jina_sagemaker import Client

# Выберите имя для вашей конечной точки ранжирования. Это может быть любое удобное имя.
reranker_endpoint_name = "jina_reranker"

reranker_client = Client(region_name=boto3.Session().region_name)
reranker_client.create_endpoint(
    arn=reranker_package_arn,
    role=role,
    endpoint_name=reranker_endpoint_name,
    instance_type="ml.g4dn.xlarge",
    n_instances=1,
)

reranker_client.connect_to_endpoint(endpoint_name=reranker_endpoint_name)

tagОпределение функций запроса

Далее мы определим функцию, которая находит наиболее похожие чанки транскрипции для любого текстового запроса.

Это двухэтапный процесс:

  1. Преобразование пользовательского ввода в вектор embedding используя метод embedding_client.embed(), как мы делали на этапе подготовки данных.
  2. Передача embedding в индекс FAISS для получения лучших совпадений. В функции ниже по умолчанию возвращаются 20 лучших совпадений, но вы можете управлять этим с помощью параметра n.

Функция find_most_similar_transcript_segment вернет лучшие совпадения путем сравнения косинусов сохраненных embeddings с embedding запроса.

def find_most_similar_transcript_segment(query, n=20):
    query_embedding = embedding_client.embed(texts=[query])[0]["embedding"]  # Предполагается, что запрос достаточно короткий и не требует разбиения на чанки
    query_embedding = np.ascontiguousarray(np.array(query_embedding, dtype="float32").reshape(1, -1))
    faiss.normalize_L2(query_embedding)

    D, I = index_with_ids.search(query_embedding, n)  # Получаем top n совпадений

    results = []
    for i in range(n):
        distance = D[0][i]
        index_id = I[0][i]
        transcript_segment, doc_idx = doc_ref[index_id]
        results.append((transcript_segment, doc_idx, distance))

    # Сортируем результаты по расстоянию
    results.sort(key=lambda x: x[2])

    return [(tu_delft_dataframe.iloc[r[1]]["Title"].strip(), r[0]) for r in results]

Мы также определим функцию, которая обращается к конечной точке ранжирования reranker_client, передает ей результаты из find_most_similar_transcript_segment и возвращает только три наиболее релевантных результата. Она вызывает конечную точку ранжирования с помощью метода reranker_client.rerank().

def rerank_results(query_found, query, n=3):
    ret = reranker_client.rerank(
        documents=[f[1] for f in query_found], 
        query=query, 
        top_n=n,
    )
    return [query_found[r['index']] for r in ret[0]['results']]

tagИспользование JumpStart для загрузки Mistral-Instruct

Для этого руководства мы будем использовать модель mistral-7b-instruct, которая доступна через Amazon SageMaker JumpStart, как часть LLM системы RAG.

Базовые модели Mistral 7B от Mistral AI теперь доступны в Amazon SageMaker JumpStart | Amazon Web Services
Сегодня мы рады объявить, что базовые модели Mistral 7B, разработанные Mistral AI, доступны клиентам через Amazon SageMaker JumpStart для развертывания в один клик для выполнения вывода. С 7 миллиардами параметров Mistral 7B легко настраивается и быстро развертывается. Вы можете опробовать эту модель с SageMaker JumpStart, […]
Amazon Web Services

Запустите следующий код для загрузки и развертывания Mistral-Instruct:

from sagemaker.jumpstart.model import JumpStartModel

jumpstart_model = JumpStartModel(model_id="huggingface-llm-mistral-7b-instruct", role=role)
model_predictor = jumpstart_model.deploy()

Конечная точка для доступа к этой LLM сохраняется в переменной model_predictor.

⚠️
Использование этой модели также является платной услугой AWS, поэтому не забудьте отключить ее, когда закончите с этим руководством. См. раздел Завершение работы, чтобы остановить это развертывание по окончании.

tagMistral-Instruct с JumpStart

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

Вы можете экспериментировать с этим шаблоном самостоятельно, чтобы модифицировать это приложение или попробовать получить лучшие результаты.

from string import Template

prompt_template = Template("""
  <s>[INST] Ответьте на вопрос ниже, используя только предоставленный контекст.
  Вопрос пользователя основан на транскриптах видео с YouTube-канала.
  Контекст представлен в виде ранжированного списка информации в формате
    (название-видео, сегмент-транскрипта), который релевантен для ответа на
    вопрос пользователя.
  В ответе следует использовать только представленный контекст. Если на вопрос
    нельзя ответить на основе контекста, скажите об этом.

  Контекст:
  1. Название видео: $title_1, сегмент транскрипта: $segment_1
  2. Название видео: $title_2, сегмент транскрипта: $segment_2
  3. Название видео: $title_3, сегмент транскрипта: $segment_3

  Вопрос: $question

  Ответ: [/INST]
""")

С этим компонентом у нас теперь есть все части полного RAG-приложения.

tagЗапросы к модели

Запрос к модели - это трехэтапный процесс.

  1. Поиск релевантных чанков для заданного запроса.
  2. Сборка промпта.
  3. Отправка промпта модели Mistral-Instruct и получение ответа.

Для поиска релевантных чанков мы используем функцию find_most_similar_transcript_segment, которую мы определили выше.

question = "Когда была введена в эксплуатацию первая морская ветряная электростанция?"
search_results = find_most_similar_transcript_segment(question)
reranked_results = rerank_results(search_results, question)

Вы можете просмотреть результаты поиска в переранжированном порядке:

for title, text, _ in reranked_results:
    print(title + "\n" + text + "\n")

Результат:

Offshore Wind Farm Technology - Course Introduction
Since the first offshore wind farm commissioned in 1991 in Denmark, scientists and engineers have adapted and improved the technology of wind energy to offshore conditions.  This is a rapidly evolving field with installation of increasingly larger wind turbines in deeper waters.  At sea, the challenges are indeed numerous, with combined wind and wave loads, reduced accessibility and uncertain-solid conditions.  My name is Axel Vire, I'm an assistant professor in Wind Energy at U-Delf and specializing in offshore wind energy.  This course will touch upon the critical aspect of wind energy, how to integrate the various engineering disciplines involved in offshore wind energy.  Each week we will focus on a particular discipline and use it to design and operate a wind farm.

Offshore Wind Farm Technology - Course Introduction
I'm a researcher and lecturer at the Wind Energy and Economics Department and I will be your moderator throughout this course.  That means I will answer any questions you may have.  I'll strengthen the interactions between the participants and also I'll get you in touch with the lecturers when needed.  The course is mainly developed for professionals in the field of offshore wind energy.  We want to broaden their knowledge of the relevant technical disciplines and their integration.  Professionals with a scientific background who are new to the field of offshore wind energy will benefit from a high-level insight into the engineering aspects of wind energy.  Overall, the course will help you make the right choices during the development and operation of offshore wind farms.

Offshore Wind Farm Technology - Course Introduction
Designed wind turbines that better withstand wind, wave and current loads  Identify great integration strategies for offshore wind turbines and gain understanding of the operational and maintenance of offshore wind turbines and farms  We also hope that you will benefit from the course and from interaction with other learners who share your interest in wind energy  And therefore we look forward to meeting you online.

Мы можем использовать эту информацию непосредственно в шаблоне запроса:

prompt_for_llm = prompt_template.substitute(
    question = question,
    title_1 = search_results[0][0],
    segment_1 = search_results[0][1],
    title_2 = search_results[1][0],
    segment_2 = search_results[1][1],
    title_3 = search_results[2][0],
    segment_3 = search_results[2][1],
)

Выведем получившуюся строку, чтобы увидеть, какой запрос фактически отправляется в LLM:

print(prompt_for_llm)
<s>[INST] Answer the question below only using the given context.
  The question from the user is based on transcripts of videos from a YouTube
    channel.
  The context is presented as a ranked list of information in the form of
    (video-title, transcript-segment), that is relevant for answering the
    user's question.
  The answer should only use the presented context. If the question cannot be
    answered based on the context, say so.

  Context:
  1. Video-title: Offshore Wind Farm Technology - Course Introduction, transcript-segment: Since the first offshore wind farm commissioned in 1991 in Denmark, scientists and engineers have adapted and improved the technology of wind energy to offshore conditions.  This is a rapidly evolving field with installation of increasingly larger wind turbines in deeper waters.  At sea, the challenges are indeed numerous, with combined wind and wave loads, reduced accessibility and uncertain-solid conditions.  My name is Axel Vire, I'm an assistant professor in Wind Energy at U-Delf and specializing in offshore wind energy.  This course will touch upon the critical aspect of wind energy, how to integrate the various engineering disciplines involved in offshore wind energy.  Each week we will focus on a particular discipline and use it to design and operate a wind farm.
  2. Video-title: Offshore Wind Farm Technology - Course Introduction, transcript-segment: For example, we look at how to characterize the wind and wave conditions at a given location.  How to best place the wind turbines in a farm and also how to retrieve the electricity back to shore.  We look at the main design drivers for offshore wind turbines and their components.  We'll see how these aspects influence one another and the best choices to reduce the cost of energy.  This course is organized by the two-delfd wind energy institute, an interfaculty research organization focusing specifically on wind energy.  You will therefore benefit from the expertise of the lecturers in three different faculties of the university.  Aerospace engineering, civil engineering and electrical engineering.  Hi, my name is Ricardo Pareda.
  3. Video-title: Systems Analysis for Problem Structuring part 1B the mono actor perspective example, transcript-segment: So let's assume the demarcation of the problem and the analysis of objectives has led to the identification of three criteria.  The security of supply, the percentage of offshore power generation and the costs of energy provision.  We now reason backwards to explore what factors have an influence on these system outcomes.  Really, the offshore percentage is positively influenced by the installed Wind Power capacity at sea, a key system factor.  Capacity at sea in turn is determined by both the size and the number of wind farms at sea.  The Ministry of Economic Affairs cannot itself invest in new wind farms but hopes to simulate investors and energy companies by providing subsidies and by expediting the granting process of licenses as needed.

  Question: When was the first offshore wind farm commissioned?

  Answer: [/INST]

Передаем этот запрос в конечную точку LLM — model_predictor — через метод model_predictor.predict():

answer = model_predictor.predict({"inputs": prompt_for_llm})

Это возвращает список, но поскольку мы передали только один запрос, это будет список с одним элементом. Каждый элемент представляет собой dict с текстом ответа под ключом generated_text:

answer = answer[0]['generated_text']
print(answer)

Результат:

The first offshore wind farm was commissioned in 1991. (Context: Video-title: Offshore Wind Farm Technology - Course Introduction, transcript-segment: Since the first offshore wind farm commissioned in 1991 in Denmark, ...)

Давайте упростим запросы, написав функцию, которая выполняет все шаги: принимает строковый вопрос в качестве параметра и возвращает ответ в виде строки:

def ask_rag(question):
    search_results = find_most_similar_transcript_segment(question)
    reranked_results = rerank_results(search_results, question)
    prompt_for_llm = prompt_template.substitute(
        question = question,
        title_1 = search_results[0][0],
        segment_1 = search_results[0][1],
        title_2 = search_results[1][0],
        segment_2 = search_results[1][1],
        title_3 = search_results[2][0],
        segment_3 = search_results[2][1],
    )
    answer = model_predictor.predict({"inputs": prompt_for_llm})
    return answer[0]["generated_text"]

Теперь мы можем задать ещё несколько вопросов. Ответы будут зависеть от содержания видео-транскриптов. Например, мы можем задавать детальные вопросы, когда ответ присутствует в данных, и получать ответ:

ask_rag("What is a Kaplan Meyer estimator?")
The Kaplan Meyer estimator is a non-parametric estimator for the survival 
function, defined for both censored and not censored data. It is represented 
as a series of declining horizontal steps that approaches the truths of the 
survival function if the sample size is sufficiently large enough. The value 
of the empirical survival function obtained is assumed to be constant between 
two successive distinct observations.
ask_rag("Who is Reneville Solingen?")
Reneville Solingen is a professor at Delft University of Technology in Global 
Software Engineering. She is also a co-author of the book "The Power of Scrum."
answer = ask_rag("What is the European Green Deal?")
print(answer)
The European Green Deal is a policy initiative by the European Union to combat 
climate change and decarbonize the economy, with a goal to make Europe carbon 
neutral by 2050. It involves the use of green procurement strategies in various 
sectors, including healthcare, to reduce carbon emissions and promote corporate 
social responsibility.

Мы также можем задавать вопросы, выходящие за рамки доступной информации:

ask_rag("What countries export the most coffee?")
Based on the context provided, there is no clear answer to the user's 
question about which countries export the most coffee as the context 
only discusses the Delft University's cafeteria discounts and sustainable 
coffee options, as well as lithium production and alternatives for use in 
electric car batteries.
ask_rag("How much wood could a woodchuck chuck if a woodchuck could chuck wood?")
The context does not provide sufficient information to answer the question. 
The context is about thermit welding of rails, stress concentration factors, 
and a lyrics video. There is no mention of woodchucks or the ability of 
woodchuck to chuck wood in the context.

Попробуйте свои собственные запросы. Вы также можете изменить способ запроса к LLM, чтобы увидеть, улучшит ли это ваши результаты.

tagЗавершение работы

Поскольку вам выставляется счет почасово за используемые модели и инфраструктуру AWS для их запуска, очень важно остановить все три модели AI, когда вы закончите этот учебник:

  • Конечную точку модели встраивания embedding_client
  • Конечную точку модели переранжирования reranker_client
  • Конечную точку большой языковой модели model_predictor

Чтобы отключить все три конечные точки модели, выполните следующий код:

# shut down the embedding endpoint
embedding_client.delete_endpoint()
embedding_client.close()
# shut down the reranker endpoint
reranker_client.delete_endpoint()
reranker_client.close()
# shut down the LLM endpoint
model_predictor.delete_model()
model_predictor.delete_endpoint()

tagНачните работу с моделями Jina AI на AWS Marketplace прямо сейчас

Благодаря нашим моделям встраивания и переранжирования на SageMaker, корпоративные пользователи AI на AWS теперь имеют мгновенный доступ к выдающемуся ценностному предложению Jina AI без ущерба для преимуществ их существующих облачных операций. Все преимущества безопасности, надежности, согласованности и предсказуемого ценообразования AWS встроены изначально.

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

Посетите страницу Jina AI на AWS Marketplace, чтобы увидеть список всех моделей встраивания и переранжирования, которые мы предлагаем, и попробовать наши модели бесплатно в течение семи дней.

AWS Marketplace: Jina AI
Мы будем рады узнать о ваших вариантах использования и обсудить, как продукты Jina AI могут соответствовать потребностям вашего бизнеса. Свяжитесь с нами через
наш веб-сайт или наш канал Discord, чтобы поделиться своим мнением и быть в курсе наших последних моделей.
Категории:
Технический блог
rss_feed

Читать далее
март 11, 2026 • 7 минуты чтения
Бутстрэппинг аудиоэмбеддингов на базе мультимодальных LLM
Han Xiao
Abstract illustration of a sound wave or heartbeat, formed by blue, orange, and gray dots on a white background.
март 06, 2026 • 6 минуты чтения
Идентификация векторных моделей по сырым числовым значениям
Han Xiao
Fingerprint illustration made from numbers, showcasing digital and high-tech design on a light background.
сентябрь 09, 2025 • 11 минуты чтения
Мультимодальные 向量模型 в Llama.cpp и GGUF
Andrei Ungureanu
Alex C-G
Cartoon llama in the center of a white background, emitting laser-like beams from its eyes. The illustration creates a playfu
Текущий язык / тема
Search Foundation
Читатель
Вложения
Реранкер
Получить API-ключ Jina
Ограничение скорости
О нас
Новости
Загрузить логотип Jina
open_in_new
Скачать логотип Elastic
open_in_new
Статус API
Elastic © 2026.БезопасностьУсловия использованияКонфиденциальностьУправление файлами cookieНе продавайте и не передавайте мою личную информацию третьим лицам.
Данный веб-сайт и весь связанный с ним контент, программное обеспечение, продукты и услуги предназначены исключительно для профессионального использования. Использование в потребительских целях не предполагается и не рекомендуется.