Создание продукта на базе Embeddings для поиска эссе Пола Грэма с использованием Siri

Создание продукта на базе Embeddings для поиска эссе Пола Грэма с использованием Siri

14 февраля 2023 г.

https://www.youtube.com/shorts/9700RsFxMBc?embedable=true

:::информация Embedbase – это API с открытым исходным кодом для создания, хранения и обработки данных. получение вложений.

:::

Сегодня мы создадим поисковую систему для эссе Пола Грэма, которую мы будем использовать с Apple Siri Shortcuts, например. задавать Siri вопросы об этих эссе.

«Внедрение» – это концепция машинного обучения, позволяющая сравнивать данные.

Сегодня мы не будем углубляться в техническую тему встраивания.

:::подсказка Думать о «встраиваниях» — это как складывать похожие вещи в сумку. Итак, если у вас есть сумка с игрушками, и вы хотите найти определенную игрушку, вы заглядываете в сумку и видите, какие другие игрушки находятся рядом с ней, чтобы понять, какую из них вы хотите. Компьютер может делать то же самое со словами, складывая похожие слова в пакет, а затем находя нужное слово на основе других слов рядом с ним.

:::

https://towardsdatascience.com/creating-word-embeddings-coding-the-word2vec-algorithm-in-python-using-deep-learning-b337d0ba17a8

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

Существует множество векторных баз данных и моделей НЛП для хранения и вычисления вложений. Есть также несколько дополнительных приемов работы с вложениями.

n Например, может стать ==затратно и неэффективно== повторно вычислять, когда в этом нет необходимости, например, если в примечании содержится «собака», а затем «собака», вам не обязательно выполнять пересчет, потому что измененная информация может оказаться бесполезной.

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

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

Поиск эссе Пола Грэма с помощью Siri

По порядку мы:

  1. Разверните Embedbase локально или в Google Cloud Run
  2. Создайте сканер для эссе Пола Грэма с помощью Crawlee, который загружает данные в Embedbase
  3. Создайте ярлык Apple Siri, который позволит вам искать эссе Пола Грэма в Embedbase с помощью Voice & естественный язык

Время сборки!

Технический стек

Клонирование репозитория

git clone https://github.com/another-ai/embedbase
cd embedbase

Настройка шишки

Перейдите на веб-сайт Pinecone, войдите в систему и создайте индекс:

Creating a Pinecone index

Мы назовем его «пол» и используем размер «1536» (важно правильно указать это число, под капотом это «размер» структуры данных OpenAI «встраивания»), другие настройки менее важны.

Pinecone index configuration

Вам необходимо получить ключ API Pinecone, который позволит Embedbase взаимодействовать с Pinecone:

Getting Pinecone API key

Настройка OpenAI

Теперь вам нужно получить конфигурацию OpenAI по адресу https://platform.openai.com/account/api-keys. (при необходимости создайте учетную запись).

Нажмите «Создать новый ключ»:

Creating an OpenAI key

Кроме того, получите идентификатор своей организации здесь:

Getting OpenAI organization ID

Создание конфигурации Embedbase

Теперь напишите и заполните значения в файле «config.yaml» (в каталоге embedbase):

# embedbase/config.yaml
# https://app.pinecone.io/
pinecone_index: "my index name"
# replace this with your environment
pinecone_environment: "us-east1-gcp"
pinecone_api_key: ""

# https://platform.openai.com/account/api-keys
openai_api_key: "sk-xxxxxxx"
# https://platform.openai.com/account/org-settings
openai_organization: "org-xxxxx"

Запуск Embedbase

🎉 Теперь вы можете запустить Embedbase!

Запустите Docker. Если у вас его нет, установите его, следуя инструкциям на официальном сайте. .

Starting Docker on Mac

Теперь запустите Embedbase:

docker-compose up

(Необязательно) Облачное развертывание

:::подсказка Это необязательно, можете сразу перейти к следующей части!

Не хотите заниматься инфраструктурой? Скоро запустим хостинговую версию. Просто нажмите здесь, чтобы первыми узнать, когда он выйдет

:::

Если у вас есть мотивация, вы можете развернуть Embedbase в Google Cloud Run. Убедитесь, что у вас есть проект Google Cloud и установлена ​​командная строка «gcloud» с помощью официальной документации.

# login to gcloud
gcloud auth login

# Get your Google Cloud project ID
PROJECT_ID=$(gcloud config get-value project)

# Enable container registry
gcloud services enable containerregistry.googleapis.com

# Enable Cloud Run
gcloud services enable run.googleapis.com

# Enable Secret Manager
gcloud services enable secretmanager.googleapis.com

# create a secret for the config
gcloud secrets create EMBEDBASE_PAUL_GRAHAM --replication-policy=automatic

# add a secret version based on your yaml config
gcloud secrets versions add EMBEDBASE_PAUL_GRAHAM --data-file=config.yaml

# Set your Docker image URL
IMAGE_URL="gcr.io/${PROJECT_ID}/embedbase-paul-graham:0.0.1"

# Build the Docker image for cloud deployment
docker buildx build . --platform linux/amd64 -t ${IMAGE_URL} -f ./search/Dockerfile

# Push the docker image to Google Cloud Docker registries
# Make sure to be authenticated https://cloud.google.com/container-registry/docs/advanced-authentication
docker push ${IMAGE_URL}

# Deploy Embedbase to Google Cloud Run
gcloud run deploy embedbase-paul-graham 
  --image ${IMAGE_URL} 
  --region us-central1 
  --allow-unauthenticated 
  --set-secrets /secrets/config.yaml=EMBEDBASE_PAUL_GRAHAM:1

Создание поискового робота для эссе Пола Грэма

Сканеры позволяют загружать все страницы веб-сайта. Это базовый алгоритм, используемый Google.

Клонируйте репозиторий и установите зависимости:

git clone https://github.com/another-ai/embedbase-paul-graham
cd embedbase-paul-graham
npm i

Давайте посмотрим на код, если вы перегружены всеми файлами, необходимыми для проекта Typescript, не волнуйтесь & игнорировать их.

// src/main.ts

// Here we want to start from the page that list all Paul's essays
const startUrls = ['http://www.paulgraham.com/articles.html'];

const crawler = new PlaywrightCrawler({
    requestHandler: router,
});

await crawler.run(startUrls);

Вы можете видеть, что краулер инициализируется «маршрутами», что это за таинственные маршруты?

// src/routes.ts
router.addDefaultHandler(async ({ enqueueLinks, log }) => {
    log.info(`enqueueing new URLs`);
    await enqueueLinks({
        // Here we tell the crawler to only accept pages that are under
        // "http://www.paulgraham.com/" domain name,
        // for example if we find a link on Paul's website to an url
        // like "https://ycombinator.com/startups" if it will ignored
        globs: ['http://www.paulgraham.com/**'],
        label: 'detail',
    });
});

router.addHandler('detail', async ({ request, page, log }) => {
    // Here we will do some logic on all pages under
    // "http://www.paulgraham.com/" domain name

    // for example, collecting the page title
    const title = await page.title();

    // getting the essays' content
    const blogPost = await page.locator('body > table > tbody > tr > td:nth-child(3)').textContent();
    if (!blogPost) {
        log.info(`no blog post found for ${title}, skipping`);
        return;
    }
    log.info(`${title}`, { url: request.loadedUrl });

    // Remember that usually AI models and databases have some limits in input size
    // and thus we will split essays in chunks of paragraphs
    // split blog post in chunks on the nn
    const chunks = blogPost.split(/nn/);
    if (!chunks) {
        log.info(`no blog post found for ${title}, skipping`);
        return;
    }
    // If you are not familiar with Promises, don't worry for now
    // it's just a mean to do things faster
    await Promise.all(chunks.flatMap((chunk) => {
        const d = {
            url: request.loadedUrl,
            title: title,
            blogPost: chunk,
        };
        // Here we just want to send the page interesting
        // content into Embedbase (don't mind Dataset, it's optional local storage)
        return Promise.all([Dataset.pushData(d), add(title, chunk)]);
    }));
});

Что такое добавить()?

const add = (title: string, blogPost: string) => {
    // note "paul" in the URL, it can be anything you want
    // that will help you segment your data in
    // isolated parts
    const url = `${baseUrl}/v1/paul`;
    const data = {
        documents: [{
            data: blogPost,
        }],
    };
    // send the data to Embedbase using "node-fetch" library
    fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(data),
    }).then((response) => {
        return response.json();
    }).then((data) => {
        console.log('Success:', data);
    }).catch((error) => {
        console.error('Error:', error);
    });
};

Теперь вы можете запустить сканер, загрузка & загружать все в Embedbase.

:::предупреждение Будут использованы кредиты OpenAI на сумму менее <1 доллара США

.

:::

OpenAI cost

npm start

Если вы развернули Embedbase в облаке, используйте

# you can get your cloud run URL like this:
CLOUD_RUN_URL=$(gcloud run services list --platform managed --region us-central1 --format="value(status.url)" --filter="metadata.name=embedbase-paul-graham")
npm run playground ${CLOUD_RUN_URL}

Вы должны увидеть некоторую активность в своем терминале (как в контейнере Embedbase Docker, так и в процессе узла) без ошибок (не стесняйтесь обращаться за помощью иначе).

(Необязательно) Поиск через Embedbase в вашем терминале

В примере репозитория вы можете заметить «src/playground.ts», который представляет собой простой скрипт, который позволяет вам взаимодействовать с Embedbase в вашем терминале, код прост:

// src/playground.ts
const search = async (query: string) => {
    const url = `${baseUrl}/v1/paul/search`;
    const data = {
        query,
    };
    return fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(data),
    }).then((response) => {
        return response.json();
    }).then((data) => {
        console.log('Success:', data);
    }).catch((error) => {
        console.error('Error:', error);
    });
};

const p = prompt();

// this is an interactive terminal that let you search in paul graham
// blog posts using semantic search
// It is an infinite loop that will ask you for a query
// and show you the results
const start = async () => {
    console.log('Welcome to the Embedbase playground!');
    console.log('This playground is a simple example of how to use Embedbase');
    console.log('Currently using Embedbase server at', baseUrl);
    console.log('This is an interactive terminal that let you search in paul graham blog posts using semantic search');
    console.log('Try to run some queries such as "how to get rich"');
    console.log('or "how to pitch investor"');
    while (true) {
        const query = p('Enter a semantic query:');
        if (!query) {
            console.log('Bye!');
            return;
        }
        await search(query);
    }
};

start();

Вы можете запустить его следующим образом, если вы запускаете Embedbase локально:

npm run playground

Или, например, если вы развернули Embedbase в облаке:

npm run playground ${CLOUD_RUN_URL}

Результаты:

(Необязательно) Создание ярлыка Apple Siri

Веселое время! Давайте создадим ярлык Apple Siri, чтобы иметь возможность задавать Siri вопросы об эссе Пола Грэма 😜

Во-первых, давайте запустим Apple Shortcuts:

Starting Apple Shortcuts

Создайте новый ярлык:

Creating a new Apple Siri Shortcuts

Мы назовем этот ярлык «Поиск Пола» (учтите, что именно так вы попросите Siri запустить ярлык, поэтому выберите что-нибудь попроще)

На простом английском языке этот ярлык задает пользователю запрос и вызывает с ним Embedbase, а также говорит Siri произносить вслух найденные эссе.

The first part of the shortcut

  1. "Диктовать текст" позволяет задавать поисковый запрос голосом (выберите английский язык)
  2. Мы храним конечную точку Embedbase в текстовом файле для ясности. Измените его в соответствии с вашими настройками ("https://localhost:8000/v1/search", если вы используете Embedbase локально)
  3. Мы снова установили конечную точку в переменной для ясности.
  4. То же самое для надиктованного текста
  5. Теперь «Получить содержимое» будет выполнять HTTP-запрос POST к Embedbase, используя наш ранее определенный во время сканирования «vault_id» как «paul» и использует переменную «query» для свойства «query».

The last part of the shortcut

  1. «Получить» извлечет свойство «сходство» из ответа Embedbase.
  2. "Повторить с каждым элементом" будет для каждого сходства:

  3. Получить свойство «document_path»

  4. Добавить в переменную «пути» (список)
  5. «Объединить» приведет к «объединению» результатов новой строкой.
  6. (Необязательно, ниже показано, как это сделать) Это забавный трюк, который вы можете добавить к ярлыку для остроты, используя OpenAI GPT3, чтобы преобразовать часть текста результата, чтобы он лучше звучал, когда Siri произносит его
  7. Мы собираем результат в «Текст», чтобы его можно было озвучить.
  8. Попросите Siri произнести это

https://www.youtube.com/shorts/9700RsFxMBc?embedable=true

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

:::

(заполните значение «Авторизация» «Bearer [ВАШ OPENAI KEY]»)

A functional GPT3 shortcut to transform anything

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

Заключение

Попробуйте Embedbase, оставьте заявку, и если вы не возражаете против поддержки этого проекта & в главной роли репозиторий ❤️

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

:::

https://github.com/another-ai/embedbase-paul-graham?embedable =правда

https://www.youtube.com/shorts/9700RsFxMBc?embedable=true


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE