Адаптер для подключения AI LLM к источникам заземления и данным в реальном времени.
Перечисление основных улучшений
Выпускать | Дата | Ключевые особенности |
---|---|---|
2.0.5 | 01 апреля 2024 г. | Основное обновление: поддерживает ClaudeAI в дополнение к OpenAI и GoogleAI. |
2.0.0 | 05 января 2024 г. | Основное обновление: поддержка GoogleAI в дополнение к OpenAI. |
1.3.0 | 16 декабря 2023 г. | Улучшенные подсказки для использования соответствующих данных и генерации соответствующих ответов. Ответы для всех методов теперь предоставляют информацию о времени выполнения. |
1.2.9 | 03 ноября 2023 г. | (1) В конфигурации агента можно указать (необязательный) ключ языка. Если этот параметр установлен, LLM всегда думает и отвечает на указанном языке (независимо от языка ввода). Примечание . В некоторых случаях качество перевода может быть неоптимальным, поэтому настоятельно рекомендуется провести тщательное тестирование. (2) Ответ от метода «все в одном» включает в себя базовые данные, используемые LLM для генерации ответа. Это должно повысить надежность. |
1.2.8 | 26 октября 2023 г. | Встроенная техника подсказок для более глубокого погружения для улучшения качества ответа. |
1.2.2 | 18 октября 2023 г. | Улучшены подсказки LLM и логика для определения API. |
1.1.1 | 09 октября 2023 г. | Введенный LLM предлагает включить разновидность конституционного ИИ, чтобы гарантировать, что вводимые пользователем данные являются справедливыми, ответственными, уважительными и гуманными. |
1.1.0 | 8 октября 2023 г. | Появилась возможность создавать контекст/память для последующих вопросов. |
1.0.0 | 8 октября 2023 г. | Первоначальный запуск. |
Будучи мультимодальными моделями искусственного интеллекта, LLM имеют широкую применимость для создания контента с минимальными инструкциями. Такие методы подсказок, как «нулевой» или «несколько выстрелов», популярны среди обычных пользователей чат-приложений, созданных на основе таких LLM. Тем не менее, хотя качество ответа превосходное, насколько мы можем ему доверять? Как мы можем быть уверены, что модель не «придумывает» (то есть галлюцинирует) на лету?
В результате очень важно обосновать LLM путем предоставления контекстных данных в сочетании с правильными методами подсказок. Использование подсказок с обоснованной информацией в качестве контекста, чтобы помочь LLM генерировать лучший ответ, является широко распространенной практикой.
Одним из таких подходов является поисковая расширенная генерация (RAG), которая основана на хранении и поиске вложений текста, предоставляемых LLM вместе с приглашением. Однако RAG полагается на статическую информацию, преобразованную в встраивание текста и сохраняющую ее в графовых базах данных (также известных как векторные базы данных), чтобы из нее можно было извлечь соответствующую информацию и дополнить ее посредством заземления для генерации текста/ответа.
Шаблон RAG может поднять вопрос о том, можно ли использовать данные в реальном времени вместе с LLM для генерации эффективных и надежных ответов. Простой ответ: «Конечно, да!» . Но это означает гораздо больше ответственности на плечах разработчиков приложений. Разработчику необходимо вызвать API, чтобы обернуть ответ в приглашение, чтобы LLM сгенерировал соответствующий ответ. Но будет ли работать повторный вызов одного и того же API для каждого вопроса? - Скорее всего, нет! Как мы можем динамически определять, какой API следует вызывать и какие параметры необходимо передавать на основе вопроса? Это также похоже на возможности для LLM.
Вот тут-то и вступает в игру AI-Dapter (читай: AI Adapter ). AI-Dapter ускоряет процесс разработки приложений на основе LLM для разработчиков, позволяя им сосредоточиться только на приложениях, перекладывая при этом бремя последующих действий на LLM.
определение правильных конечных точек API из заранее определенного репозитория API,
получение данных в реальном времени от идентифицированных конечных точек API,
генерирование ответа с использованием выбранной модели LLM.
Опыт разработки значительно улучшается за счет подключения инфраструктуры AI-Dapter к коду приложения и беспрепятственного использования ее в качестве черного ящика для ответа на вопросы пользователей на основе LLM. Обратите внимание, что сами эти вопросы пользователей могут быть близки к подсказке с нулевым шансом!
Фактическая работа, стоящая за этим черным ящиком, включает в себя:
возможность интегрировать выбранную вами модель LLM с вашими учетными данными (Примечание: в настоящее время поддерживаются только модели OpenAI GPT),
интегрированный механизм, который использует вводимые пользователем данные для идентификации -
источники данных на основе API,
получение данных в реальном времени от этих API и
генерация ответа на основе данных в реальном времени с использованием LLM.
Пожалуйста, оставляйте отзывы или запросы на новые функции через обсуждения GitHub.
Пожалуйста, отправляйте свои проблемы через GitHub Issues.
Запустите следующую команду в командной строке, чтобы установить AI-Dapter для вашего проекта NodeJS. Убедитесь, что вы находитесь в корневом каталоге вашего проекта.
npm установить ai-dapter --save
Предполагая, что вы настроили проект NodeJS машинописного текста, импортируйте класс AIDapter следующим образом.
импортировать AIDapter из «ai-adapter»;
Чтобы инициализировать AI-Dapter, вам необходимо передать некоторые обязательные и необязательные параметры для завершения настройки. Ниже показан пример, сопровождаемый документацией по поддерживаемым параметрам.
const ai = новый AIDapter({ "app_name": "<<Короткое имя приложения>>" "провайдер": "OpenAI", "model_name": "gpt-3.5-turbo-16k", "endpoint": "https://api.openai.com/v1/chat/completions", "authentication": {"api_key": "<<Ваш ключ OPENAI>>","org_id": "<<Ваш идентификатор организации OPENAI>>" }, "temperature": "<<между 0,0 и 2,0>>"});
Список поддерживаемых параметров для инициализации настройки.
Параметр | Обязательный(M)/Необязательный(O) | Цель | Возможные значения |
---|---|---|---|
app_name | М | Краткое название приложения. | - |
provider | М | Поставщик модели LLM. Примечание . В настоящее время поддерживаются только модели, предоставленные непосредственно OpenAI. | «ОпенАИ» |
model_name | О | Позволяет выбрать любую модель, выпущенную поставщиком. Мы рекомендуем использовать модели, допускающие большие размеры токенов, такие как gpt-3.5-turbo-16k или gemini-pro или claude-3-haiku-20240307 . | - |
endpoint | О | Конечная точка, из которой поставщик обслуживает модель LLM. Возможно, вам придется обратиться к документации конкретного поставщика. Например, модель завершения чата OpenAI обслуживается из конечной точки https://api.openai.com/v1/chat/completions , модель GoogleAI обслуживается из https://generativelanguage.googleapis.com/v1/models/gemini-pro:generateContent Модель https://generativelanguage.googleapis.com/v1/models/gemini-pro:generateContent и ClaudeAI предоставляется по адресу https://api.anthropic.com/v1/messages . | - |
authentication | М | Предоставьте данные аутентификации, указанные вашим провайдером. Например, поскольку OpenAI требует ключ API и идентификатор организации, они предоставляются в полях api_key и org_id , как показано в примере инициализации выше. | - |
telemetry | О | Сбор телеметрических данных. По умолчанию верно. | правда/ложь |
AI-Dapter позволяет настраивать определенные конфигурации агентов, например добавлять роли, персональные данные и т. д. Аналогичным образом вы можете настраивать определенные конфигурации данных, например, контролировать количество записей из ответов API в реальном времени, передавать дополнительный контекст или Обоснование информации для моделирования последующих действий и т. д.
Параметры агента и конфигурации передаются как один объект следующим образом. Обратитесь к соответствующим разделам ниже, чтобы найти и настроить эти значения конфигурации.
пусть параметры: AIDapterOptions = { "agentConfig": { "role": "личный помощник" }, "dataConfig": { "max_records": 7 }};
Ниже приведены поддерживаемые в настоящее время параметры конфигурации агента. Добавьте эти поля в объект agentConfig
.
Параметр | Обязательный(M)/Необязательный(O) | Цель | Возможные значения |
---|---|---|---|
role | М | Помогает определить подход LLM к вопросам пользователей. Например, в роли армейского сержанта LLM может ответить на вопрос о текущем времени примерно так: «Текущее время 08:01 утра по восточному времени», в то время как комик, который всегда рассказывает однострочную шутку по поводу моего вопроса. может ответить что-то вроде: «Пришло время приобрести часы! Шучу, сейчас 8:01 утра, 7 октября 2023 года по часовому поясу по восточному летнему времени (EDT)». | - |
personality | О | Придает индивидуальность тону ответа LLM. | - |
language | О | Язык, на котором должен отвечать агент, независимо от языка, на котором задается вопрос пользователя. По умолчанию = английский. | - |
expert_at | О | Если LLM должен предполагать, что они являются экспертами в какой-либо конкретной области, например, в здравоохранении или автомобильных двигателях и т. д. | - |
max_words | О | Контролируйте, насколько длинным или коротким должен быть ответ LLM. По умолчанию — менее 200 слов. | Любое число от 1 до 200 |
Ниже приведены поддерживаемые в настоящее время параметры конфигурации данных. Добавьте эти поля в объект dataConfig
.
Параметр | Обязательный(M)/Необязательный(O) | Цель | Возможные значения |
---|---|---|---|
max_records | М | Управляет тем, сколько самых популярных записей из набора результатов, полученных в результате вызова API в реальном времени, должно быть продано. Этот параметр необходим для управления размером входного токена, поскольку результаты вызова API используются для заземления. Примечание . Поскольку сохраняются только верхние X строк, лучше всего предоставить конечные точки API, которые будут включать данные, отсортированные в порядке убывания. По умолчанию=10 | Любое число от 1 до 10 |
additional_context | О | Дополнительный контекст может быть предоставлен, когда ожидаются возможности, подобные последующим действиям. (см. примеры из 6.3. Генерация ответа LLM с обоснованием данных в реальном времени). | Должен быть массивом со следующей структурой: [{ "question": "", "response_summary": "", "entities": { ... } }, { ... }] |
max_contexts | О | Сохраняет последние X-контексты. AI-Dapter сохранит два последних элемента массива additional_context , предполагая, что последний контекст всегда добавляется в конец этого массива. | 1 или 2 |
AI-Dapter предоставляет три возможности и, следовательно, три метода доступа к этим возможностям.
Рекомендация: Для лучшего опыта разработки см. 6.3. Генерация ответа LLM с обоснованием данных в реальном времени
AIDapter.getRealtimeSources(input: string, apiRepository: Types.APIRepository[]): Promise
Используйте этот метод, если ваша цель — получить соответствующие конечные точки API на основе вопросов пользователей.
Параметр | Обязательный(M)/Необязательный(O) | Цель | Тип данных |
---|---|---|---|
input | М | Вопрос пользователя | Текст |
apiRepository[] | М | Предоставьте полный репозиторий API, который будет содержать подробную информацию о конечной точке API (метод, URL-адрес, заголовки и данные), заполнители, используемые в конечной точке API, а также инструкции по проверке, которые будет использовать LLM. | См. 7. Репозиторий API. |
Поле | Цель |
---|---|
api_endpoints[] | массив всех идентифицированных конечных точек API. |
provider | Указывает, какой поставщик LLM использовался. |
runtime | Для отслеживания общего времени ответа. Обратите внимание, что это будет зависеть от времени ответа API LLM. |
// Импорт и инициализация AI-Dapterimport AIDapter из "ai-adapter";const ai = new AIDapter({ "провайдер": "GoogleAI", "authentication": {"api_key": "<<Ваш ключ API>>" }});// Определите репозиторий API, из которого соответствующий API будет идентифицирован, обновлен и возвращен. // Обратите внимание, что в этом примере представлен только один пример конечной точки API, но поскольку это массив, вам следует ожидать предоставления нескольких такой API endpoints.const apiRepository = [ {"api_info": { "title": "Текущее время", "description": "Определите соответствующий часовой пояс и местоположение для данного местоположения и получите время в этом месте."},"api_endpoint": { "method": "GET", "url": "http://worldtimeapi.org/api/timezone/|area_location|", "headers": {"Content-Type": "application/json" }},"placeholders": [ {"placeholder": "|area_location|","validation_criteria": "Пример area_location: Америка/Нью_Йорк или Европа/Лондон. На основе предоставленного допустимого местоположения определите подходящую area_location." ,"default": "Америка/Нью_Йорк" }] }];// Это вопросник пользователя input = "сколько времени в Мумбаи?"// Теперь вызовите метод getRealtimeSources(), чтобы получить действительные конечные точки API.getRealtimeSources(input, apiRepository) .then((resp) => {console.log(resp);/* { "api_endpoints": [ { "api": { "method": "GET", "url": "https://worldtimeapi.org /api/timezone/Asia/Kolkata", "headers": { "Content-Type": "application/json" } }, "placeholders": [ { "placeholder": "[area_location]", "determined": true } ], "status": "OK" } ], "provider": "GoogleAI", "runtime": "2 секунды" } */ }).catch((err) => console.log(JSON.stringify(err, null, 4)));
Обратите внимание, что на основе предоставленного пользователем города Мумбаи LLM определила подходящее значение для заполнителя area_location и вернула обновленную конечную точку API.
AIDapter.getDataFromRealtimeSource(ввод: строка, apiRepository: Types.APIRepository[], dataConfig?: Types.DataConfig | не определено): Promise
Используйте этот метод, если ваша цель — получить данные от соответствующих конечных точек API на основе вопросов пользователей.
Параметр | Обязательный(M)/Необязательный(O) | Цель | Тип данных |
---|---|---|---|
input | М | Вопрос пользователя | Текст |
apiRepository[] | М | Массив информации API, конечные точки (метод, URL-адрес, заголовки и данные) и заполнители. | См. 7. Репозиторий API. |
dataConfig | О | Параметры конфигурации для управления данными, полученными в результате вызовов API. | См. 5.2. Конфигурация данных |
Поле | Цель |
---|---|
api_results[] | Массив ответов на все вызовы API. |
provider | Указывает, какой поставщик LLM использовался. |
runtime | Для отслеживания общего времени ответа. Обратите внимание, что это будет зависеть от времени ответа API LLM. |
// Импорт и инициализация AI-Dapterimport AIDapter из "ai-adapter";const ai = new AIDapter({ "провайдер": "GoogleAI", "authentication": {"api_key": "<<Ваш ключ API>>" }});// Определите репозиторий API, из которого соответствующий API будет идентифицирован, обновлен и возвращен. // Обратите внимание, что в этом примере представлен только один пример конечной точки API, но поскольку это массив, вам следует ожидать предоставления нескольких такой API endpoints.const apiRepository = [ {"api_info": { "title": "Текущее время", "description": "Определите соответствующий часовой пояс и местоположение для данного местоположения и получите время в этом месте."},"api_endpoint": { "method": "GET", "url": "http://worldtimeapi.org/api/timezone/|area_location|", "headers": {"Content-Type": "application/json" }},"placeholders": [ {"placeholder": "|area_location|","validation_criteria": "Пример area_location: Америка/Нью_Йорк или Европа/Лондон. На основе предоставленного допустимого местоположения определите подходящую area_location." ,"default": "Америка/Нью_Йорк" }] }];// Это вопросник пользователя input = "сколько времени в Мумбаи?"// Конфигурация данных dataConfig = { "max_records": 3 }// Теперь вызовите метод getDataFromRealtimeSource(), чтобы получить данные от вызова всех соответствующих Конечные точки API на основе пользователя questionsai.getDataFromRealtimeSource(question, apiRepository, dataConfig) .then((resp) => {console.log(resp);/* { "api_results": [ { "api_sources": "worldtimeapi.org", "data": { "abbreviation": "IST", "client_ip ": "50.126.214.61", "дата-время": "2024-01-05T22:48:30.316887+05:30", "day_of_week": 5, "day_of_year": 5, "dst": false, "dst_from": null, "dst_offset": 0, "dst_until": ноль, «raw_offset»: 19800, «часовой пояс»: "Азия/Калькутта", "unixtime": 1704475110, "utc_datetime": "2024-01-05T17:18:30.316887+00:00", "utc_offset": "+05:30", "week_number": 1 } } ], "провайдер": "GoogleAI", "время выполнения": "4 секунды" } */ }).catch((err) => console.log(JSON.stringify(err, null, 4)));
Ответ на вызов API. Эти данные можно использовать для заземления LLM.
AIDapter.getLLMResponseFromRealtimeSources(ввод: строка, apiRepository: Types.APIRepository[], параметры?: AIDapterOptions | не определено): Promise
Используйте этот метод, если ваша цель — получить ответы LLM на вопросы пользователей. Это включает в себя идентификацию соответствующих конечных точек API, вызов идентифицированных API и использование их в приглашении LLM для получения ответа от LLM.
Рекомендация: используйте этот метод для достижения максимального ускорения процесса разработки приложений.
Параметр | Обязательный(M)/Необязательный(O) | Цель | Тип данных |
---|---|---|---|
input | М | Вопрос пользователя | Текст |
apiRepository[] | М | Массив информации API, конечные точки (метод, URL-адрес, заголовки и данные) и заполнители. | См. 7. Репозиторий API. |
options | О | Конфигурация агента и данных | См. 5. Параметры конфигурации агента и данных. |
Поле | Цель |
---|---|
ai_response | LLM сгенерировал ответ. |
ai_status | Помогает определить, основан ли ответ на наличии всех необходимых элементов данных для успешных вызовов API. Возможные значения: ОК, ДАЛЬШЕ или НЕПОЛНО. |
ai_context | Он содержит краткую сводку ответов и список объектов. Идея этого поля заключается в сценариях использования, связанных с последующими беседами. Весь объект можно передать как additional_content в параметрах dataConfig , когда необходимо отправить дополнительные вопросы. |
provider | Указывает, какой поставщик LLM использовался. |
runtime | Для отслеживания общего времени ответа. Обратите внимание, что это будет зависеть от времени ответа API LLM. |
// Импорт и инициализация AI-Dapterimport AIDapter из "ai-adapter";const ai = new AIDapter({ "провайдер": "GoogleAI", "authentication": {"api_key": "<<Ваш ключ API>>" }});// Определите репозиторий API, из которого соответствующий API будет идентифицирован, обновлен и возвращен. // Обратите внимание, что в этом примере представлен только один пример конечной точки API, но поскольку это массив, вам следует ожидать предоставления нескольких такой API endpoints.const apiRepository = [ {"api_info": { "title": "Текущее время", "description": "Определите соответствующий часовой пояс и местоположение для данного местоположения и получите время в этом месте."},"api_endpoint": { "method": "GET", "url": "http://worldtimeapi.org/api/timezone/|area_location|", "headers": {"Content-Type": "application/json" }},"placeholders": [ {"placeholder": "|area_location|","validation_criteria": "Пример area_location: Америка/Нью_Йорк или Европа/Лондон. На основе предоставленного допустимого местоположения определите подходящую area_location." ,"default": "Америка/Нью_Йорк" }] }];// Это вопросник пользователя input = "сколько времени в Мумбаи?"// Параметры AI-Dapter, которые обеспечивают комбинированную настройку агента и параметры конфигурации данных: AIDapterOptions = { "agentConfig": { "role": "комик, который всегда шутит по поводу моего вопроса" }, "dataConfig": { "max_records": 7 }};// Теперь вызовите метод getLLMResponseFromRealtimeSources(), чтобы получить ответ LLM на вопрос пользователя.// Ответ LLM основан на подсказке, которая использует данные в реальном времени для обоснования. ai.getLLMResponseFromRealtimeSources(вопрос, apiRepository, параметры) .then((resp) => {console.log(resp);/* { "ai_response": "В оживленном городе Мумбаи, где болливудские мечты развеваются, а воздух наполняется ароматом уличной еды, сейчас 22 года: 50 в эту сказочную пятницу, 5 января 2024 года. Итак, потягиваете ли вы чай у Ворот Индии или наслаждаетесь ритмами местного танца club, помните, время никого не ждет, даже самых больших звезд Болливуда!", "ai_status": "OK", "ai_context": { "questions": "сколько сейчас времени в Мумбаи? в Мумбаи?", "entities": [], "data": [ { "аббревиатура": "IST", "client_ip": "50.126.214.61", "datetime": "2024-01-05T22:50:51.261990+05:30", "day_of_week": 5, "day_of_year": 5, "dst": false, "dst_from": null, "dst_offset": 0, "dst_until": ноль, «raw_offset»: 19800, «часовой пояс»: "Азия/Калькутта", "unixtime": 1704475251, "utc_datetime": "2024-01-05T17:20:51.261990+00:00", "utc_offset": "+05:30", "week_number": 1 } ] , "источники": [ "worldtimeapi.org" ] }, "provider": "GoogleAI", "runtime": "6 секунд" } */ }).catch((err) => console.log(JSON.stringify(err, null, 4)));
Обратите внимание, что вопрос пользователя сначала используется для идентификации соответствующего API из предоставленного репозитория API. Этот метод также вызывает идентифицированные API, собирает их ответы для обоснования окончательного запроса LLM и возвращает сгенерированный ответ.
Также обратите внимание, что ответ содержит сгенерированный LLM контент в поле ai_response
и контекст в поле ai_context
. Весь контекст можно передать как dataConfig.additional_context
вместе с дополнительными вопросами.
В примере показано, как можно передать контекст, чтобы обеспечить возможность последующих бесед.
// Как показано в предыдущем примере, ai_context содержит следующую информацию:// --------------------------------- --------------------------------------------// resp.ai_context: {// "вопросы": "сколько времени в Мумбаи? Какая текущая дата в Мумбаи?",// "entities": [],// "data": [// {// "аббревиатура": "IST",// "client_ip": "50.126.214.61", // "datetime": "2024-01-05T22:50:51.261990+05:30", // "day_of_week": 5, // "day_of_year": 5, // "dst": false, // "dst_from": null, // "dst_offset": 0, // "dst_until": null, // "raw_offset": 19800, // "timezone": "Азия/Калькутта", // "unixtime": 1704475251, // "utc_datetime": "2024-01-05T17 :20:51.261990+00:00",// "utc_offset": "+05:30",// "week_number": 1// }// ],// "sources": [// "worldtimeapi.org"// ]// }// --- -------------------------------------------------- ------------------------// Добавьте приведенный выше контекст в dataConfig.additional_context ...if(options.dataConfig[additional_context]){