برنامه نویسی

جستجوی معنایی با Xata، OpenAI، TypeScript و Deno

در همان زمان ما یکپارچه سازی ChatGPT خود را راه اندازی کردیم، همچنین یک نوع برداری جدید به Xata اضافه کردیم که ذخیره سازی جاسازی ها را آسان می کند. علاوه بر این، ما یک جدید اضافه کرده ایم vectorSearch نقطه پایانی، که جستجوی شباهت را در جاسازی ها انجام می دهد.

بیایید یک تور سریع داشته باشیم تا ببینیم چگونه می توانید از این قابلیت های جدید برای پیاده سازی جستجوی معنایی استفاده کنید. ما از OpenAI embeddings API، TypeScript و Deno استفاده خواهیم کرد. این آموزش شامل دانش قبلی از TypeScript است، اما هیچ دانش قبلی در مورد Xata، Deno یا OpenAI وجود ندارد.

جستجوی معنایی چیست؟

به جای تطبیق کلمات کلیدی، همانطور که موتورهای جستجوی سنتی انجام می دهند، جستجوی معنایی تلاش می کند تا زمینه و هدف پرس و جو و روابط بین کلمات استفاده شده در آن را درک کند.

برای مثال، فرض کنید جملات نمونه زیر را دارید:

  • “روباه قهوه ای سریع از روی داستان سگ تنبل می پرد”
  • برخورد خودرو با درخت
  • “گربه به سمت سگ غر زد”
  • “یادگیری حقیقت مهم است، سیستم آموزشی آن را دنبال خواهد کرد.”
  • “غروب خورشید آسمان را با رنگ های زنده رنگ آمیزی کرد”

اگر «متن نمونه به زبان لاتین» را جستجو کنید، جستجوی کلیدواژه سنتی با متن «lorem ipsum» مطابقت ندارد، اما جستجوی معنایی مطابقت خواهد داشت (و ما در این مقاله قصد داریم آن را به نمایش بگذاریم).

به همین ترتیب، اگر «گربه به توله سگ هق هق زد» را جستجو کنید، جستجوی معنایی متوجه می‌شود که این عبارت همان معنای «گربه به سمت سگ غرغر کرد» است، حتی اگر از هیچ یک از کلمات مشابه استفاده نکنند. یا، برای مثال دیگر، «آسمان وانیلی» باید جمله «غروب خورشید، آسمان را با رنگ‌های پر جنب و جوش نقاشی کرد» را بیاورد. خیلی باحاله، درسته؟ این اکنون به لطف مدل های زبان بزرگ و جستجوی برداری کاملاً امکان پذیر است.

مقدمه ای سریع برای تعبیه ها

از نقطه نظر داده، جاسازی ها به سادگی آرایه هایی از شناورها هستند. آنها خروجی مدل های ML هستند که ورودی می تواند یک کلمه، یک جمله، یک پاراگراف متن، یک تصویر، یک فایل صوتی، یک فایل ویدئویی و غیره باشد.

نمودار جاسازی ها

هر عدد در آرایه شناورها نشان دهنده متن ورودی در یک بعد خاص است که بستگی به مدل دارد. این بدان معناست که هرچه جاسازی‌ها شبیه‌تر باشند، اشیاء ورودی «شبیه‌تر» هستند. من “مشابه” را در نقل قول قرار داده ام زیرا بستگی به مدل دارد که چه نوع مشابهی دارد. وقتی صحبت از متن می شود، معمولاً در مورد «معنای مشابه» است، حتی اگر از کلمات، عبارات یا زبان های مختلف استفاده شود.

کاهش داده‌های پیچیده به آرایه‌ای از اعداد که کیفیت‌های آن را نشان می‌دهند، برای تعدادی از موارد استفاده بسیار مفید است. به جستجوی عکس معکوس، الگوریتم های توصیه برای ویدیو و موسیقی، توصیه های محصول، دسته بندی محصولات و غیره فکر کنید.

نوع وکتور در Xata

اگر می خواهید ادامه دهید، با مراحل شروع کنید:

  • در اینجا ثبت نام کنید یا وارد Xata شوید (استفاده از این آموزش به خوبی در ردیف رایگان قرار می گیرد، بنابراین نیازی به تنظیم صورتحساب ندارید)
  • یک پایگاه داده به نام ایجاد کنید vectors
  • جدولی به نام ایجاد کنید Sentences
  • دو ستون اضافه کنید:
    • sentence از نوع رشته
    • embedding از نوع بردار از 1536 به عنوان بعد استفاده کنید

اضافه کردن اسکرین شات نوع برداری

وقتی کارتان تمام شد، طرحواره باید به شکل زیر باشد:

مشاهده اسکرین شات طرحواره

پروژه Xata را راه اندازی کنید

برای آماده شدن برای اجرای کد تایپ اسکریپت، Xata CLI را نصب کنید:

npm install -g @xata.io/cli@latest

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اجرا کن xata auth login برای احراز هویت CLI با این کار یک پنجره مرورگر باز می شود و از شما می خواهد یک کلید API جدید ایجاد کنید. هر اسمی که دوست دارید بذارید

xata auth login

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یک پوشه برای کد ایجاد کنید:

mkdir sentences
cd sentences

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و اجرا xata init برای اتصال آن به Xata DB:

xata init

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Xata CLI از شما می خواهد که پایگاه داده را انتخاب کنید و سپس از شما می پرسد که چگونه انواع را تولید کنید. انتخاب کنید کد TypeScript را با واردات Deno ایجاد کنید. برای بقیه سوالات از تنظیمات پیش فرض استفاده کنید.

اسکرین شات Xata init

OpenAI و Deno را آماده کنید

یک حساب OpenAI ایجاد کنید و یک کلید ایجاد کنید. توجه داشته باشید که برای اجرای این نمونه ها باید صورتحساب OpenAI را تنظیم کنید، اما هزینه آن ناچیز خواهد بود (زیر 1 دلار).

کلید OpenAI را به .env فایلی که توسط xata init دستور بالا شما .env باید چیزی شبیه به این باشد:

# API key used by the CLI and the SDK
# Make sure your framework/tooling loads this file on startup to have it available for the SDK
XATA_API_KEY=xau_<redacted>
OPENAI_API_KEY=sk-<redacted>

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Deno CLI را نصب کنید. این صفحه را برای گزینه های نصب مختلف ببینید، در macOs با Homebrew این است:

brew install deno

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بارگذاری داده ها

اکنون زمان نوشتن کمی کد TypeScript است. ایجاد یک loadWithEmbeddings.ts فایل سطح بالای پروژه خود با محتویات زیر:

import { Configuration, OpenAIApi } from "npm:openai";
import { getXataClient } from "./src/xata.ts";
import { config as dotenvConfig } from "<https://deno.land/x/dotenv@v1.0.1/mod.ts>";

dotenvConfig({ export: true });

const openAIConfig = new Configuration({
  apiKey: Deno.env.get("OPENAI_API_KEY"),
});
const openAI = new OpenAIApi(openAIConfig);
const xata = getXataClient();

const sentences: string[] = [
  "The quick brown fox jumps over the lazy dog story",
  "The vehicle collided with the tree",
  "The cat growled towards the dog",
  "Lorem ipsum dolor sit amet, consectetur adipiscing elit",
  "The sunset painted the sky with vibrant colors",
];

for (const sentence of sentences) {
  const resp = await openAI.createEmbedding({
    input: sentence,
    model: "text-embedding-ada-002",
  });
  const [{ embedding }] = resp.data.data;

  xata.db.Sentences.create({
    sentence,
    embedding,
  });
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

گام به گام، این کاری است که اسکریپت انجام می دهد:

  • استفاده می کند dotenv برای بارگیری .env در محیط فعلی فایل کنید. این مطمئن می شود که XATA_API_KEY و OPENAI_API_KEY برای بقیه اسکریپت موجود است.
  • کتابخانه های مشتری OpenAI و Xata را راه اندازی می کند.
  • داده های تست را در sentences آرایه.
  • برای هر sentence ، OpenAI embeddings API را فراخوانی می کند تا تعبیه آن را دریافت کند.
  • یک رکورد حاوی جمله و جاسازی را در Xata درج می کند.

اسکریپت را به این صورت اجرا کنید:

deno run --allow-net --allow-env --allow-read --allow-run ./loadWithEmbeddings.ts

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر اکنون از رابط کاربری Xata بازدید می کنید، باید داده ها را به همراه جاسازی ها بارگذاری کنید.

مشاهده اسکرین شات داده ها

عبارت های جستجو را اجرا کنید

بیایید یک اسکریپت ساده دیگر بنویسیم که جستجو را بر اساس پرس و جوی ورودی انجام می دهد. این اسکریپت را نام ببرید search.ts.

import { Configuration, OpenAIApi } from "npm:openai";
import { getXataClient } from "./src/xata.ts";
import { config as dotenvConfig } from "<https://deno.land/x/dotenv@v1.0.1/mod.ts>";

dotenvConfig({ export: true });

const openAIConfig = new Configuration({
  apiKey: Deno.env.get("OPENAI_API_KEY"),
});
const openAI = new OpenAIApi(openAIConfig);
const xata = getXataClient();

if (Deno.args.length !== 1) {
  console.log("Please provide a search query");
  console.log(
    "Example: deno run --allow-net --allow-env search.ts 'the quick brown fox'"
  );
  Deno.exit(1);
}

const query = Deno.args[0];
const resp = await openAI.createEmbedding({
  input: query,
  model: "text-embedding-ada-002",
});
const [{ embedding }] = resp.data.data;

const results = await xata.db.Sentences.vectorSearch("embedding", embedding);

for (const result of results) {
  console.log(result.getMetadata().score, "|", result.sentence);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این چیزی است که در فیلمنامه می گذرد:

  • شروع شبیه به اسکریپت قبلی است، با استفاده از dotenv برای بارگیری .env فایل و سپس کتابخانه های کلاینت را برای OpenAI و Xata مقداردهی کنید
  • پرس و جو را به عنوان اولین آرگومان ارسال شده به اسکریپت بخوانید
  • از OpenAI embeddings API برای ایجاد جاسازی برای پرس و جو استفاده کنید
  • با استفاده از Xata Vector Search API یک جستجوی برداری را اجرا کنید. این بردارهایی را پیدا می کند که شبیه به جاسازی ارائه شده هستند
  • نتایج را همراه با امتیاز شباهت چاپ کنید

برای اجرای اسکریپت آن را به صورت زیر اجرا کنید:

$ deno run --allow-net --allow-env --allow-read --allow-run \\
  ./search.ts 'sample text in latin'

1.8154079 | Lorem ipsum dolor sit amet, consectetur adipiscing elit
1.7424928 | The quick brown fox jumps over the lazy dog story
1.7360129 | The cat growled towards the dog
1.7311659 | The sunset painted the sky with vibrant colors
1.7038174 | The vehicle collided with the tree

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که می بینید، جستجوی “متن نمونه به زبان لاتین” به متن “Lorem ipsum” منجر می شود که امیدوار بودیم. شما همچنین می توانید برخی از تغییرات را امتحان کنید، به عنوان مثال، “جمله نمونه” همچنان “Lorem ipsum” را به عنوان بهترین نتیجه می آورد:

$ deno run --allow-net --allow-env --allow-read --allow-run \\
  ./search.ts 'sample sentence'

1.805396 | Lorem ipsum dolor sit amet, consectetur adipiscing elit
1.7715557 | The quick brown fox jumps over the lazy dog story
1.7608802 | The sunset painted the sky with vibrant colors
1.7573793 | The cat growled towards the dog
1.7493906 | The vehicle collided with the tree

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نمرات سمت چپ اعدادی بین 0 و 2 هستند که نشان می دهد هر جمله چقدر به پرس و جو ارائه شده نزدیک است. اگر با جمله ای اجرا کنید که در داده ها خارج می شود، نمره بسیار نزدیک به 2 می گیرید:

$ deno run --allow-net --allow-env --allow-read --allow-run \\
  ./search.ts 'The quick brown fox jumps over the lazy dog story'

1.9999993 | The quick brown fox jumps over the lazy dog story
1.8063612 | The cat growled towards the dog
1.769694 | Lorem ipsum dolor sit amet, consectetur adipiscing elit
1.7673006 | The vehicle collided with the tree
1.7605586 | The sunset painted the sky with vibrant colors

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا بیایید پرس و جو “آسمان وانیلی” را امتحان کنیم:

$ deno run --allow-net --allow-env --allow-read --allow-run \\
  ./search.ts 'vanilla sky'

1.8137007 | The sunset painted the sky with vibrant colors
1.7584264 | Lorem ipsum dolor sit amet, consectetur adipiscing elit
1.7579571 | The quick brown fox jumps over the lazy dog story
1.7505519 | The vehicle collided with the tree
1.738231 | The cat growled towards the dog

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یکنوع بازی شبیه لوتو، نتیجه برتر با آنچه ما انتظار داشتیم مطابقت دارد.

یکی دیگر برای امتحان:

$ deno run --allow-net --allow-env --allow-read --allow-run \\
  ./search.ts 'The car crashed into the oak.'

1.907266 | The vehicle collided with the tree
1.7763984 | The cat growled towards the dog
1.7755028 | The quick brown fox jumps over the lazy dog story
1.7745116 | The sunset painted the sky with vibrant colors
1.7570261 | Lorem ipsum dolor sit amet, consectetur adipiscing elit

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

باز هم جمله ای با همان معنی با امتیاز نزدیک به 2 در بالای صفحه نمایش داده می شود.

نتیجه

مدل‌های زبان بزرگ ابزار قدرتمندی هستند که موارد استفاده جدیدی را باز می‌کنند. جستجوی معنایی یکی از این موارد استفاده است و ما دیدیم که چگونه می توان از جستجوی برداری Xata برای پیاده سازی آن استفاده کرد. همچنین می‌توانید از آن برای ساخت موتورهای توصیه، یا یافتن ورودی‌های مشابه در یک پایگاه دانش یا سؤالات در وب‌سایت پرسش و پاسخ استفاده کنید.

اگر این آموزش را اجرا می کنید، لطفاً در Xata Discord به ما بپیوندید و به ما اطلاع دهید که در حال ساخت چه چیزی هستید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا