Osmi
Использование OSMI-AI

Загрузка файлов

Загрузка изображений, аудио и других файлов

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

Изображения

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

Поддерживаемые модели: 

  • ChatOpenAI
  • AzureChatOpenAI
  • ChatAnthropic
  • AWSChatBedrock
  • ChatGoogleGenerativeAI
  • ChatOllama
  • Google Vertex AI

⚠️ Обработка изображений работает только с определенными цепочками/агентами в агенте. LLMChain, Conversation Chain, ReAct Agent, Conversational Agent, Tool Agent

Если вы включите опцию "Разрешить загрузку изображений", вы сможете загружать изображения через интерфейс чата.

Загрузка изображений через API

import requests
API_URL = "http://localhost:3000/api/v1/prediction/<agentsid>"

def query(payload):
    response = requests.post(API_URL, json=payload)
    return response.json()
    
output = query({
    "question": "Can you describe the image?",
    "uploads": [
        {
            "data": "data:image/png;base64,iVBORw0KGgdM2uN0", # base64 string or url
            "type": "file", # file | url
            "name": "osmi_ai.png",
            "mime": "image/png"
        }
    ]
})
async function query(data) {
    const response = await fetch(
        "http://localhost:3000/api/v1/prediction/<agentsid>",
        {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify(data)
        }
    );
    const result = await response.json();
    return result;
}

query({
    "question": "Can you describe the image?",
    "uploads": [
        {
            "data": "data:image/png;base64,iVBORw0KGgdM2uN0", //base64 string or url
            "type": "file", // file | url
            "name": "osmi_ai.png",
            "mime": "image/png"
        }
    ]
}).then((response) => {
    console.log(response);
});

Преобразования речи в текст

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

  • OpenAI
  • AssemblyAI
  • LocalAI

Когда эта функция активирована, пользователи могут говорить прямо в микрофон. Их речь будет расшифрована в текст.

Загрузка аудио через API

import requests
API_URL = "http://localhost:3000/api/v1/prediction/<agentsid>"

def query(payload):
    response = requests.post(API_URL, json=payload)
    return response.json()
    
output = query({
    "uploads": [
        {
            "data": "data:audio/webm;codecs=opus;base64,GkXf", # base64 string
            "type": "audio",
            "name": "audio.wav",
            "mime": "audio/webm"
        }
    ]
})
async function query(data) {
    const response = await fetch(
        "http://localhost:3000/api/v1/prediction/<agentsid>",
        {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify(data)
        }
    );
    const result = await response.json();
    return result;
}

query({
    "uploads": [
        {
            "data": "data:audio/webm;codecs=opus;base64,GkXf", // base64 string
            "type": "audio",
            "name": "audio.wav",
            "mime": "audio/webm"
        }
    ]
}).then((response) => {
    console.log(response);
});

Файлы

Загружать файлы можно двумя способами:

  • RAG-загрузка
  • Полная загрузка

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

Загрузки файлов RAG

Вы можете быстро обновлять или добавлять файлы в БД вектора по мере необходимости. Чтобы включить загрузку файлов, убедитесь, что выполнены следующие условия:

В агенте должен быть добавлен БД вектор, поддерживающее загрузку файлов. Поддерживаемые системы:

  • Pinecone
  • Milvus
  • Postgres
  • Qdrant
  • Upstash

Если в агенте используется несколько БД векторов, загрузка файла возможна только для одного из них одновременно. Необходимо подключить хотя бы один узел загрузчика документов к входу документов этого БД вектора. Поддерживаемые загрузчики документов:

  • CSV файл
  • DOCX файл
  • JSON файл
  • Файл JSON Lines
  • PDF файл
  • Текстовый файл
  • Неструктурированный файл

Вы можете загрузить один или несколько файлов в чат:

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

  1. Метаданные для загруженных файлов обновляются с помощью chatId.
  2. Это связывает файл с идентификатором чата.
  3. При выполнении запроса применяется фильтр OR:
  • Метаданные содержат osmi_ai_chatId, и значение равно текущему идентификатору сессии чата.
  • Метаданные не содержат osmi_ai_chatId.

Пример вставки в векторное хранилище на Pinecone (обновление или добавление векторных данных):

Чтобы сделать это через API, выполните два шага:

Шаг 1. Используйте API Vector Upsert с formData и chatId.

import requests

API_URL = "http://localhost:3000/api/v1/vector/upsert/<agentsid>"

# Use form data to upload files
form_data = {
    "files": ("state_of_the_union.txt", open("state_of_the_union.txt", "rb"))
}

body_data = {
    "chatId": "some-session-id"
}

def query(form_data):
    response = requests.post(API_URL, files=form_data, data=body_data)
    print(response)
    return response.json()

output = query(form_data)
print(output)
// Use FormData to upload files
let formData = new FormData();
formData.append("files", input.files[0]);
formData.append("chatId", "some-session-id");

async function query(formData) {
    const response = await fetch(
        "http://localhost:3000/api/v1/vector/upsert/<agentsid>",
        {
            method: "POST",
            body: formData
        }
    );
    const result = await response.json();
    return result;
}

query(formData).then((response) => {
    console.log(response);
});

Шаг 2. Используйте Prediction API, передав uploads и тот же chatId:

import requests
API_URL = "http://localhost:3000/api/v1/prediction/<agentsid>"

def query(payload):
    response = requests.post(API_URL, json=payload)
    return response.json()
    
output = query({
    "question": "What is the speech about?",
    "chatId": "same-session-id-from-step-1",
    "uploads": [
        {
            "data": "data:text/plain;base64,TWFkYWwcy4=",
            "type": "file:rag",
            "name": "state_of_the_union.txt",
            "mime": "text/plain"
        }
    ]
})
async function query(data) {
    const response = await fetch(
        "http://localhost:3000/api/v1/prediction/<agentsid>",
        {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify(data)
        }
    );
    const result = await response.json();
    return result;
}

query({
    "question": "What is the speech about?",
    "chatId": "same-session-id-from-step-1",
    "uploads": [
        {
            "data": "data:text/plain;base64,TWFkYWwcy4=",
            "type": "file:rag",
            "name": "state_of_the_union.txt",
            "mime": "text/plain"
        }
    ]
}).then((response) => {
    console.log(response);
});

Полная загрузка файлов

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

Чтобы включить полную загрузку файлов, перейдите в настройки агента, откройте вкладку «File Upload» и активируйте переключатель.

В чате появится кнопка «Прикрепить файл», с помощью которой можно загрузить один или несколько файлов. Загрузчик файлов преобразует каждый файл в текст.

Обратите внимание: если в вашем агенте используется узел шаблона запроса (Chat Prompt Template), необходимо создать входные данные из «Format Prompt Values», чтобы передать данные файла. Указанное имя входа (например, {file}) должно быть включено в поле «Human Message».

Для загрузки файлов через API:

import requests
API_URL = "http://localhost:3000/api/v1/prediction/<agentsid>"

def query(payload):
    response = requests.post(API_URL, json=payload)
    return response.json()
    
output = query({
    "question": "What is the data about?",
    "chatId": "some-session-id",
    "uploads": [
        {
            "data": "data:text/plain;base64,TWFkYWwcy4=",
            "type": "file:full",
            "name": "state_of_the_union.txt",
            "mime": "text/plain"
        }
    ]
})
async function query(data) {
    const response = await fetch(
        "http://localhost:3000/api/v1/prediction/<agentsid>",
        {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify(data)
        }
    );
    const result = await response.json();
    return result;
}

query({
    "question": "What is the data about?",
    "chatId": "some-session-id",
    "uploads": [
        {
            "data": "data:text/plain;base64,TWFkYWwcy4=",
            "type": "file:full",
            "name": "state_of_the_union.txt",
            "mime": "text/plain"
        }
    ]
}).then((response) => {
    console.log(response);
});

Как видно из примеров, загрузка требует строки в формате base64. Чтобы получить строку base64 для файла, используйте API «Вложения».

Разница между полной загрузкой и загрузкой RAG

Оба способа загрузки файлов — Полная загрузка и RAG (Retrieval-Augmented Generation) — служат разным целям.

- Полная загрузка файла: Этот метод преобразует весь файл в строку и отправляет её в большую языковую модель (LLM). Он полезен для суммирования документа или извлечения ключевой информации. Однако при очень больших файлах модель может выдавать неточные результаты или «галлюцинации» из-за ограничения по количеству токенов.

- Загрузка RAG: Рекомендуется, если вы хотите снизить затраты на токены, не отправляя весь текст в LLM. Этот подход подходит для задач вопрос-ответ по документам, но не подходит для суммирования, так как отсутствует полный контекст документа. Кроме того, этот процесс может занимать больше времени из-за операции обновления (upsert).