> For the complete documentation index, see [llms.txt](https://docs.ncteam.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ncteam.io/ai/obuchenie-ii-vektornomu-metodu.md).

# Обучение ИИ векторному методу

**Искусственный интеллект стал надёжным помощником** в решении множества повседневных и профессиональных задач — от написания текстов до анализа данных. Наибольшую популярность обрели **Генеративные модели ИИ** благодаря своей способности создавать новые данные, опираясь на информацию, использованную в процессе их обучения. Объясняя простым языком, они могут создавать тексты, изображения, музыку или другие типы контента, имитируя стиль и структуру исходных данных, при этом формируя уникальные и оригинальные варианты ответа, не являющиеся дословным повторением исходного материала.

Одна из проблем, с которой часто сталкиваются пользователи, которые используют **Генеративную модель ИИ** – получение ложной или искаженной информации. Искусственный интеллект может "уверенно" отвечать неправильно, если не ограничен контекстом или не знает, где искать достоверный источник. Данное явление называют **"галлюцинацией ИИ"**.

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

Решением становится **метод подбора** — подход, при котором ИИ не "выдумывает" ответ, а **выбирает наиболее релевантный фрагмент из заранее подготовленной базы знаний**.

В данной инструкции мы подробно рассмотрим процесс **обучения ИИ методу подбора**.

### Что такое метод подбора?

{% hint style="info" %}
**Метод подбора** — это способ, с помощью которого искусственный интеллект **находит наиболее подходящий объект** из множества возможных, основываясь на определённой логике или метрике сходства. Такой подход позволяет извлекать наиболее релевантные данные из подготовленного набора, минимизируя риск ошибки.
{% endhint %}

### Для обучения нам понадобятся следующие платформы и сервисы:

* NocoDB
* n8n
* Pinecone
* OpenAI

### Формирование базы данных

В первую очередь нам необходимо подготовить данные для загрузки в **ИИ** и сформировать базу данных в формате **вопрос-ответ**. Сделать это можно на платформе **NocoDB**, однако быстрее и проще будет создать подходящий список в **Google Sheets**.

{% stepper %}
{% step %}
Открываем Google Sheets и создаем таблицу в нем:

![](/files/1310eaaffdffcbbf22f80885bb1e9547d92a1cd7)

* В созданной таблице создаем две колонки – **question** (вопрос) и **answer** (ответ).
  {% endstep %}

{% step %}
Берём интересующий материал и формируем вопросы и ответы.

<figure><img src="/files/5Bppiadmn1L87a8fY4k2" alt=""><figcaption></figcaption></figure>

**!Важно:** Чем больше будет синонимичных вопросов, тем более точно **ИИ** будет подбирать ответ. Лучше сделать минимум вопросов 10 на каждый ответ. **Один вопрос – одна строка.**

Также советуем делать в **Google Sheet** не более **150 строчек** на каждом листе, чтобы в будущем при загрузке в базу **NocoDB** у нас не возникло проблем с импортированием.
{% endstep %}

{% step %}
После формирования базы вопросов и ответов скачиваем каждый лист в формате **CSV**.

![](/files/c010ee13aa34aae2470ccd6f03d7c2d1aaf82666)
{% endstep %}

{% step %}
Открываем **NocoDB** и создаем в нем новую базу, для этого нажимаем на кнопочку **Create Base**.

![](/files/0eee72851f7e5876c530a3cbc3307e22c131f756)
{% endstep %}

{% step %}
В открывшемся окошке даем наименование и еще раз жмем на кнопку **Create Base**.

<figure><img src="/files/bqjkCS2zroe2QY6078wZ" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Перед импортированием таблицы из **Google Sheet** мы создаем новую таблицу.

<figure><img src="/files/8hmBF87qCW2lvS8AXM7O" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Присваиваем ей наименование и жмем **Create Table**.

<figure><img src="/files/EcfNVsKkEUWNv18bEWPk" alt=""><figcaption></figcaption></figure>

У нас по умолчанию открывается вот такое поле:

<figure><img src="/files/yWpeAp5gpVAq0C3mKBdI" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Поскольку таблица у нас пустая, мы должны ее заполнить колонками и выбрать в них необходимый тип данных для записи. Для начала переименуем по умолчанию созданную колонку с названием **Title**. Сделать это можно, нажав на стрелочку вниз.

<figure><img src="/files/R0VOyFvtGjTKtwcasjkA" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Данная кнопочка развернет параметры колонки. В раскрывшемся списке действий выбираем **Edit field**.

<figure><img src="/files/EU0IeTrwqHbgFSNVjbTX" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
После этого появится окошко редактирования названия столбца и типа данных.

<figure><img src="/files/4BbDbmBxgmt47YbOi0vB" alt=""><figcaption></figcaption></figure>

В нашем случае лучше выбрать **Long text**, чтобы было удобнее просматривать таблицу.

<figure><img src="/files/opEjLKxSdEwvFKs5vXTv" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Сохраняем название и тип данных по кнопке **Update Field.**

<figure><img src="/files/sKEpCTJW5A2SdOwjsP0k" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Теперь нам нужно создать еще 4 колонки. Сделать это можно по кнопке "+"

<figure><img src="/files/NO5KC1Lntjri7KgEmuQV" alt=""><figcaption></figcaption></figure>

Всего у нас должно получиться 5 колонок со следующим типом данных:

a. **question**\
&#x20;    Field type – Long text

b. **answer**\
&#x20;    Field type – Long text

c. **emdedded**\
&#x20;    Field type – Checkbox

d. **to\_embed**\
&#x20;    Field type – Checkbox

А еще в значении **Defalut value** должна стоять галочка

<figure><img src="/files/cF9YSdWu8N4uuYN6URWy" alt=""><figcaption></figcaption></figure>

e. **to\_delete**

Field type – Checkbox

В конечном итоге у нас должно это выглядеть так:

<figure><img src="/files/tascq9nxyWShZuF2Bxav" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Импортируем данные. Для того чтобы загрузить нашу имеющуюся таблицу с вопросами и ответами, нам необходимо нажать на три вертикальных строчки в верхней панели, затем **Upload → Upload CSV**

<figure><img src="/files/7SpzzRZFq2JYUCcyfrbZ" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Перед нами откроется окошко загрузки файлов. Перетягиваем таблицу из загрузок, либо загружаем по кнопке из внутреннего хранилища компьютера.

<figure><img src="/files/LTlOodpojzfExAi9zoeO" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Нажимаем **Import**.

<figure><img src="/files/LdIjUyRY4hdK1sZFiQmq" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Важно: Названия колонок в обеих таблицах должны совпадать!** Либо необходимо вручную выбрать, какой столбец из **Google Sheets** соответствует столбцу в **NocoDB**. Нажимаем **Import** еще раз, если все верно.

<figure><img src="/files/GiPraCRGajp6sbTByBHB" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
При успешном импортировании должен получиться такой результат:

<figure><img src="/files/QgMeav6Ub3astd9k2Vxq" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

***

### Создание индексов в Pinecone

**Pinecone** — это облачная векторная база данных, которую мы будем использовать для работы с искусственным интеллектом.

Когда мы передаём в ИИ текст (например, вопрос или описание), он преобразует его в **вектор** – массив чисел, который отражает смысл и контекст данного текста. Эти векторы можно сравнивать между собой: чем они ближе друг к другу в многомерном пространстве, тем более **они схожи** с текстами, из которых были получены.

При работе с большим объёмом векторных данных важно **эффективно находить похожие объекты**. Для этого используется **индекс** – специальная структура данных, оптимизированная для быстрого поиска схожих векторов.

{% stepper %}
{% step %}
Откроем интерфейс **Pinecone** и нажмем кнопку **Create index**.

![](/files/9033a04d81bf83b67a1cfe3b3b5cca211f779b63)
{% endstep %}

{% step %}
После нажатия кнопки откроется окошко с настройками индекса. Здесь мы пишем название нашего индекса и ставим галочку на Custom settings.

![](/files/c4dacbd5cead402e938fcd35a1f0021db7a16f7a)
{% endstep %}

{% step %}
В разделе **Configuration** указываем размерность:

В поле **Dimension** вводим значение – 3072.

![](/files/c03f37ef61d1c68d74314ef3bca802a2c24bc9e9)
{% endstep %}

{% step %}
Затем нажимаем **Create index**.

![](/files/1244b2fc514b679bf2207e832aeed0d8de530b09)
{% endstep %}

{% step %}
После создания индекс появится в списке. Скопируйте его ссылку – она потребуется в дальнейшем.

![](/files/df0e05c1407ca30b057caec47d0fca333cee6836)
{% endstep %}
{% endstepper %}

## Обучение ИИ по базе знаний&#x20;

1. Открываем **n8n** и создаем в нем новый **Workflow**
2. Наша цепочка будет выглядеть следующим образом:

   <figure><img src="/files/sImYcF0Jjd2GwvBiy7sn" alt=""><figcaption></figcaption></figure>

### Краткое описание узлов цепочки:

**Schedule Trigger** — запускает процесс по расписанию.

**NocoDB** — получает данные из таблицы NocoDB (вопросы и ответы).

**HTTP Request** — отправляет запрос к OpenAI для генерации эмбеддингов.

**Embeddings** — формирует массив векторов.

**50 Vectors** — подготавливает массив из 50 векторов для загрузки.

**Upsert** — загружает векторы в Pinecone.

**Mark as Embedded** — помечает обработанные строки в базе как embedded.<br>

### Рассмотрим параметры каждого узла более детально: <a href="#rassmotrim-parametry-kazhdogo-uzla-bolee-detalno" id="rassmotrim-parametry-kazhdogo-uzla-bolee-detalno"></a>

#### **Schedule Trigger**

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

![](https://cdn2.buildin.ai/s3/693bad1b-b398-4381-9a35-22590daf3706/image.png?time=1768910400\&token=41866b8b402ec6d7c8e2b9a4edef641a\&role=free)

#### **NocoDB1**

<figure><img src="/files/8RkSCAf0hBi8QxIFb2xj" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
**!Важный момент.** В **n8n** у вас должны быть созданы **Credential** с **NocoDB** и **Pinecone**. При создании **Credential** для **NocoDB** требуется указать **Название** и **API Token** А при создании **Credential** для **Pinecone** требуется **Название**, **Ключ API**

**Это нужно для получения доступа к сервисам.**<br>
{% endhint %}

В текущем узле мы выбираем нужный **Credential**, **Project Name** и **Table name** (пространство в NocoDB, база в NocoDB и таблица)

В разделе **Options** в поле **Fields** пишем - I**d,question,answer**. В поле **Filter by Formula** устанавливаем фильтр:

```json
(embedded,eq,false)~and(to_embed,eq,true)~and(question,neq,)~and(question,isnot,null)~and(answer,neq,)~and(answer,isnot,null)~and(to_delete,eq,false)
```

#### HTTP-request

В данном узле мы заполняем параметры для отправки запроса, выбираем метод, пишем адрес. В **Header Parameters** пишем название заголовка **Authorization** и значение **API-ключа**, используемого для доступа к **OpenAI** в формате **Bearar OPENAI\_KEY**.

<figure><img src="/files/MpjJO0pAheRCsIRB4b70" alt=""><figcaption></figcaption></figure>

В теле запроса в **Body Parameters** мы пишем:

**Name:** `input`\
\
**Value:** `{{ $json.question }}`

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

**Name:** `model`

**Value:** `text-embedding-3-large`

<figure><img src="/files/0RHWETzQ3gN8PZO2hGbd" alt=""><figcaption></figcaption></figure>

#### **Embeddings**

<figure><img src="/files/zHuDOcpWaMrrjKiK2vu2" alt=""><figcaption></figcaption></figure>

#### **50 vectors**

В ноде **code** мы пишем код:

```json
const vectors = $input.all()

.map(i => i.json)

.map((vector,index) => {

return {

values: vector.data[0].embedding,

id: "Id-" + vector.Id.toString(),

metadata: {

question: vector.question,

answer: vector.answer

}

}

})

const mark_as_embedded = vectors.map(vector => ({Id: Number(vector.id.split('-')[1]), embedded: true}))

return [{vectors,mark_as_embedded}];
```

Данный код обрабатывает данные, полученные после создания эмбеддингов, и готовит их для загрузки в векторную базу **Pinecone**, а также для пометки в базе **NocoDB**, что эти строки уже были обработаны.

#### Upsert

Ранее мы создавали индекс в **Pinecone** и сохраняли ссылку. Ее мы вставляем в поле **URL** и дописываем в адресе **/vectors/upsert**, чтобы у нас получилось:

<mark style="color:red;">https\://\<cсылка\_на\_pinecone></mark>**/vectors/upsert**

Установим следующие параметры:

* **Method:** `POST`
* **URL:** <mark style="color:red;">https\://\<cсылка\_на\_pinecone></mark>**/vectors/upsert**
* **Authentication:** `Predefined`
* **Credential Type:** `PineconeApi`
* **PineconeApi:** Выбираем заранее сохранённый API-ключ **Pinecone** для авторизации.

<figure><img src="/files/RUo3wIL69nQhvWPY83Uc" alt=""><figcaption></figcaption></figure>

В **Header Parameters:**

**Name:** `accept`

**Value:** `application/json`<br>

<figure><img src="/files/F670yK553vFtiXw1qL7c" alt=""><figcaption></figcaption></figure>

В **Body Parameters**:

**Name:** `vectors`

**Value:** `{{ $json.vectors }}`

<figure><img src="/files/erxjPkm3g5Q9Acsi8Cyg" alt=""><figcaption></figcaption></figure>

#### Mark as Embedded

#### &#xD;В заключительном узле цепочки обновляем данные таблицы **NocoDB**. Для этого в **URL** указываем адрес базы **NocoDB** со следующей структурой:

https\://<mark style="color:red;"><Адрес\_nocodb></mark>/api/v2/tables/<mark style="color:red;"><айди\_таблицы></mark>/records.

**Выбираем следующие значения:**

* **Method:** `PATCH`
* **URL:** https\://<mark style="color:red;"><Адрес\_nocodb></mark>/api/v2/tables/<mark style="color:red;"><айди\_таблицы></mark>/records.
* **Authentication:** `Predefined Credential type`
* **Credential Type**: `NocoDB API Token`

<figure><img src="/files/yHWLhMS0Sv8SdozYCBFF" alt=""><figcaption></figcaption></figure>

* **NocoDB API Token:** (выбираем **Credential** нужной базы **NocoDB)**

В **Header Parameters** указываем:

**Name:** `accept`

**Value:** `application/json`

В **Body** пишем в поле **JSON**, меняя тип с **Fixed** на **Expression**:

```json
{{ JSON.stringify($('50 Vectors').first().json.mark_as_embedded) }}
```

<figure><img src="/files/guD1pF7cQV7PKowv1Dz8" alt=""><figcaption></figcaption></figure>

3. Сохраняем **Workflow** в **n8n**
4. Нажимаем на кнопочку запуска

   <figure><img src="/files/HZG8tRj3QqiKUxx9AI0M" alt=""><figcaption></figcaption></figure>
5. После запуска цепочки в таблице появятся галочки в колонке **embedded**. Это значит, что данные вопросы и ответы были загружены в векторную базу **Pinecone**

   <figure><img src="/files/rSaNxawOetf7WrUH5PRt" alt=""><figcaption></figcaption></figure>

## Настройка сценария в Smartbot

1. Заходим в личный кабинет **Smartbot** и переходим в раздел **"Сценарии"**.

   <figure><img src="/files/JDbn2r14Y3kpseXNDdfV" alt=""><figcaption></figcaption></figure>
2. Нажимаем на кнопку **"Создать сценарий"**

   <figure><img src="/files/ukZVs1dszXIuiXZW4bcf" alt=""><figcaption></figcaption></figure>
3. В открывшемся окошке пишем название сценария, затем нажимаем **"Создать"**

   <figure><img src="/files/LBkvYQuT9lYISvy1EdeM" alt=""><figcaption></figcaption></figure>
4. **Рассмотрим схематически, как должен выглядеть сценарий, и разберем каждый блок по отдельности:**

   <figure><img src="/files/V30VEUlwyxULmN9RBUHs" alt=""><figcaption></figcaption></figure>

**Наш сценарий будет состоять из 7 блоков:**

1. Нет подходящего сценария
2. Выполнить SmartQuery
3. Выполнить SmartQuery
4. Отправить HTTP-запрос
5. Webhook
6. Выполнить SmartQuery
7. Отправить сообщение

#### **Блок 1: Нет подходящего сценария**

Реагирует на любое сообщение пользователя в боте. Он запускает всю цепочку сценария.

<figure><img src="/files/fIdihjkpwoDzMUP0hTJs" alt=""><figcaption></figcaption></figure>

#### **Блок 2: Выполнить SmartQuery**

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

<figure><img src="/files/H36J8wF7t3mhObu1xUzq" alt=""><figcaption></figcaption></figure>

#### **Блок 3: Выполнить SmartQuery**

В данном блоке мы подготавливаем данные, создаем URL и тело запроса.

<figure><img src="/files/jLPq3WXkGgkZmdrJkF0w" alt=""><figcaption></figcaption></figure>

```
%string_temp% = %n8n_url% + "/webhook/test_new_request"

%body% = {
    "question": %message_text%,
    "user_id": %user_id%
}

%response_data% = {}
%response_data_status% = 0
```

**Используемые переменные:**

`%string_temp%` — (тип: строка) итоговый **URL**.

`%body%` — (тип: словарь) передаём вопрос и **ID** пользователя.

`%n8n_url%` — (тип: строка) переменная со ссылкой на ваш сервер **n8n**.

**!Важно:** **URL** должен совпадать с **URL** вызова вебхука в **n8n.**

#### **Блок 4: Отправить HTTP-запрос**

![](/files/1343e4a55b154a36cbc9f3c7c4841db00204c8dc)

Устанавливаем следующие параметры:

* **Метод:** `POST`
* **URL:** `%string_temp%`
* **Тип тела:** `Текст`
* **Значение тела:** `{{ %body% | to_json }}`

<figure><img src="/files/GpiFIz78YEZKDeOTdLr4" alt=""><figcaption></figcaption></figure>

**В заголовках:**

* **Наименование:** content-type
* **Значение:** `application/json`

#### **Блок 5: Webhook**

Через этот блок мы получаем ответ из **n8n.** Чтобы он работал, мы должны создать **API-токен,** либо выбрать уже существующий.

<figure><img src="/files/VRFVUPy1VHu8xXBPCrEv" alt=""><figcaption></figcaption></figure>

В **API-токены** выбираем **"Создать токен".**

<figure><img src="/files/YljpsVI3HGRJZ8q2js9D" alt=""><figcaption></figcaption></figure>

В открывшемся окошке нажимаем на кнопку **"Cоздать токен".**

<figure><img src="/files/gcXvvIar1jcJ6eIaiLll" alt=""><figcaption></figcaption></figure>

Придумываем название и создаем токен.

<figure><img src="/files/K0jPWQgpwc3jUUu26txz" alt=""><figcaption></figcaption></figure>

Выбираем созданный токен и канал.

<figure><img src="/files/Iw0diwSz1pkh4z0nk6af" alt=""><figcaption></figcaption></figure>

Данные из **Webhook** нам понадобятся в дальнейшей настройке **Workflow** в **n8n.**

#### **Блок 6: Выполнить SmartQuery**

Извлекаем текст ответа из **Webhook** и сохраняем его в переменную `%bot_message%`.

```json
%bot_message% = %public_api_data%['answer']
```

<figure><img src="/files/jkXkjoLI3IX4SQ1zpFlR" alt=""><figcaption></figcaption></figure>

#### **Блок 7: Отправить сообщение**

Выводим значение переменной `%bot_message%`в блоке **"Отправить сообщение"**.

<figure><img src="/files/ACBy9XP144LYVTJgAbeE" alt=""><figcaption></figcaption></figure>

## **Отправка ответа из Pinecone в Smartbot** <a href="#otpravka-otveta-iz-pinecone-v-smartbot" id="otpravka-otveta-iz-pinecone-v-smartbot"></a>

В данной части инструкции мы по шагам разберём, **как настроить рабочий процесс в n8n**, который будет:

* принимать запрос от пользователя через **Smartbot**
* искать наиболее подходящий ответ через **Pinecone** (векторную БД)
* отправлять его обратно пользователю

**Создаём Workflow в n8n**

1. Открываем **n8n**. Создаем новый **workflow**.
2. Наша логика будет выглядеть следующим образом:

   <figure><img src="/files/4djgebADeGCU8Q0ruMm3" alt=""><figcaption></figcaption></figure>

**Краткое описание узлов цепочки:**

**Webhook** — принимает запрос от Smartbot (вопрос пользователя).

**Get vectorized** — отправляет вопрос в OpenAi для получения вектора.

**Get the nearest reply** — ищет наиболее близкие к вопросу вектора (совпадения) в Pinecone.

**if** — проверяет, нашлось ли совпадение.

**Code (успех)** — формирует тело ответа из Pinecone.

**HTTP Request (успех)** — отправляет ответ пользователю в Smartbot.

**Code (неудача)** — формирует тело ответа в случае отсутствия совпадения.

**HTTP Request (неудача)** — отправляет ответ в Smartbot.<br>

### Рассмотрим параметры каждого узла более детально:

#### Webhook

Данный узел запускает весь **workflow**. Через него мы принимаем данные из **Смартбота**, а именно, вопрос пользователя и его **ID**.

<figure><img src="/files/SwfGxt0SFAef6UiTTBSB" alt=""><figcaption></figcaption></figure>

**Параметры узла:**

* **Method:** `POST`
* **Path:** (часть **URL**, по которой по которой вызывается этот **Webhook**)
* **Respond:** `Immediately`

**!Важный момент:** **Path** должен быть идентичен тому, который мы указывали в **Смартботе** ранее.

<figure><img src="/files/74LWBtDvytAYQ5Cfurqn" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/fnls07nIwkCjWtvss8qY" alt=""><figcaption></figcaption></figure>

#### **Get vectorized**

Отправляет вопрос в OpenAI и получает его векторное представление.

**Параметры узла:**

* **Method**: `POST`
* **URL**: `https://api.openai.com/v1/embeddings`
* **Authentication**: `Predefined Credential Type`
* **Credential Type**: `OpenAi`
* **OpenAi:** (Выбираем нужный Credential OpenAi)
* **Model**: `text-embedding-3-large`

<figure><img src="/files/7bi5K5svPmPAmkNiZG5h" alt=""><figcaption></figcaption></figure>

В **Body Parameters:**

**Name:** `input`

**Value:** `{{ $json.question }}`

Передаем вопрос и данные модели ИИ.

**Name:** `model`

**Value:** `text-embedding-3-large`

<figure><img src="/files/0QmAh6a8OkkfY6pvDQhQ" alt=""><figcaption></figcaption></figure>

#### **Get the nearest reply**

Формируем запрос в векторную базу **Pinecone**, для поиска совпадений вектора вопроса с векторами из базы данных. Для этого заполняем следующие параметры:

* **Method:** `POST`
* **URL:** [https://наpinecone>/query](https://docs.ncteam.io/ai/https:/наpinecone>/query)
* **Authentication:** `Predefined`
* **Credential Type:** `PineconeApi`
* **PineconeApi:** Выбираем заранее сохранённый API-ключ **Pinecone** для авторизации.

<figure><img src="/files/cFPY6TMcSM0MAiifKsZB" alt=""><figcaption></figcaption></figure>

#### **Header Parameters:**

**Name:** `accept`

**Value:** `application/json`

**Body Parameters:**

**Name:** `vector`

**Value:** `{{ $json.data[0].embedding }}`

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

**Name:** `topK`

**Value:** `10`

Указываем, сколько **самых близких векторов** (записей) мы хотим получить в ответ. В нашем случае - 10.

**Name:** `includeMetadata`

**Value:** `{{ true }}`

Указываем, что хотим получить из вектора **Pinecone** метаданные о вопросе и ответе.

#### **If**

**Проверяем, были ли найдены совпадения:**

```json
{{ $('Get the nearest reply').first().json.matches }}
```

**=** is not empty

#### **Code**

Создаем **тело (body)** для отправки данных в **Smartbot**.

```json
var data = {
  "answer": $('Get the nearest reply').first().json.matches[0].metadata.answer,//.replaceAll('"', '\"').replaceAll('\n', '\\n'),
  "score": $('Get the nearest reply').item.json.matches[0].score
}

/*Создаем переменную data, чтобы передать: ответ, найденный через Pinecone (answer) и оценку совпадения (score)
*/

var body = {
  "access_token": "d_RzF82z4TXML5_ZnMcrdJS2Y_K8kQNZNzkJZ-ORgI24v1STJEt55EgFXGEaILR6",
  "v": "0.0.1",
  "channel_id": "7779600502",
  "block_id": "6808dbe10aa22020da97a62f",
  "peer_id": $('Webhook').first().json.body.user_id,
  "data": data
}

return {
  body
}
```

В тело запроса добавляем тело вебхука из **Смартбота**:

<figure><img src="/files/nfwptUSK9euiy9AW1elu" alt=""><figcaption></figcaption></figure>

#### **HTTP Request:**

Устанавливаем параметры для отправки подобранного ответа в **Smartbot**:

* **Method:** `POST`
* **URL:** `https://api.smartbotpro.ru/blocks/execute`
* **Authentication:** `None`
* **Body Content Type**: `JSON`
* **Body Parameters:**`{{ JSON.stringify($json.body) }}`

<figure><img src="/files/VKPbYyfSGxVTAEbtPerp" alt=""><figcaption></figcaption></figure>

#### **Code1 (совпадений не найдено)**

Отправляем ответ в случае отсутcтвия совпадений по векторам.

```json
var data = {
  "answer": 'Ответ не найден',
  "score": 0.00
}

var body = {
   "access_token": "d_RzF82z4TXML5_ZnMcrdJS2Y_K8kQNZNzkJZ-ORgI24v1STJEt55EgFXGEaILR6",
    "v": "0.0.1",
    "channel_id": "7779600502",
    "block_id": "6808dbe10aa22020da97a62f",
    "peer_id": $('Webhook').first().json.body.user_id,
    "data": data
}

return {
  body
}
```

<figure><img src="/files/lTzqfU6mcRUigYzaoKes" alt=""><figcaption></figcaption></figure>

#### **HTTP Request1 (совпадений не найдено)**

Устанавливаем параметры для отправки ответа в **Smartbot**:

* **Method:** `POST`
* **URL:** `https://api.smartbotpro.ru/blocks/execute`
* **Authentication:** `None`
* **Body Content Type**: `JSON`
* **Body Parameters:**`{{ JSON.stringify($json.body) }}`

<figure><img src="/files/omAgZXKBEGLhn9BPWCo6" alt=""><figcaption></figcaption></figure>
