ارتش تاریکی با هوش مصنوعی شب بازی است، دوستان شما دور میز بازی نشستهاند و منتظرند ببینند چه شخصیتی از Dungeons & Dragons (D&D) خواهند شد و به دنبال آن تلاش خواهند کرد. امشب، شما استاد سیاه چال (داستان نویس و راهنما) هستید، طراح برخوردهای هیجان انگیز برای به چالش کشیدن و مجذوب کردن بازیکنان خود. راهنمای مطمئن D&D Monster شما حاوی موجود است. یافتن هیولای عالی برای هر موقعیتی در میان گزینه های بی شمار می تواند بسیار دشوار باشد. دشمن ایده آل باید با محیط، دشواری و روایت لحظه مطابقت داشته باشد. هزاران اگر بتوانیم ابزاری بسازیم که فورا هیولایی را که برای هر سناریو مناسبتر است را بیابد؟ و اطمینان می دهد که هر برخورد تا حد امکان غوطه ور و هیجان انگیز است؟ ابزاری که چندین عامل را به طور همزمان در نظر می گیرد بیایید تلاش خودمان را آغاز کنیم: با استفاده از قدرت جستجوی برداری چند ویژگی، سیستم نهایی هیولا یاب را بسازیم! ایجاد موجودات با جستجوی برداری، چرا این کار را انجام دهیم؟ نشان دهنده یک انقلاب در بازیابی اطلاعات است. جاسازی برداری - با در نظر گرفتن زمینه و معنای معنایی - جستجوی برداری را برای بازگرداندن نتایج مرتبط تر و دقیق تر، مدیریت نه تنها داده های ساختاریافته، بلکه بدون ساختار و چندین زبان و مقیاس، توانمند می سازد. اما برای تولید پاسخهای با کیفیت بالا در برنامههای کاربردی دنیای واقعی، ما اغلب نیاز داریم که وزنهای متفاوتی را به ویژگیهای خاص اشیاء داده خود اختصاص دهیم. جستجوی برداری دو رویکرد رایج برای جستجوی برداری چند ویژگی وجود دارد. هر دو با تعبیه جداگانه هر ویژگی یک شی داده شروع می شوند. تفاوت اصلی بین این دو رویکرد در نحوه و تعبیههای ما است. ذخیره جستجوی رویکرد - هر بردار ویژگی را در فروشگاه های برداری جداگانه (یکی برای هر ویژگی) ذخیره کنید، جستجوی جداگانه برای هر ویژگی انجام دهید، نتایج جستجو را ترکیب کنید، و پس از پردازش (به عنوان مثال وزن) در صورت لزوم. ساده لوحانه رویکرد - همه بردارهای مشخصه را در یک ذخیره برداری (با استفاده از عملکرد داخلی Superlinked) به هم متصل کرده و ذخیره می کند، که به ما امکان می دهد ، با افزایش کارایی همراه. Superlinked به ما اجازه می دهند تا هر ویژگی را در زمان پرس و جو وزن کنیم تا نتایج مرتبط تری را بدون هیچ پس پردازشی نشان دهیم. Superlinked فقط یک بار جستجو کنیم spaces همچنین در زیر، ما از این دو رویکرد برای پیاده سازی یک ابزار جستجوی برداری چند ویژگی استفاده خواهیم کرد - یاب هیولاهای Dungeons and Dragons! پیادهسازیهای ساده ما، بهویژه دومی، نحوه ایجاد سیستمهای جستجوی قدرتمندتر و منعطفتر را نشان میدهد، سیستمهایی که میتوانند پرسشهای پیچیده و چند وجهی را به آسانی انجام دهند، صرف نظر از موارد استفاده شما. اگر در جستجوی شباهت برداری تازه کار هستید، نگران نباشید! ما شما را تحت پوشش قرار داده ایم - ما را بررسی کنید. مقالات بلوک های ساختمانی خوب، بیا بریم شکار هیولا! مجموعه داده ابتدا، ما یک مجموعه داده مصنوعی کوچک از هیولاها را با ایجاد یک مدل زبان بزرگ (LLM) ایجاد می کنیم: Generate two JSON lists: 'monsters' and 'queries'. 1. 'monsters' list: Create 20 unique monsters with the following properties: - name: A distinctive name - look: Brief description of appearance (2-3 sentences) - habitat: Where the monster lives (2-3 sentences) - behavior: How the monster acts (2-3 sentences) Ensure some monsters share similar features while remaining distinct. 2. 'queries' list: Create 5 queries to search for monsters: - Each query should be in the format: {look: "...", habitat: "...", behavior: "..."} - Use simple, brief descriptions (1-3 words per field) - Make queries somewhat general to match multiple monsters Output format: { "monsters": [ {"name": "...", "look": "...", "habitat": "...", "behavior": "..."}, ... ], "queries": [ {"look": "...", "habitat": "...", "behavior": "..."}, ... ] } بیایید نگاهی به نمونه ای از مجموعه داده ای که LLM ما تولید کرده است بیندازیم. توجه: تولید LLM غیر قطعی است، بنابراین نتایج شما ممکن است متفاوت باشد. اینها پنج هیولای اول ما هستند: # نام نگاه کن زیستگاه رفتار 0 لومینوت موجودی شبیه پروانه با بال و آنتن درخشان جنگلها و جنگلهای انبوه با فلور بیولومینسانس الگوهای نور آرامش بخش را برای برقراری ارتباط و جذب طعمه ساطع می کند 1 Aqua Wraith شکل انسان نمای شفاف ساخته شده از آب روان رودخانه ها، دریاچه ها و مناطق ساحلی تغییر شکل برای ترکیب با توده های آبی و کنترل جریان ها 2 گولم سنگ دل انسان نمای عظیم متشکل از صخره های به هم پیوسته کوه های صخره ای و خرابه های باستانی قرن ها خواب زمستانی می کند، برای محافظت از قلمرو خود بیدار می شود 3 سایه زمزمه موجودی سایه دار و بی شکل با چشمانی درخشان جنگل های تاریک و ساختمان های متروکه از ترس تغذیه می کند و حقایق ناراحت کننده را زمزمه می کند 4 زفیر رقصنده موجود پرنده برازنده با پرهای رنگین کمانی قله های بلند کوه و دشت های باد گرفته برای جذب جفت، نمایش های هوایی مسحورکننده ایجاد می کند ... و پرس و جوهای تولید شده ما: نگاه کن زیستگاه رفتار 0 درخشان مکان های تاریک دستکاری نور 1 عنصری محیط های افراطی کنترل محیطی 2 تغییر شکل مناظر متنوع ایجاد توهم 3 کریستالی مناطق غنی از مواد معدنی جذب انرژی 4 اثیری جوی نفوذ ذهن مجموعه داده اصلی و نمونه های پرس و جو را ببینید. اینجا بازیابی بیایید پارامترهایی را تنظیم کنیم که در هر دو رویکردمان - سادهلوحانه و Superlinked - در زیر استفاده خواهیم کرد. ما جاسازی های برداری خود را با استفاده از: sentence-transformers/all-mpnet-base-v2. برای سادگی، خروجی خود را به 3 مسابقه برتر محدود می کنیم. (برای کد کامل، از جمله واردات ضروری و توابع کمکی، به مراجعه کنید.) دفترچه یادداشت LIMIT = 3 MODEL_NAME = "sentence-transformers/all-mpnet-base-v2" اکنون، بیایید جستجوی هیولای چند ویژگی خود را آغاز کنیم! اول، ما رویکرد را امتحان خواهیم کرد. ساده لوحانه رویکرد ساده لوحانه در رویکرد ساده لوحانه خود، ویژگی ها را به طور مستقل جاسازی می کنیم و آنها را در شاخص های مختلف ذخیره می کنیم. در زمان پرس و جو، چندین جستجوی kNN را روی همه شاخص ها اجرا می کنیم، و سپس تمام نتایج جزئی خود را در یک ترکیب می کنیم. با تعریف کلاس شروع می کنیم NaiveRetriever برای انجام جستجوی مبتنی بر شباهت در مجموعه داده ما، با استفاده از جاسازیهای تولید شده توسط . all-mpnet-base-v2 class NaiveRetriever: def __init__(self, data: pd.DataFrame): self.model = SentenceTransformer(MODEL_NAME) self.data = data.copy() self.ids = self.data.index.to_list() self.knns = {} for key in self.data: embeddings = self.model.encode(self.data[key].values) knn = NearestNeighbors(metric="cosine").fit(embeddings) self.knns[key] = knn def search_key(self, key: str, value: str, limit: int = LIMIT) -> pd.DataFrame: embedding = self.model.encode(value) knn = self.knns[key] distances, indices = knn.kneighbors( [embedding], n_neighbors=limit, return_distance=True ) ids = [self.ids[i] for i in indices[0]] similarities = (1 - distances).flatten() # by definition: # cosine distance = 1 - cosine similarity result = pd.DataFrame( {"id": ids, f"score_{key}": similarities, key: self.data[key][ids]} ) result.set_index("id", inplace=True) return result def search(self, query: dict, limit: int = LIMIT) -> pd.DataFrame: results = [] for key, value in query.items(): if key not in self.knns: continue result_key = self.search_key(key, value, limit=limit) result_key.drop(columns=[key], inplace=True) results.append(result_key) merged_results = pd.concat(results, axis=1) merged_results["score"] = merged_results.mean(axis=1, skipna=False) merged_results.sort_values("score", ascending=False, inplace=True) return merged_results naive_retriever = NaiveRetriever(df.set_index("name")) بیایید از اولین پرس و جو از لیست تولید شده خود در بالا استفاده کنیم و با استفاده از خود هیولاها را جستجو کنیم: naive_retriever query = { 'look': 'glowing', 'habitat': 'dark places', 'behavior': 'light manipulation' } naive_retriever.search(query) ما naive_retriever نتایج جستجوی زیر را برای هر ویژگی برمی گرداند: شناسه score_look نگاه کن سایه زمزمه 0.503578 موجودی سایه دار و بی شکل با چشمانی درخشان طوفان شن جین 0.407344 گرداب چرخان شن و ماسه با نمادهای درخشان لومینوت 0.378619 موجودی شبیه پروانه با بال و آنتن درخشان عالی! نتایج هیولاهای برگشتی ما مرتبط هستند - همه آنها دارای ویژگی "درخشنده" هستند. بیایید ببینیم وقتی دو ویژگی دیگر را جستجو می کنیم، رویکرد ساده لوحانه چه چیزی را برمی گرداند. شناسه score_habitat زیستگاه سایه زمزمه 0.609567 جنگل های تاریک و ساختمان های متروکه شبکه قارچی 0.438856 غارهای زیرزمینی و جنگل های مرطوب Thornvine Elemental 0.423421 خرابه های بیش از حد رشد کرده و جنگل های متراکم شناسه نمره_رفتار رفتار گرافیتی زنده 0.385741 تغییر شکل برای ترکیب با محیط اطراف و جذب رنگدانه ها کریستالوینگ دریک 0.385211 جواهرات گرانبها را ذخیره می کند و می تواند نور را به پرتوهای قدرتمندی تبدیل کند لومینوت 0.345566 الگوهای نور آرامش بخش را برای برقراری ارتباط و جذب طعمه ساطع می کند همه هیولاهای بازیابی شده دارای ویژگی های مورد نظر هستند. در نگاه اول، نتایج جستجوی ساده لوحانه ممکن است امیدوارکننده به نظر برسد. اما ما باید هیولاهایی را پیدا کنیم که داشته باشند. بیایید نتایج خود را ادغام کنیم تا ببینیم هیولاهای ما چقدر در رسیدن به این هدف موفق عمل می کنند: هر سه ویژگی را به طور همزمان شناسه score_look score_habitat نمره_رفتار سایه زمزمه 0.503578 0.609567 طوفان شن جین 0.407344 لومینوت 0.378619 0.345566 شبکه قارچی 0.438856 Thornvine Elemental 0.423421 گرافیتی زنده 0.385741 کریستالوینگ دریک 0.385211 و در اینجا، محدودیت های رویکرد ساده لوحانه آشکار می شود. بیایید ارزیابی کنیم: ارتباط بر اساس ویژگی: : سه هیولا (Whispering Shade، Sandstorm Djinn و Luminoth) بازیابی شدند. look : فقط یک هیولا از نتایج مرتبط بود (Whispering Shade). habitat look : فقط یک هیولا از نتایج مرتبط بود (Luminoth)، اما با هیولای مربوط به متفاوت است. behavior look habitat ارتباط کلی: هیچ هیولایی برای هر سه ویژگی به طور همزمان بازیابی نشد. نتایج تکه تکه هستند: هیولاهای مختلف برای ویژگی های مختلف مرتبط هستند. به طور خلاصه، رویکرد جستجوی ساده لوحانه نمی تواند هیولاهایی را بیابد که همه معیارها را به یکباره برآورده کنند. بیایید آن را با 6 هیولا در هر ویژگی امتحان کنیم، به جای 3. بیایید نگاهی بیندازیم که این رویکرد چه چیزی ایجاد می کند: شاید بتوانیم این مشکل را با بازیابی فعالانه هیولاهای بیشتری برای هر ویژگی برطرف کنیم؟ شناسه score_look score_habitat نمره_رفتار سایه زمزمه 0.503578 0.609567 طوفان شن جین 0.407344 0.365061 لومینوت 0.378619 0.345566 سحابی چتر دریایی 0.36627 0.259969 دریم ویور اختاپوس 0.315679 کرم شب تاب کوانتومی 0.288578 شبکه قارچی 0.438856 Thornvine Elemental 0.423421 مه فانتوم 0.366816 0.236649 گولم سنگ دل 0.342287 گرافیتی زنده 0.385741 کریستالوینگ دریک 0.385211 Aqua Wraith 0.283581 ما اکنون 13 هیولا (بیش از نیمی از مجموعه داده های کوچک خود را) بازیابی کرده ایم، و همین مشکل وجود دارد: هیچ یک از این هیولاها برای هر سه ویژگی بازیابی نشده است. هنوز هم افزایش تعداد هیولاهای بازیابی شده (بیش از 6) مشکل ما را حل کند، اما مشکلات دیگری ایجاد می کند: ممکن است در تولید، بازیابی نتایج بیشتر (جستجوهای kNN چندگانه) زمان جستجو را به میزان قابل توجهی افزایش می دهد. برای هر ویژگی جدیدی که معرفی می کنیم، شانس ما برای یافتن یک هیولای "کامل" - با تمام ویژگی های موجود در جستجوی ما - به طور تصاعدی کاهش می یابد. برای جلوگیری از این امر، ما باید بسیاری از نزدیکترین همسایگان (هیولاها) را بازیابی کنیم، که باعث می شود تعداد کل هیولاهای بازیابی شده به طور تصاعدی افزایش یابد. ما هنوز هیچ تضمینی نداریم که هیولاهایی را که دارای تمام ویژگی های مورد نظر ما هستند، بازیابی کنیم. اگر ما موفق به بازیابی هیولاهایی شویم که همه معیارها را یکجا برآورده می کنند، باید نتایج تطبیق سربار اضافی را خرج کنیم. در مجموع، رویکرد ساده لوحانه برای جستجوی چند ویژگی قابل دوام، به ویژه در تولید، بسیار نامشخص و ناکارآمد است. رویکرد ابرپیوندی بیایید رویکرد دوم خود را پیاده سازی کنیم تا ببینیم آیا بهتر از روش ساده لوحانه عمل می کند یا خیر. ابتدا طرحواره، فاصله ها، ایندکس و پرس و جو را تعریف می کنیم: @schema class Monster: id: IdField look: String habitat: String behavior: String monster = Monster() look_space = TextSimilaritySpace(text=monster.look, model=MODEL_NAME) habitat_space = TextSimilaritySpace(text=monster.habitat, model=MODEL_NAME) behavior_space = TextSimilaritySpace(text=monster.behavior, model=MODEL_NAME) monster_index = Index([look_space, habitat_space, behavior_space]) monster_query = ( Query( monster_index, weights={ look_space: Param("look_weight"), habitat_space: Param("habitat_weight"), behavior_space: Param("behavior_weight"), }, ) .find(monster) .similar(look_space.text, Param("look")) .similar(habitat_space.text, Param("habitat")) .similar(behavior_space.text, Param("behavior")) .limit(LIMIT) ) default_weights = { "look_weight": 1.0, "habitat_weight": 1.0, "behavior_weight": 1.0 } اکنون، اجرا کننده را راه اندازی می کنیم و داده ها را آپلود می کنیم: monster_parser = DataFrameParser(monster, mapping={monster.id: "name"}) source: InMemorySource = InMemorySource(monster, parser=monster_parser) executor = InMemoryExecutor(sources=[source], indices=[monster_index]) app = executor.run() source.put([df]) بیایید همان پرس و جوی را که در اجرای رویکرد ساده لوح بالا اجرا کردیم اجرا کنیم: query = { 'look': 'glowing', 'habitat': 'dark places', 'behavior': 'light manipulation' } app.query( monster_query, limit=LIMIT, **query, **default_weights ) شناسه نمره نگاه کن زیستگاه رفتار سایه زمزمه 0.376738 موجودی سایه دار و بی شکل با چشمانی درخشان جنگل های تاریک و ساختمان های متروکه از ترس تغذیه می کند و حقایق ناراحت کننده را زمزمه می کند لومینوت 0.340084 موجودی شبیه پروانه با بال و آنتن درخشان جنگلها و جنگلهای انبوه با فلور بیولومینسانس الگوهای نور آرامش بخش را برای برقراری ارتباط و جذب طعمه ساطع می کند گرافیتی زنده 0.330587 موجودی دو بعدی و رنگارنگ که در سطوح صاف زندگی می کند مناطق شهری، به ویژه دیوارها و تابلوهای تبلیغاتی تغییر شکل برای ترکیب با محیط اطراف و جذب رنگدانه ها et voila! این بار، هر یک از هیولاهای برتر ما در امتیازی که نشان دهنده نوعی «متوسط» از هر سه ویژگی است که میخواهیم هیولایمان داشته باشد، رتبه بالایی کسب میکند. بیایید امتیاز هر هیولا را با جزئیات بشکنیم: شناسه نگاه کن زیستگاه رفتار کل سایه زمزمه 0.167859 0.203189 0.005689 0.376738 لومینوت 0.126206 0.098689 0.115189 0.340084 گرافیتی زنده 0.091063 0.110944 0.12858 0.330587 نتایج دوم و سوم ما، Luminoth و Living Graffiti، هر دو دارای هر سه ویژگی مورد نظر هستند. بهترین نتیجه، Whispering Shade، اگرچه از نظر دستکاری نور کمتر مرتبط است - همانطور که در امتیاز آن (0.006) منعکس شده است، دارای ویژگی های "درخشنده" و محیطی تاریک است که آن (0.168) و (0.203) امتیاز بسیار بالایی دارد. بالا، بالاترین امتیاز کل (0.377) را به آن می دهد، و در کل آن را به مرتبط ترین هیولا تبدیل می کند. چه پیشرفتی! behavior look habitat آیا می توانیم نتایج خود را تکرار کنیم؟ بیایید پرس و جو دیگری را امتحان کنیم و متوجه شویم. query = { 'look': 'shapeshifting', 'habitat': 'varied landscapes', 'behavior': 'illusion creation' } شناسه نمره نگاه کن زیستگاه رفتار مه فانتوم 0.489574 انسان نما اثیری و مه مانند با ویژگی های در حال تغییر باتلاق ها، تالاب ها و سواحل مه آلود مسافران را با توهمات و نجواها به بیراهه می کشاند زفیر رقصنده 0.342075 موجود پرنده برازنده با پرهای رنگین کمانی قله های بلند کوه و دشت های باد گرفته برای جذب جفت، نمایش های هوایی مسحورکننده ایجاد می کند سایه زمزمه 0.337434 موجودی سایه دار و بی شکل با چشمانی درخشان جنگل های تاریک و ساختمان های متروکه از ترس تغذیه می کند و حقایق ناراحت کننده را زمزمه می کند عالیه نتایج ما دوباره عالی است. اگر بخواهیم هیولاهایی شبیه به یک هیولای خاص را از مجموعه داده خود پیدا کنیم، چه؟ بیایید آن را با هیولایی که هنوز ندیدهایم امتحان کنیم - مرجانی هارمونیک. ما ویژگیهایی را برای این هیولا استخراج کنیم و پارامترهای پرس و جو را به صورت دستی ایجاد کنیم. اما Superlinked یک متد دارد که میتوانیم از آن روی شی پرس و جو استفاده کنیم. از آنجا که شناسه هر هیولا نام آن است، می توانیم درخواست خود را به سادگی بیان کنیم: میتوانیم with_vector app.query( monster_query.with_vector(monster, "Harmonic Coral"), **default_weights, limit=LIMIT ) شناسه نمره نگاه کن زیستگاه رفتار مرجان هارمونیک 1 ساختاری منشعب مانند آلات موسیقی با پیچک های ارتعاشی دریاهای کم عمق و استخرهای جزر و مدی ملودی های پیچیده ای را برای برقراری ارتباط و تأثیرگذاری بر احساسات ایجاد می کند دریم ویور اختاپوس 0.402288 سرپایان با شاخک هایی که مانند شفق های قطبی می درخشند سنگرهای عمیق اقیانوسی و غارهای زیر آب روی رویاهای موجودات نزدیک تأثیر می گذارد Aqua Wraith 0.330869 شکل انسان نمای شفاف ساخته شده از آب روان رودخانه ها، دریاچه ها و مناطق ساحلی تغییر شکل برای ترکیب با توده های آبی و کنترل جریان ها همانطور که انتظار می رود، نتیجه برتر مربوط به خود یعنی هارمونیک کورال است. دو هیولای دیگر که جستجوی ما بازیابی می کند Dreamweaver Octopus و Aqua Wraith هستند. هر دو از عناصر موضوعی ( ) مهم با هارمونیک مرجان مشترک هستند: ویژگی زیستگاه های آبی ( ) habitat توانایی تأثیرگذاری یا دستکاری محیط ( ) خود behavior ویژگی های بصری دینامیک یا سیال ( ) look وزن دهی صفات حال فرض کنید که می خواهیم به ویژگی اهمیت بیشتری بدهیم. چارچوب Superlinked به ما امکان می دهد به راحتی وزن ها را در زمان پرس و جو تنظیم کنیم. برای مقایسه آسان، ما هیولاهایی شبیه به هارمونیک مرجانی را جستجو می کنیم، اما با وزن هایمان که به نفع تنظیم شده اند. look look weights = { "look_weight": 1.0, "habitat_weight": 0, "behavior_weight": 0 } app.query( monster_query.with_vector(monster, "Harmonic Coral"), limit=LIMIT, **weights ) شناسه نمره نگاه کن زیستگاه رفتار مرجان هارمونیک 0.57735 ساختاری منشعب مانند آلات موسیقی با پیچک های ارتعاشی دریاهای کم عمق و استخرهای جزر و مدی ملودی های پیچیده ای را برای برقراری ارتباط و تأثیرگذاری بر احساسات ایجاد می کند Thornvine Elemental 0.252593 موجودی گیاه مانند با بدنی از انگورهای پیچ خورده و خار خرابه های بیش از حد رشد کرده و جنگل های متراکم به سرعت رشد می کند و زندگی گیاهان اطراف را کنترل می کند مار پلاسما 0.243241 موجودی مار مانند ساخته شده از انرژی ترق طوفان های برق و نیروگاه ها از جریان های الکتریکی تغذیه می کند و می تواند فناوری را اتصال کوتاه کند نتایج ما همه (به طور مناسب) ظاهری مشابه دارند - "شاخه شدن با پیچک های ارتعاشی"، "موجودی گیاه مانند با بدنی از انگورها و خارهای پیچ خورده"، "مار مانند". حال، بیایید جستجوی دیگری انجام دهیم، ظاهر را نادیده بگیریم، و در عوض به دنبال هیولاهایی بگردیم که از نظر و به طور همزمان مشابه هستند: habitat behavior weights = { "look_weight": 0, "habitat_weight": 1.0, "behavior_weight": 1.0 } شناسه نمره نگاه کن زیستگاه رفتار مرجان هارمونیک 0.816497 ساختاری منشعب مانند آلات موسیقی با پیچک های ارتعاشی دریاهای کم عمق و استخرهای جزر و مدی ملودی های پیچیده ای را برای برقراری ارتباط و تأثیرگذاری بر احساسات ایجاد می کند دریم ویور اختاپوس 0.357656 سرپایان با شاخک هایی که مانند شفق های قطبی می درخشند سنگرهای عمیق اقیانوسی و غارهای زیر آب روی رویاهای موجودات مجاور تأثیر می گذارد مه فانتوم 0.288106 انسان نما اثیری و مه مانند با ویژگی های در حال تغییر باتلاق ها، تالاب ها و سواحل مه آلود مسافران را با توهمات و نجواها به بیراهه می کشاند باز هم، رویکرد Superlinked نتایج بسیار خوبی ایجاد می کند. هر سه هیولا در محیط های آبی زندگی می کنند و دارای توانایی های کنترل ذهن هستند. در نهایت، بیایید جستجوی دیگری را امتحان کنیم، هر سه ویژگی را متفاوت ارزیابی کنیم - برای یافتن هیولاهایی که در مقایسه با هارمونیک کورال تا حدودی شبیه به نظر می رسند، در زیستگاه های بسیار متفاوت زندگی می کنند و رفتار بسیار مشابهی دارند: weights = { "look_weight": 0.5, "habitat_weight": -1.0, "behavior_weight": 1.0 } شناسه نمره نگاه کن زیستگاه رفتار مرجان هارمونیک 0.19245 ساختاری منشعب مانند آلات موسیقی با پیچک های ارتعاشی دریاهای کم عمق و استخرهای جزر و مدی ملودی های پیچیده ای را برای برقراری ارتباط و تأثیرگذاری بر احساسات ایجاد می کند لومینوت 0.149196 موجودی شبیه پروانه با بال و آنتن درخشان جنگلها و جنگلهای انبوه با فلور بیولومینسانس الگوهای نور آرامش بخش را برای برقراری ارتباط و جذب طعمه ساطع می کند رقصنده زفیر 0.136456 موجود پرنده برازنده با پرهای رنگین کمانی قله های بلند کوه و دشت های باد گرفته برای جذب جفت، نمایش های هوایی مسحورکننده ایجاد می کند باز هم نتایج عالی! دو هیولای دیگر بازیابی شده ما - Luminoth و Zephyr Dancer - رفتاری شبیه به هارمونیک کورال دارند و در زیستگاه هایی متفاوت از هارمونیک کورال زندگی می کنند. آنها همچنین بسیار متفاوت از هارمونیک مرجان هستند. (در حالی که پیچک های هارمونیک کورال و آنتن لومینوت تا حدودی ویژگی های مشابهی هستند، ما فقط وزن را 0.5 کاهش دادیم و شباهت بین این دو هیولا به همین جا ختم می شود.) look_weight بیایید ببینیم که چگونه امتیازات کلی این هیولاها از نظر ویژگی های فردی شکسته می شود: شناسه نگاه کن زیستگاه رفتار کل مرجان هارمونیک 0.19245 -0.3849 0.3849 0.19245 لومینوت 0.052457 -0.068144 0.164884 0.149196 زفیر رقصنده 0.050741 -0.079734 0.165449 0.136456 با وزندهی منفی (-1.0)، ما عمداً هیولاهایی را با زیستگاههای مشابه «دور میکنیم» و در عوض هیولاهای سطحی که محیطهایشان با هارمونیک کورال متفاوت است - همانطور که در امتیازات منفی Luminoth و Zephyr Dancer دیده میشود. نمرات Luminoth و Zephyr Dancer نسبتاً بالا است که نشان دهنده شباهت رفتاری آنها به هارمونیک کورال است. نمرات آنها مثبت است اما پایین تر است، که نشان دهنده شباهت بصری اما نه شدید به هارمونیک کورال است. habitat_weight habitat behavior look کمی به طور خلاصه، استراتژی ما برای کاهش وزن به -1.0 و به 0.5 اما نگه داشتن در 1.0 در رویارویی با هیولاهایی که ویژگی های رفتاری کلیدی با هارمونیک کورال دارند، اما محیط های بسیار متفاوتی دارند و حداقل تا حدودی متفاوت به نظر می رسند، موثر است. habitat_weight look_weight behavior_weight نتیجه گیری جستجوی برداری چند ویژگی پیشرفت قابل توجهی در بازیابی اطلاعات است که نسبت به جستجوی تشابه معنایی اولیه، دقت، درک زمینهای و انعطافپذیری بیشتری ارائه میدهد. با این حال، رویکرد ساده لوحانه ما (در بالا) - ذخیره و جستجوی بردارهای ویژگی به طور جداگانه، ترکیب نتایج - زمانی که نیاز به بازیابی اشیا با چندین ویژگی همزمان داریم، از نظر توانایی، ظرافت و کارایی محدود است. (علاوه بر این، چندین جستجوی kNN نسبت به یک جستجوی منفرد با بردارهای پیوسته زمان بیشتری می برد.) سپس برای رسیدگی به سناریوهایی مانند این، بهتر است همه بردارهای ویژگی خود را در یک ذخیره برداری ذخیره کنید و انجام دهید و ویژگی های خود را در زمان پرس و جو وزن کنید. رویکرد Superlinked دقیقتر، کارآمدتر و مقیاسپذیرتر از رویکرد سادهلوحانه برای هر برنامهای است که به بازیابی سریع، قابل اعتماد، ظریف و چند ویژگی نیاز دارد - چه مورد استفاده شما در حال مقابله با چالشهای دادههای دنیای واقعی در تجارت الکترونیک یا سیستم توصیه شما باشد. ... یا چیزی کاملاً متفاوت، مانند مبارزه با هیولاها. یک جستجو مشارکت کنندگان آندری پیکونوف، نویسنده مور کاپرونچای، ویراستار در ابتدا منتشر شد. در اینجا