
Пожалуйста, прочитайте полную серию блогов "Rags to Riches":
https://dev.to/aws-heroes/rags-to-riches-part-1-generative-ai-retieval-4pd7
Это приложение на основе Rag Chat на основе OpenAI, которое может помочь вам узнать о шаблонах поиска искусственного интеллекта. Технологии здесь дружелюбны для начинающих и легко развернуть в AWS Lambda. По мере того, как ваши потребности растут, не стесняйтесь производить это приложение с помощью более надежных компонентов. Что такое тряпка? Из IBM Research:
RAG-это структура искусственного интеллекта для извлечения фактов из внешней базы знаний для обоснования больших языковых моделей (LLMS) на наиболее точной, актуальной информации и для того, чтобы пользователи понимали генеративный процесс LLMS.


У вас должен быть ключ API OpenAI для запуска этого приложения. Вы можете получить один бесплатно, используя это, где мне найти свой секретный ключ API? гид. После того, как у вас есть ключ Openai, создайте файл .env.development.local в корне этого проекта следующим образом, заменив sk... на ключ:
OPENAI_API_KEY=sk...
Этот проект поддерживает контейнеры разработки, что означает, что вы можете использовать код VS для открытия этой папки в контейнере, и ваша среда разработки будет создана для вас. Запустите следующие команды в вашем интегрированном терминале или на локальной машине, предполагая, что у вас установлен узлы.
./bin/setup
./bin/serverКоманда сервера запустит как передний, так и задний сервер разработки. Используйте этот URL для доступа к вашему приложению. http: // localhost: 5173
Это демонстрационное приложение использует архитектуру сплит-стека. Это означает, что существует отчетливый фронт и задний день. Фронт-энд-это приложение Vue.js? Pinia для государства и ⚡ Vite для развития. Фронт-энд также использует? Tailwind CSS вместе с? Daisyui для стиля. Бэк-энд-это? Приложение Node.js, которое использует ❎ Express для HTTP -структуры, и? SQLite3 VSS вместе с? Better-Sqlite3 для векторного хранения и поиска.
На протяжении всего поста мы рассмотрим различные технологии более подробно и то, как они помогают нам создать тряпное приложение, изучая основы интеграции, управляемых ИИ, и быстрого разработки. Это такое веселое пространство. Надеюсь, вам понравится так же, как и я!
Итак, давайте начнем с конца. Наша демонстрация Lambdarag работает на местном уровне, чтобы облегчить развитие и обучение. В какой -то момент вы можете отправить его в производство или поделиться своей работой с другими. Так зачем развернуться в Lambda и какие преимущества предлагает этот вариант развертывания? Несколько мыслей:
Из всего этого, я думаю, что потоковая передача ответов является самым мощным. Относительно новая функция для Lambda, это позволяет нашей тряпке потоки текста обратно в веб -клиент так же, как Chatgpt. Это также позволяет Lambda нарушить полезную нагрузку от ответа 6 МБ и ограничение тайм -аута 30S. Эти несколько линий в template.yaml проекта. YAML вместе с веб -адаптером Lambda делают все возможным.
FunctionUrlConfig :
AuthType : NONE
InvokeMode : RESPONSE_STREAM Прежде чем запустить ./bin/deploy в первый раз. Убедитесь, что вы войдете в консоль AWS и сначала перейдите в магазин параметров SSM. Оттуда создайте параметр секретной строки с Path /lambda-rag/OPENAI_API_KEY и вставьте в свой ключ API OpenAI.
Наш бэкэнд имеет очень простой модуль src/utils/openai.js . Это экспортирует клиента Openai, а также вспомогательную функцию для создания встраиваний. Мы кратко рассмотрим встроенные в разделе «Основной архитектор первой части этой серии». Эта функция просто превращает запрос пользователя в векторное внедрение, которое впоследствии запрашивается в нашу базу данных SQLite. Есть множество способов создания и запроса встраиваний. На данный момент мы собираемся сделать это простым и использовать модель text-embedding-ada-002 OpenAI, которая выводит 1536 размерных встроений.
import { OpenAI } from "openai" ;
export const openai = new OpenAI ( {
apiKey : process . env . OPENAI_API_KEY ,
} ) ;
export const createEmbedding = async ( query ) => {
const response = await openai . embeddings . create ( {
model : "text-embedding-ada-002" ,
input : query ,
} ) ;
return JSON . stringify ( response . data [ 0 ] . embedding ) ;
} ;Итак, как работает API Openai, чтобы создать интерфейс чата и как контекстное окно, обсуждаемое в первой части, вступает в игру? Подумайте о следующем скриншоте, где я говорю Lambdarag, мое имя, а затем спрашиваю, помнит ли он.
CHATGPT не состоит в нем, как и большинство веб -приложений. У этого нет сеанса для модели LLM. Каждый раз, когда вы отправляете сообщение, вы должны отправлять все предыдущие сообщения (контекст) в конечную точку завершения. Вот почему мы используем? Pinia для государственного управления на стороне клиента. Таким образом, с точки зрения API, это будет выглядеть примерно так.
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
messages : [
{ role : "user" , content : "Hello my name is Ken Collins." } ,
{ role : "assistant" , content : "Hello Ken Collins! How can I..." } ,
{ role : "user" , content : "Do you remember my name?" } ,
]
} ) ; Вы заметили, как помощник отреагировал не только моим именем, но и знал, что это здесь, чтобы помочь нам с роскошной одеждой? Это техника, называемая ролевой подсказкой. Мы делаем это в демонстрации Lambdarag, подготовив эту роль к первому сообщению пользователя в файле src-frontend/utils/roleprompt.js .
Возможно, вы заметили, что демонстрация Lambdarag полностью написана? JavaScript против Python. Когда вы узнаете больше о создании приложений искусственного интеллекта, вам может в конечном итоге изучать Python, а также более продвинутые рамки, как? ️? Лангхейн или обнимаю? Transformers.js. Все из которых имеют версии JavaScript. Я надеюсь, что эта тенденция предоставления клиентов JavaScript продолжится. Это похоже на более доступный язык.
В следующем разделе мы рассмотрим, как создать вставки с вашими данными и запросом для документов с использованием нового расширения VSS от SQLite.
«Чего Lambdarag Demo Application содержит готовую к использованию базу данных SQLite с ~ 5000 продуктов из набора данных роскошной одежды на Kaggle. Он также имеет векторные встраиваемые предварительные и готовые к использованию!
Прежде чем мы покопаемся в SQLite-VSS, я хотел бы объяснить, почему я думаю, что это расширение настолько удивительно. На сегодняшний день я нашел SQLite-VSS самым простым и быстрым способом изучения векторных вторжений. Многие проекты Genai используют Supabase, которая кажется отличной, но трудно работать на месте. Цель здесь - учиться!
По мере роста вашего приложения я настоятельно рекомендую посмотреть на Amazon Opensearch Serverless. Это полностью управляемый, высоко масштабируемый и экономически эффективный сервис, который поддерживает поиск сходства вектора. Это даже поддерживает предварительную пленку с Faiss.
Давайте посмотрим на SQLite-VSS немного ближе. В этой статье расширение SQLite для Vector Search выполняет удивительную работу, охватывающую создание стандартных таблиц, а также виртуальные таблицы для внедрения и как запросить их обоих. Демонстрация Lambdarag внимательно следует за всеми этими шаблонами в нашем файле db/create.js . Наша полученная схема:
CREATE TABLE products (
id INTEGER PRIMARY KEY ,
name TEXT ,
category TEXT ,
subCategory TEXT ,
description TEXT ,
embedding BLOB
);
CREATE TABLE IF NOT EXISTS " vss_products_index " (rowid integer primary key autoincrement, idx);
CREATE TABLE sqlite_sequence (name,seq);
CREATE TABLE IF NOT EXISTS " vss_products_data " (rowid integer primary key autoincrement, _);
CREATE VIRTUAL TABLE vss_products using vss0 (
embedding( 1536 )
); Если вы хотите воссоздать базу данных SQLite или создать пользовательский набор данных, вы можете сделать это, изменив db/create.js и запустив npm run db:create . Это отказатся от существующей базы данных и воссоздает ее с помощью данных из любых файлов CSV, поддержки схемы или процесса, который вы готовы кодировать.
> npm run db:create
> [email protected] db:create
> rm -rf db/lambdarag.db && node db/create.js
Using sqlite-vss version: v0.1.1
Inserting product data...
██████████████████████████████████░░░░░░ 84% | ETA: 2s | 4242/5001 После этого вам нужно будет запустить сценарий npm run db:embeddings , который использует API OpenAI для создания встраивания для каждого продукта. Это занимает несколько минут, чтобы завершить все вызовы API. Задача включает в себя локальный кеш, чтобы сделать его быстрее для повторного запуска. Наконец, существует npm run db:clean сценарий, который вызывает VACUUM на БД, чтобы удалить потраченное место для виртуальных таблиц. Опять же, все это требуется только в том случае, если вы хотите воссоздать базу данных или создать пользовательский набор данных. Существует сценарий обертки ./bin/setup-db который делает все эти шаги для вас.
Итак, у нас есть база данных продуктов и их соответствующие векторные вставки для использования для семантического поиска. Как мы кодируемся, переходя от чата к получению элементов из базы данных? Openai имеет эту удивительную функцию с именем функции. В нашей демонстрации это позволяет LLM искать продукты и описывать вам результаты.
Но как он узнает? Вы просто описываете массив функций, которые использует ваше приложение, и во время вызова API завершения чата. OpenAI 1) автоматически определяет функцию. Функция должна быть вызвана 2) вернуть имя функции для вызова вместе с необходимыми параметрами. Ваш запрос выглядит примерно так.
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
functions : '[{"search_products":{"parameters": {"query": "string"}}}]' ,
messages : [
{ role : "user" , content : "I need a cool trucker hat." }
]
} ) ; Если функция была выбрана, ответ будет включать имя функции и параметров. Ваша ответственность - проверить это, а затем вызовите код вашего приложения, соответствующую функции и параметрам. Для Lambdagpt это будет запросить базу данных и возврат любых соответствующих рядов. Мы делаем это в нашем файле src/models/products.js .
Чтобы Openai ответил результатами, мы отправляем ему еще один запрос, в котором теперь есть два дополнительных сообщения. Первый тип «функция» и включает имя и параметры функции, которую вам попросили позвонить. Второе - тип «пользователь», который включает в себя данные JSON продуктов, возвращаемых из нашего процесса поиска. Openai теперь ответит так, как будто у него есть эти знания все время!
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
functions : '[{"search_products":{"parameters": {"query": "string"}}}]' ,
messages : [
{ role : "user" , content : "I need a cool trucker hat." } ,
{ role : "function" , name : "search_products" , content : '{"query":"trucker hats"}' } ,
{ role : "user" , content : '[{"id":3582,"name":"Mens Patagonia Logo Trucker Hat..."}]' } ,
]
} ) ; Поскольку все сообщения сохраняются в состоянии клиента, вы можете увидеть их, используя аккуратную технику отладки. Откройте файл src-frontend/components/Message.vue и сделайте следующее изменение.
'border-b-base-300': true,
'bg-base-200': data.role === 'user',
- 'hidden': data.hidden,
+ 'hidden': false,Теперь вы можете увидеть все сообщения «состояние сообщений в пользовательском интерфейсе». Это отличный способ отладки вашего приложения и посмотреть, что происходит.
Я надеюсь, что вы нашли этот быстрый обзор того, как завершить чат Openai можно дополнить для поиска знаний. Есть гораздо больше, чтобы исследовать и сделать. Вот несколько идей, которые вы можете начать:
fetchResponse в src-frontend/stores/messages.js Pinia Store выполняет всю работу здесь и управляет государством клиента.src/utils/functions.json . Например, метод find_style по ID, который напрямую запросил базу данных.❤ Я надеюсь, что вам понравились эти посты и обнаружите, что демонстрационное приложение Lambdarag полезно для обучения использованию ИИ для поиска знаний. Не стесняйтесь задавать вопросы и поделиться своими мыслями в этом посте. Спасибо!