نحوه انجام جستجوی معنایی با استفاده از ChromaDB در جاوا اسکریپت

این آموزش نحوه استفاده از embedding ها و بردارها برای انجام جستجوی معنایی با استفاده از ChromaDB در جاوا اسکریپت را پوشش می دهد.
Embedding ها چیست؟
آیا تا به حال فکر کرده اید که چگونه سیستم های توصیه ای مانند نتفلیکس تقریباً همیشه می دانند که چه فیلم هایی را دوست دارید؟ وقتی وارد نتفلیکس میشوید، این برنامه توصیههایی را ارائه میکند که احتمالاً با سلیقه و ترجیحات شما مطابقت دارد؛ جاسازیها مکانیزم پشت آن را تقویت میکنند.
تعبیهها به تبدیل کلمات، متن یا صدا به بردارهای عددی اشاره دارد. یک بردار عددی در اصل آرایه ای از اعداد است. این تبدیل معنای کلمات را حفظ می کند و همچنین ارتباط آنها را با کلمات دیگر در فضای برداری نشان می دهد.
فضای برداری چیست
فضای برداری یک فضای ریاضی است که در آن بردارها داده ها را نشان می دهند. به عنوان مثال، کلمات “گربه” و “گربه” را در نظر بگیرید. هنگامی که این کلمات به عنوان بردار در یک فضای برداری نشان داده می شوند، بردارها رابطه معنایی آنها را به تصویر می کشند، بنابراین نگاشت آنها را در فضا تسهیل می کنند.
فاصله بین بردارهای “گربه” و “گربه” ارتباط آنها را اندازه گیری می کند. از آنجایی که “گربه” و “گربه” به یکدیگر نزدیک هستند، فاصله بین آنها کم است. فاصله های بیشتر بین بردارها نشان می دهد که کلمات یا متون ارتباط نزدیکی با هم ندارند.
این به این معنی است که وقتی برای “گربه” جستجو می کنید، سیستم می تواند شباهت را تشخیص دهد و محتوای مربوط به گربه و بچه گربه را پیشنهاد کند.
این فناوری قدرتمند چیزی است که به پلتفرمهایی مانند Netflix و Spotify اجازه میدهد تا توصیههای شخصی و دقیقی را به شما ارائه دهند و تجربه مشاهده و شنیدن شما را افزایش دهند.
نحوه ایجاد Embedding با OpenAI
OpenAI یک مدل جاسازی ارائه می دهد که ارتباط متن را اندازه گیری می کند. برای جاسازی کلمات “cat” و “kitten” خود، باید هر رشته را به همراه نام مدل به نقطه پایانی OpenAI embeddings API ارسال کنیم.
ابتدا OpenAI API_KEY خود را تعریف کنید
const OPENAI_API_KEY ="your_openai_api_key";
تابعی ایجاد کنید که یک عبارت یا کلمه را به عنوان آرگومان می گیرد، آن را به OpenAI embeddings API ارسال می کند و تعبیه را پس می دهد.
async function createEmbeddings(word) {
const url = " https://api.openai.com/v1/embeddings";
const headers = {
"Content-Type": "application/json",
Authorization: `Bearer ${OPENAI_API_KEY}`,
};
const data = {
input: word,
model: "text-embedding-3-small",
};
const response = await fetch(url, {
method:'POST',
headers: headers,
body: JSON.stringify(data),
});
const embedding = await response.json();
console.log(embedding.data)
}
حالا بیایید تابع را با کلمات گربه و بچه گربه فراخوانی کنیم
createEmbeddings("cat");
createEmbeddings("kitten");
خروجی به شکل زیر خواهد بود:
[
{
object: 'embedding',
index: 0,
embedding: [
0.02552942, -0.023411665, -0.016092611, 0.03937628, 0.02094483,
-0.02632067, 0.0018908527, 0.030602723, -0.015929706, 0.0053118416,
0.02214334, -0.0002121755, 0.010460779, 0.0031213614, 0.02985802,
0.006265995, -0.021363726, -0.010716772, -0.030532908, 0.057528466,
0.03409353, 0.04589245, 0.020502662, -0.046637155, -0.006871068,
0.03800323, -0.009268087, 0.04405396, 0.051803548, -0.013497779,
0.0033686268, -0.043123078, -0.0112753, -0.029090041, -0.022946225,
0.017768197, 0.017570386, -0.028019529, -0.015743531, 0.01378868,
-0.037281796, -0.008773557, 0.045799363, 0.011473113, 0.009460081,
-0.0533395, -0.022597145, -0.019606689, 0.019362332, 0.037142165,
0.023388393, -0.014870829, 0.01746566, 0.04998833, -0.004168603,
-0.0011636016, -0.019292515, 0.04659061, -0.0029279126, 0.009279723,
-0.024970891, 0.0059925485, 0.02518034, -0.002679193, 0.019420512,
0.038282495, 0.01837327, 0.017232941, -0.05962295, -0.018210366,
-0.0058034635, 0.028415153, -0.062089786, 0.011286936, 0.047218956,
0.009401902, -0.029974379, -0.000250538, 0.062974125, 0.043425616,
0.0011352389, 0.058552437, 0.016243879, -0.025226884, 0.01259017,
-0.023202218, -0.034512427, 0.02850824, 0.011054216, -0.026041405,
-0.0038457036, 0.015487539, -0.044798665, -0.038980655, -0.010332783,
0.043774694, -0.008517564, -0.048219655, -0.001969396, 0.014149397,
... 1436 more items
]
}
]
پایگاه داده برداری چیست؟
همانطور که از نام آن پیداست، پایگاه داده برداری، پایگاهی است که می تواند بردارها را ذخیره کند. برخلاف پایگاههای داده سنتی که از کلیدهای اولیه و کلیدهای خارجی هنگام جستوجوی دادهها استفاده میکنند، دادهها در پایگاههای داده برداری به شکل بردارهایی با ابعاد بالا هستند. هنگام پرس و جو، پایگاه های داده برداری از نزدیکی ریاضی برای یافتن موارد مشابه استفاده می کنند.
نحوه راه اندازی یک پایگاه داده برداری با ChromaDB و Docker
پایگاه داده های برداری برای ساخت برنامه های پیچیده هوش مصنوعی ایده آل هستند. ChromadB یک پایگاه داده برداری منبع باز است که برای شروع به حداقل پیکربندی نیاز دارد.
برای شروع، باید Docker را نصب کرده باشید. مراحل زیر را برای اجرای آن بر روی دستگاه خود دنبال کنید:
تصویر داکر ChromaDB را از مخزن داکر هاب بیرون بکشید.
docker pull chromadb/chromadb
کانتینر chromaDB را اجرا کنید و پورت ها را مشخص کنید
docker run -d -p 8080:8080 --name chromadb chromadb/chromadb
برای تأیید اینکه کانتینر در حال اجرا است، این دستور را صادر کنید
docker ps
باید کانتینر ChromaDB را از لیست کانتینرهای در حال اجرا خود ببینید.
افزودن داده به VectorStore
برای اطمینان از دقیق بودن معنای معنایی دادهها، دادهها باید در تکههای کوچک باشند، ما با اضافه کردن موارد در آرایهای شروع میکنیم که برخی از فیلمها را توصیف میکنند که شبیه این هستند:
const movies = [
'"Title":"Due Date","Year":"2010","Rated":"R","Released":"05 Nov 2010","Runtime":"95 min","Genre":"Comedy, Drama","Actors":"Robert Downey Jr., Zach Galifianakis, Michelle Monaghan","Plot":"High-strung father-to-be Peter Highman is forced to hitch a ride with aspiring actor Ethan Tremblay on a road trip in order to make it to his child\'s birth on time."',
'"Title":"Easy A","Year":"2010","Rated":"PG-13","Released":"17 Sep 2010","Runtime":"92 min","Genre":"Comedy, Drama, Romance","Actors":"Emma Stone, Amanda Bynes, Penn Badgley","Plot":"When Olive lies to her best friend about losing her virginity to one of the college boys, a girl overhears their conversation. Soon, her story spreads across the entire school like wildfire."',
'"Title":"Unstoppable","Year":"2010","Rated":"PG-13","Released":"12 Nov 2010","Runtime":"98 min","Genre":"Action, Thriller","Actors":"Denzel Washington, Chris Pine, Rosario Dawson","Plot":"With an unmanned, half-mile-long freight train barreling toward a city, a veteran engineer and a young conductor race against the clock to prevent a catastrophe."',
'"Title":"Despicable Me","Year":"2010","Rated":"PG","Runtime":"95 min","Genre":"Animation, Adventure, Comedy","Actors":"Steve Carell, Jason Segel, Russell Brand","Plot":"Gru, a criminal mastermind, adopts three orphans as pawns to carry out the biggest heist in history. His life takes an unexpected turn when the little girls see the evildoer as their potential father."',
'"Title":"Don Henley: Live Inside Job","Year":"2000","Rated":"N/A","Runtime":"105 min","Genre":"Documentary, Music","Actors":"Don Henley, Jonathan K. Bendis, Will Hollis","Plot":"Don Henley performs his greatest hits live in Dallas."',
'"Title":"Harry Potter and the Deathly Hallows: Part 1","Year":"2010","Rated":"PG-13","Runtime":"146 min","Genre":"Adventure, Family, Fantasy","Actors":"Daniel Radcliffe, Emma Watson, Rupert Grint","Plot":"As Harry, Ron and Hermione race against time and evil to destroy the Horcruxes, they uncover the existence of the three most powerful objects in the wizarding world: the Deathly Hallows."',
'"Title":"Tangled","Year":"2010","Rated":"PG",,"Runtime":"100 min","Genre":"Animation, Adventure, Comedy","Actors":"Mandy Moore, Zachary Levi, Donna Murphy","Plot":"The magically long-haired Rapunzel has spent her entire life in a tower, but now that a runaway thief has stumbled upon her, she is about to discover the world for the first time, and who she really is."',
'"Title":"Black Swan","Year":"2010","Rated":"R",,"Runtime":"108 min","Genre":"Drama, Thriller","Actors":"Natalie Portman, Mila Kunis, Vincent Cassel","Plot":"Nina is a talented but unstable ballerina on the verge of stardom. Pushed to the breaking point by her artistic director and a seductive rival, Nina\'s grip on reality slips, plunging her into a waking nightmare."',
'"Title":"The Social Network","Year":"2010","Rated":"PG-13","Released":"01 Oct 2010","Runtime":"120 min","Genre":"Biography, Drama","Actors":"Jesse Eisenberg, Andrew Garfield, Justin Timberlake","Plot":"As Harvard student Mark Zuckerberg creates the social networking site that would become known as Facebook, he is sued by the twins who claimed he stole their idea and by the co-founder who was later squeezed out of the business."',
'"Title":"Toy Story 3","Year":"2010","Rated":"G","Runtime":"103 min","Genre":"Animation, Adventure, Comedy","Actors":"Tom Hanks, Tim Allen, Joan Cusack","Plot":"The toys are mistakenly delivered to a day-care center instead of the attic right before Andy leaves for college, and it\'s up to Woody to convince the other toys that they weren\'t abandoned and to return home."',
'"Title":"A Clockwork Orange","Year":"1971","Rated":"R","Runtime":"136 min","Genre":"Crime, Sci-Fi","Actors":"Malcolm McDowell, Patrick Magee, Michael Bates","Plot":"In the future, a sadistic gang leader is imprisoned and volunteers for a conduct-aversion experiment, but it doesn\'t go as planned."',
'"Title":"Inception","Year":"2010","Rated":"PG-13",,"Runtime":"148 min","Genre":"Action, Adventure, Sci-Fi","Actors":"Leonardo DiCaprio, Joseph Gordon-Levitt, Elliot Page","Plot":"A thief who steals corporate secrets through the use of dream-sharing technology is given the inverse task of planting an idea into the mind of a C.E.O., but his tragic past may doom the project."'
];
ChromaClient را وارد کنید.
import { ChromaClient } from "chromadb";
یک کلاینت chromaDB را که به سرور ChromaDBb متصل می شود، نمونه سازی کنید.
const client = ChromaClient();
یک مجموعه ایجاد کنید.
مجموعه راهی برای سازماندهی بردارها است. مجموعه ما تمام جزئیات و ویژگی های فیلم ها را در آرایه فیلم ها ذخیره می کند. هر بردار دارای ویژگی های زیر خواهد بود:
- شناسه،
- ابرداده،
- جزئیات فیلم،
- و تعبیه ها
Chroma با OpenAI’s Embeddings یکپارچه شده است که به آن اجازه می دهد از قابلیت های OpenAI Embedding استفاده کند.
کلاس OpenAIEmbeddingFunction را از chromadb وارد کنید و یک کلاس OpenAIEmbeddingFunction را نمونه سازی کنید، با OpenAI احراز هویت کنید و عملکرد جاسازی خود را در ایجاد یک مجموعه ارائه دهید.
import { ChromaClient,OpenAIEmbeddingFunction } from "chromadb";
const embeddingFunction = new OpenAIEmbeddingFunction({
openai_api_key: OPENAI_API_KEY,
});
مجموعه ای به نام movies ایجاد کنید و تابع embedding را مشخص کنید.
const collection = await client.createCollection({
نام: “فیلم”،
embeddingFunction: embeddingFunction
})؛
عملکرد جاسازی تضمین می کند که Chroma هر فیلم جداگانه را به یک آرایه چند بعدی (جاسازی ها) تبدیل می کند. این تضمین می کند که معنای معنایی حفظ می شود، که در هنگام انجام پرس و جو مفید خواهد بود.
داده ها را به مجموعه اضافه کنید
هر فیلم باید یک شناسه منحصر به فرد داشته باشد، بنابراین ما روی آرایه فیلم حلقه می زنیم، یک شناسه منحصر به فرد برای هر فیلم ایجاد می کنیم و آن را در پایگاه داده وارد می کنیم.
for (const movie of movies) {
const uniqueId = `${Date.now()}-${Math.floor(Math.random() * 10000)}`;
collection.add({
documents: [movie],
ids: [uniqueId],
metadatas: [{ name: movie }],
});
برای مشاهده مجموعه، به http://localhost:8000/api/v1/collections بروید و باید همه مجموعههای خود را ببینید.
جستجوی مشابهت را انجام دهید
بیایید ابتدا مجموعه را دریافت کنیم. از متد getCollection() استفاده کنید و نام مجموعه و embeddingFunction خود را مشخص کنید.
const mycollection = await client.getCollection({
name:"movies",
embeddingFunction:embeddingFunction
})
جستجوی مجموعه
بیایید با عبارت “فیلم مناسب برای بچه ها به من توصیه کنید” پرس و جو کنیم.
const results = await mycollection.query({
queryTexts: ["recommend for me a movie suitable for kids"],
nResults: 2,
});
console.log(results.documents);
در اینجا پاسخ است.
[
[
'"Title":"Despicable Me","Year":"2010","Rated":"PG","Runtime":"95 min","Genre":"Animation, Adventure, Comedy","Actors":"Steve Carell, Jason Segel, Russell Brand","Plot":"Gru, a criminal mastermind, adopts three orphans as pawns to carry out the biggest heist in history. His life takes an unexpected turn when the little girls see the evildoer as their potential father."',
`"Title":"Toy Story 3","Year":"2010","Rated":"G","Runtime":"103 min","Genre":"Animation, Adventure, Comedy","Actors":"Tom Hanks, Tim Allen, Joan Cusack","Plot":"The toys are mistakenly delivered to a day-care center instead of the attic right before Andy leaves for college, and it's up to Woody to convince the other toys that they weren't abandoned and to return home."`
]
]
ما انتظار داشتیم که پرس و جو ما نتایجی را ارائه دهد که از نظر معنایی مشابه پرس و جو هستند و همانطور که می بینید، پاسخ دقیق است. Despicable Me and Toy Story 3 همگی فیلم هایی مناسب برای کودکان هستند. این چقدر عالیه
در پایان، این آموزش به شما نشان داده است که چگونه از قدرت جاسازیها و ChromaDB برای انجام جستجوهای معنایی در جاوا اسکریپت استفاده کنید.
با قسمت 2 همراه باشید، جایی که ما نحوه اضافه کردن یک رتریور را توضیح خواهیم داد.