តើធ្វើដូចម្តេចដើម្បីស្វែងរកសៀវភៅ Steam របស់អ្នកយ៉ាងឆាប់រហ័ស? អ្នកយល់ដឹងពីអារម្មណ៍នេះ។ អ្នកកំពុងស្វែងរកការប្រកួតដែលមានគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណង » តើអ្នកចង់មើលវានៅលើទិន្នន័យរបស់អ្នកជាមួយនឹងសំណួរពិតប្រាកដនិងទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យ? . Get in touch សូមអរគុណ សូមអរគុណ អេឡិចត្រូនិ ការស្វែងរកផ្ទាល់ខ្លួនផ្តល់ឱ្យអ្នកនូវការគ្រប់គ្រងអំពីអាសយដ្ឋានអាសយដ្ឋាន, metadata និង logic ការកំណត់. They outperform generic similarity search when queries are messy or jargon heavy. Superlinked បានរួមបញ្ចូលប្លាស្ទិចជាច្រើនទៅក្នុងកន្លែងគំនិតមួយនិងដំណើរការសំណួរនៅក្នុងការចែកចាយសម្រាប់លទ្ធផលយ៉ាងឆាប់រហ័ស។ LlamaIndex អនុញ្ញាតឱ្យការបណ្តាញ Retriever ស្អាតនិងដែកដោយផ្ទាល់ទៅនឹងម៉ាស៊ីនទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យ។ មានការរួមបញ្ចូល Superlinked Retriever សម្រាប់ LlamaIndex ដែលអ្នកអាចនាំចូលនិងប្រើ។ សូមមើលខាងក្រោម។ Superlinked Retriever សម្រាប់ LlamaIndex Superlinked បានរួមបញ្ចូលជាមួយ LlamaIndex តាមរយៈការផ្លូវការ បានចុះឈ្មោះនៅលើ LlamaHub, ដូច្នេះអ្នកអាចបន្ថែម Superlinked ទៅលើ LlamaIndex ដែលមាននៅពេលនេះជាមួយនឹងការដំឡើងនិង បន្ទាប់មកបន្ថែមទៅ A សាកល្បងបន្ថែមទៀតនៅលើ វិញ្ញាបនប័ត្រកម្រិតនិងគំរូរចនាសម្ព័ន្ធត្រូវបានបញ្ជាក់នៅក្នុងបញ្ជាក់ API LlamaIndex ។ SuperlinkedRetriever from llama_index.retrievers.superlinked import SuperlinkedRetriever RetrieverQueryEngine . ទំព័រដើម Integration . ទំព័រដើម Integration ទំព័រដើម Integration pip install llama-index-retrievers-superlinked from llama_index.retrievers.superlinked import SuperlinkedRetriever # sl_app: a running Superlinked App # query_descriptor: a Superlinked QueryDescriptor that describes your query plan retriever = SuperlinkedRetriever( sl_client=sl_app, sl_query=query_descriptor, page_content_field="text", query_text_param="query_text", metadata_fields=None, top_k=10, ) nodes = retriever.retrieve("strategic co-op sci fi game") តើអ្នកចង់បង្កើតវាដោយផ្ទាល់ឬកែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែ Why Superlinked + LlamaIndex? ហេតុអ្វីបានជា Superlinked + LlamaIndex? គោលបំណងគឺមានភាពងាយស្រួល: ទទួលយកសមត្ថភាពនៃ Superlinked សម្រាប់ការស្វែងរកជាច្រើននិងកញ្ចប់វាដូច្នេះអ្នកអភិវឌ្ឍន៍អាចទទួលយកនិងបន្ថែមទៅក្នុងប្រព័ន្ធ RAG ដែលពិតប្រាកដ។ Superlinked អនុញ្ញាតឱ្យអ្នកកំណត់កន្លែងបណ្តុះបណ្តាលនិងសំណួរដែលបណ្តុះបណ្តាលបណ្តុះបណ្តាលដូចជាឈ្មោះ, សៀវភៅ, និងប្រភេទទៅក្នុងការមើល semantic មួយ។ LlamaIndex ផ្តល់នូវការស្វែងរកបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្ត អ្នកក៏អាចចូលទៅក្នុង ការប្រើប្រាស់ឧបករណ៍សាងសង់ដូចគ្នាពីសៀវភៅ Superlinked ។ ក្រុមហ៊ុន Google សត្វ ក្រុមហ៊ុន Google សត្វ សត្វ Why Custom Retrievers ជឿទុកចិត្ត ទាញយកជាទូទៅគឺល្អឥតគិតថ្លៃសម្រាប់ការប្រើប្រាស់ជាទូទៅប៉ុន្តែពួកគេមានតម្រូវការបាត់បង់អ្វីដែលមានភាពងាយស្រួល។ សូមអរគុណអំពីការចែកចាយ, ការចែកចាយ, ឬការចែកចាយដែលមានតម្រូវការជាទូទៅសម្រាប់ទាញយកជាទូទៅមិនត្រូវបានទាញយកប៉ុណ្ណោះប៉ុន្តែអ្នកចែកចាយរបស់អ្នកមិនដឹងថាតើអ្នកចង់ស្វែងរកអ្វី។ នេះគឺជាកន្លែងដែលអ្នកចែកចាយដោយផ្ទាល់ខ្លួន: អ្នកអាចធ្វើការ hardwire នៅពេលនេះ។ ការធ្វើការខ្ពស់ជាងការសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរសរសេរ គោលបំណងឯកសារនិងគោលបំណងកំណត់ - ពេលវេលាអ្នកចង់អនុវត្តគោលបំណងរបស់អ្នកដើម្បីធ្វើឱ្យប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រសើរឡើងប្រស ការកើនឡើងនៃការអនុវត្ត - សូមអរគុណសម្បត្តិ: ការដំណោះស្រាយជាទូទៅត្រូវបានបង្កើតឡើងដើម្បីធ្វើការ "ប្រសើរ" សម្រាប់មនុស្សទាំងអស់, មិនល្អសម្រាប់អ្នក. ប្រសិនបើអ្នកដឹងពីទិន្នន័យរបស់អ្នកនិងគំរូការចូលរបស់អ្នក, អ្នកអាចកំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់កំណត់ ការកាត់បន្ថយកម្មវិធី ផ្នែកទី 1: ការផ្លាស់ប្តូរសំខាន់និងការនាំចូល import time import logging import pandas as pd from typing import List from llama_index.core.retrievers import BaseRetriever from llama_index.core.schema import NodeWithScore, QueryBundle, TextNode from llama_index.core.query_engine import RetrieverQueryEngine from llama_index.core.response_synthesizers import get_response_synthesizer from llama_index.core import Settings from llama_index.llms.openai import OpenAI import superlinked.framework as sl រចនាសម្ព័ន្ធការនាំចេញបង្ហាញពីវិធីសាស្រ្ត hybrid របស់យើង: LlamaIndex Core: អនុញ្ញាតឱ្យកម្រិតបង្វិលទាញយក Superlinked Framework: អនុញ្ញាតឱ្យវគ្គបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តាល Pandas: ការគ្រប់គ្រងការ preprocessing និង manipulation នៃទិន្នន័យ ផ្នែក 2: ការយល់ដឹងអំពី LlamaIndex Custom Retrievers មុនពេលដំឡើងកម្មវិធី Superlinked របស់យើងវាគឺជាការសំខាន់ក្នុងការយល់ដឹងអំពីរបៀបដែលរចនាសម្ព័ន្ធ Retriever Custom របស់ LlamaIndex ធ្វើការនិងហេតុអ្វីដែលវាគឺមានប្រសិទ្ធិភាពខ្លាំងណាស់សម្រាប់ការបង្កើតកម្មវិធី RAG ដែលមានជំនាញវិជ្ជាជីវៈ។ មាត្រា Abstraction LlamaIndex បានផ្តល់នូវការបង្វិល ប្រភេទដែលជាមូលដ្ឋានសម្រាប់ប្រតិបត្តិការទាញយកទាំងអស់។ អស្ចារ្យនៃការរចនាសម្ព័ន្ធនេះគឺនៅក្នុងភាពងាយស្រួលរបស់វា—ប្រព័ន្ធទាញយកផ្ទាល់ខ្លួនណាមួយតែត្រូវការអនុវត្តវិធីសំខាន់មួយ: BaseRetriever from abc import abstractmethod from llama_index.core.retrievers import BaseRetriever from llama_index.core.schema import NodeWithScore, QueryBundle class BaseRetriever: @abstractmethod def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: """Retrieve nodes given query.""" pass នេះគឺជាការមានប្រព័ន្ធប្រតិបត្តិការ Retrieval ពី LlamaIndex ។ ដូច្នេះប្រព័ន្ធប្រតិបត្តិការ Retrieval នេះអនុញ្ញាតឱ្យមានភាពងាយស្រួលក្នុងការផ្លាស់ប្តូរប្រព័ន្ធផ្សេងគ្នានិងប្រព័ន្ធផ្សេងគ្នានេះដោយមិនចាំបាច់ទាក់ទងនឹងប្រព័ន្ធផ្សេងទៀតរបស់អ្នក។ សូមចែកចាយវានៅលើអ្វីដែលកំពុងកើតឡើង។ Input: QueryBundle This is the query object passed into your retriever. At minimum, it contains the user's raw query string (e.g., "sci-fi strategy games"). But it can also include extra metadata like filters, embeddings, or user preferences. Basically, anything that might help shape a more relevant response. Output: List[NodeWithScore] The retriever returns a list of nodes—these are your chunks of content, documents, or data entries—each paired with a relevance score. The higher the score, the more relevant the node is to the query. This list is what gets passed downstream to the LLM or other post-processing steps. As in our case, we are plugging on the Processing: Backend-Agnostic Here’s the cool part: how you get from query to result is totally up to you. You can use a vector database, a traditional search engine, a REST API, or even something handcrafted for your specific use case. This decouples logic and gives you full control over the retrieval stack. ដូច្នេះអ្វីបានជាការសំខាន់? ការបង្វិលនេះគឺស្រស់ស្អាតនិង វាមានន័យថាអ្នកអាច: សមត្ថភាព ការរួមបញ្ចូលប្រព័ន្ធផ្សព្វផ្សាយជាច្រើន - ប្រើការស្វែងរកបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញបណ្តាញ ការធ្វើតេស្ត A / B ជាងាយស្រួល - ការប្រៀបធៀបអ្នកទទួលបានផ្សេងគ្នាដើម្បីមើលអ្វីដែលផ្តល់នូវលទ្ធផលល្អបំផុតសម្រាប់អ្នកប្រើរបស់អ្នក។ ចុចចូលទៅក្នុងអេក្រង់ឬឧបករណ៍ណាមួយ - ប្រសិនបើអ្នកកំពុងបង្កើត chatbot, ការស្វែងរក UI ឬប្រព័ន្ធអេក្រង់ពេញលេញ, ប្រព័ន្ធប្រតិបត្តិការ retriever នេះមានលក្ខណៈពិសេសយ៉ាងងាយស្រួល។ សូមគិតអំពីប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយនិងប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយជាប្រព័ន្ធផ្សព្វផ្សាយ។ ការផ្លាស់ប្តូរ Superlinked ទៅ LlamaIndex ដូច្នេះ, ដូច្នេះ វគ្គសិក្សានេះគឺជាឧបករណ៍ដើម្បីផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់នូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់នូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ជូននូវការផ្តល់ SuperlinkedSteamGamesRetriever ជាលើកដំបូងនេះគឺ សូមចង់ដឹងថាវាគឺជាមូលដ្ឋាន។ វាគឺជាអ្វីដែលធ្វើឱ្យអ្វីគ្រប់យ៉ាងត្រូវបានរៀបចំនិងមានសុវត្ថិភាព។ ប្រើកម្មវិធី Superlinked ។ យើងផ្តល់ជូននូវលក្ខខណ្ឌសំខាន់ដូចជា លោក លោក និង នេះធ្វើឱ្យទិន្នន័យទាំងអស់នៃការប្រកួតស្អាតនិងរឹងមាំហើយវាមានការផ្លាស់ប្តូរដោយផ្ទាល់ទៅនឹងបំពង់របស់ Superlinked ដូច្នេះអ្វីគ្រប់យ៉ាងនឹងលេងយ៉ាងឆាប់រហ័ស។ schema definition GameSchema game_number name desc_snippet genre class GameSchema(sl.Schema): game_number: sl.IdField name: sl.String desc_snippet: sl.String game_details: sl.String languages: sl.String genre: sl.String game_description: sl.String original_price: sl.Float discount_price: sl.Float combined_text: sl.String # New field for combined text self.game = GameSchema() បន្ទាប់ពីនេះគឺជា នេះគឺជាកន្លែងដែលសិល្បៈនៃការស្វែងរកអាសអាភាសកើតឡើង។ វាត្រូវបានប្រើ ម៉ូដែលដើម្បីផ្លាស់ប្តូរទិន្នន័យនៃការប្រកួត (ដូចជាឈ្មោះ, សៀវភៅ, ប្រភេទ, ល) ទៅជាការបង្ហាញ vector កម្រិតខ្ពស់។ ជាមូលដ្ឋាន, វាត្រូវបានបំពាក់អត្ថបទទាំងអស់នេះទៅជាអ្វីដែលម៉ូដែលអាចយល់ដឹង។ ការផ្លាស់ប្តូរដែលស្រស់ស្អាត? នេះអនុញ្ញាតឱ្យអ្នកទទួលបានការយល់ដឹងអ្វីដែលអ្នកប្រើ។ ដូច្នេះប្រសិនបើអ្នកកំពុងស្វែងរកអ្វីដូចជា“ការភ្ញាក់ផ្អែកលើពិភពលោក” អ្នកអាចរកឃើញហ្គេមដែលមានលក្ខណៈសម្បត្តិពិតប្រាកដនោះទេប៉ុន្តែមិនមែនហ្គេមដែលមានលក្ខណៈសម្បត្តិពិតប្រាកដនោះទេ។ text similarity space sentence-transformers/all-mpnet-base-v2 មានន័យថា self.text_space = sl.TextSimilaritySpace( text=self.game.combined_text, model="sentence-transformers/all-mpnet-base-v2" ) នេះ វាគឺជាកន្លែងដែលអ្វីដែលពិតជាចាប់ផ្តើមចុច។ វាត្រូវបានប្រើទិន្នន័យផ្សេងគ្នា (ដូចជាឈ្មោះហ្គេម, ការបង្ហាញ, ប្រភេទ, និងច្រើនទៀត) និងកាត់បន្ថយពួកគេទៅក្នុងសៀវភៅមួយធំមួយ។ នេះផ្តល់ឱ្យម៉ូដែលនូវរូបភាពពេញលេញជាងមុននៃការប្រកួតទាំងអស់នៅពេលដែលផ្លាស់ប្តូរវាទៅជាប្រវត្តិ។ លទ្ធផលនេះ? វិធីល្អជាងមុន, ដូច្នេះវាគឺជាការបាត់បន្ថយទិន្នន័យផ្សេងៗគ្នាទាំងអស់នៅពេលតែប៉ុន្តែមិនគ្រាន់តែមើលឃើញអ្វីមួយក្នុងការកាត់បន្ថយ។ combined text field self.df['combined_text'] = ( self.df['name'].astype(str) + " " + self.df['desc_snippet'].astype(str) + " " + self.df['genre'].astype(str) + " " + self.df['game_details'].astype(str) + " " + self.df['game_description'].astype(str) ) ឥឡូវនេះ, នេះគឺជាអ្វីដែលធ្វើឱ្យអ្វីគ្រប់យ៉ាងមានភាពងាយស្រួល។ សូមអរគុណ Superlinked អ្នកអាចដោះស្រាយសំណួរនៅក្នុងពេលវេលាពិតប្រាកដដោយមិនមានការលំបាកទេប៉ុន្តែមានផលិតផលដោយឥតគិតថ្លៃ។ វាមានន័យថាប្រហែលជាអ្នកដែលកំពុងស្វែងរកប្រភេទមួយឬគ្រាន់តែស្វែងរកអ្វីដែលជាថ្មីដើម្បីលេងអ្នកអាចទទួលបានការណែនាំយ៉ាងឆាប់រហ័សនិងត្រឹមត្រូវដោយមិនចាំបាច់។ in-memory execution InMemoryExecutor # Set up in-memory source and executor source = sl.InMemorySource(self.game, parser=parser) self.executor = sl.InMemoryExecutor(sources=[source], indices=[self.index]) self.app = self.executor.run() # Load data source.put([self.df]) ចុចទាំងអស់ទាំងនេះទៅគ្នាហើយអ្នកមាន — ការកំណត់រឹងសម្រាប់ការផ្គត់ផ្គង់ការប្រកួតដែលមានគួរឱ្យចាប់អារម្មណ៍សម្រាប់អ្នកប្រើ។ វាមានល្បឿនលឿនគួរឱ្យចាប់អារម្មណ៍និងផ្ទាល់ខ្លួន។ នេះគឺដូច្នេះអ្វីទាំងអស់គួរឱ្យចាប់អារម្មណ៍ក្នុងការដោះស្រាយ ... SuperlinkedSteamGamesRetriever class SuperlinkedSteamGamesRetriever(BaseRetriever): """A custom LlamaIndex retriever using Superlinked for Steam games data.""" def __init__(self, csv_file: str, top_k: int = 10): """ Initialize the retriever with a CSV file path and top_k parameter. Args: csv_file (str): Path to games_data.csv top_k (int): Number of results to return (default: 10) """ self.top_k = top_k # Load the dataset and ensure all required columns are present self.df = pd.read_csv(csv_file) print(f"Loaded dataset with {len(self.df)} games") print("DataFrame Columns:", list(self.df.columns)) required_columns = [ 'game_number', 'name', 'desc_snippet', 'game_details', 'languages', 'genre', 'game_description', 'original_price', 'discount_price' ] for col in required_columns: if col not in self.df.columns: raise ValueError(f"Missing required column: {col}") # Combine relevant columns into a single field for text similarity self.df['combined_text'] = ( self.df['name'].astype(str) + " " + self.df['desc_snippet'].astype(str) + " " + self.df['genre'].astype(str) + " " + self.df['game_details'].astype(str) + " " + self.df['game_description'].astype(str) ) self._setup_superlinked() def _setup_superlinked(self): """Set up Superlinked schema, space, index, and executor.""" # Define schema class GameSchema(sl.Schema): game_number: sl.IdField name: sl.String desc_snippet: sl.String game_details: sl.String languages: sl.String genre: sl.String game_description: sl.String original_price: sl.Float discount_price: sl.Float combined_text: sl.String # New field for combined text self.game = GameSchema() # Create text similarity space using the combined_text field self.text_space = sl.TextSimilaritySpace( text=self.game.combined_text, model="sentence-transformers/all-mpnet-base-v2" ) # Create index self.index = sl.Index([self.text_space]) # Map DataFrame columns to schema parser = sl.DataFrameParser( self.game, mapping={ self.game.game_number: "game_number", self.game.name: "name", self.game.desc_snippet: "desc_snippet", self.game.game_details: "game_details", self.game.languages: "languages", self.game.genre: "genre", self.game.game_description: "game_description", self.game.original_price: "original_price", self.game.discount_price: "discount_price", self.game.combined_text: "combined_text" } ) # Set up in-memory source and executor source = sl.InMemorySource(self.game, parser=parser) self.executor = sl.InMemoryExecutor(sources=[source], indices=[self.index]) self.app = self.executor.run() # Load data source.put([self.df]) print(f"Initialized Superlinked retriever with {len(self.df)} games") def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: """ Retrieve top-k games based on the query string. Args: query_bundle (QueryBundle): Contains the query string Returns: List[NodeWithScore]: List of retrieved games with scores """ query_text = query_bundle.query_str # Define Superlinked query with explicit field selection query = ( sl.Query(self.index) .find(self.game) .similar(self.text_space, query_text) .select([ self.game.game_number, self.game.name, self.game.desc_snippet, self.game.game_details, self.game.languages, self.game.genre, self.game.game_description, self.game.original_price, self.game.discount_price ]) .limit(self.top_k) ) # Execute query result = self.app.query(query) df_result = sl.PandasConverter.to_pandas(result) # Convert results to NodeWithScore objects nodes_with_scores = [] for i, row in df_result.iterrows(): text = f"{row['name']}: {row['desc_snippet']}" metadata = { "game_number": row["id"], "name": row["name"], "desc_snippet": row["desc_snippet"], "game_details": row["game_details"], "languages": row["languages"], "genre": row["genre"], "game_description": row["game_description"], "original_price": row["original_price"], "discount_price": row["discount_price"] } score = 1.0 - (i / self.top_k) node = TextNode(text=text, metadata=metadata) nodes_with_scores.append(NodeWithScore(node=node, score=score)) return nodes_with_scores print("✅ SuperlinkedSteamGamesRetriever class defined successfully!") Integration Architecture Deep Dive ផ្នែកទី 3 - Superlinked Schema Definition និង Setup ឥឡូវនេះគឺជាពេលដែលយើងចូលដំណើរការយ៉ាងទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទ នៅក្នុងយើង គម្រោងនេះត្រូវបានកំណត់ដូច្នេះ: SuperlinkedSteamGamesRetriever class GameSchema(sl.Schema): game_number: sl.IdField name: sl.String desc_snippet: sl.String game_details: sl.String languages: sl.String genre: sl.String game_description: sl.String original_price: sl.Float discount_price: sl.Float combined_text: sl.String # New field for combined text self.game = GameSchema() សូមចែករំលែកអ្វីមួយចំនួននៃគំនិតទាំងនេះពិតជា : បាន (→ ) Think of this as our primary key. It gives each game a unique identity and allows Superlinked to index and retrieve items efficiently, I mean basically it’s about how we are telling the Superlinked to segregate the unique identify of the games, and btw it’s especially important when you're dealing with thousands of records. sl.IdField game_number and Now these aren't just type hints—they enable Superlinked to optimize operations differently depending on the field. For instance, fields can be embedded and compared semantically, while fields can support numeric filtering or sorting. sl.String sl.Float sl.String sl.Float This is the of our retriever. It’s a synthetic field where we concatenate the game name, description, genre, and other relevant attributes into a single block of text. This lets us build a single using sentence-transformer embeddings: combined_text semantic anchor text similarity space self.text_space = sl.TextSimilaritySpace( text=self.game.combined_text, model="sentence-transformers/all-mpnet-base-v2" ) ដោយសារតែអ្នកប្រើប្រាស់មិនគ្រាន់តែស្វែងរកដោយប្រភេទឬឈ្មោះពួកគេបានបង្ហាញថាពួកគេគឺជាអ្វីដែលពួកគេមាន ដោយការបំពាក់ទិន្នន័យសំខាន់ទាំងអស់នៅក្នុង យើងអាចប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀបប្រៀបធៀប សូមស្វែងរក combined_text ដំណឹងទី 4 - Vector Space Configuration # Create text similarity space using the combined_text field self.text_space = sl.TextSimilaritySpace( text=self.game.combined_text, model="sentence-transformers/all-mpnet-base-v2" ) # Create index self.index = sl.Index([self.text_space]) ដើម្បីអនុញ្ញាតឱ្យការស្វែងរកសំឡេងនៅលើទិន្នន័យនៃការប្រកួត Steam របស់យើងខ្ញុំបានធ្វើការជ្រើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសភាពងាយស្រួលនិងភាពងាយស្រួល។ ជាលើកដំបូងសម្រាប់ម៉ូដែល embedding ខ្ញុំបានជ្រើសរើស ម៉ូដែលនេះបានផលិតការបណ្តុះបណ្តាល 768-dimensional ដែលចូលទៅក្នុងមជ្ឈមណ្ឌលដ៏រឹងមាំ: ពួកគេមានការបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះ សូមធ្វើវាយ៉ាងច្បាស់។ all-mpnet-base-v2 all-mpnet-base-v2 បន្ទាប់មក, ទោះបីជា Superlinked អនុញ្ញាតឱ្យមានការអនុម័តជាច្រើន - នៅពេលដែលអ្នកអាចរួមបញ្ចូលបណ្តាញជាច្រើនឬបច្ចេកទេសជាច្រើន (ដូចជាសៀវភៅ + រូបភាព) ។ ខ្ញុំបានរក្សាទុកអ្វីដែលមានភាពងាយស្រួលជាមួយនឹងការមួយតែមួយ។ ខ្ញុំនឹងរួមបញ្ចូល នៅទីនេះផងដែរប៉ុន្តែខ្ញុំមិនមានព័ត៌មានអំពីថ្ងៃដំណោះស្រាយសម្រាប់ហ្គេមប៉ុន្តែដើម្បីបង្ហាញនេះនៅទីនេះ, ប្រសិនបើយើងមានព័ត៌មានពីថ្ងៃដំណោះស្រាយយើងអាចបង្វិលនៅក្នុង RecencySpace នៅទីនេះហើយខ្ញុំអាចដំណោះស្រាយហ្គេមជាមួយនឹង លក្ខណៈពិសេសនៃការប្រកួតប្រជែងនេះគឺជាការល្អឥតខ្ចោះ។ TextSimilaritySpace RecencySpace TextSimilaritySpace ផ្នែក 5: បំពង់ទិន្នន័យនិងការដំឡើងអ្នកអនុវត្ត # Map DataFrame columns to schema - Critical for data integrity parser = sl.DataFrameParser( self.game, mapping={ self.game.game_number: "game_number", self.game.name: "name", self.game.desc_snippet: "desc_snippet", self.game.game_details: "game_details", self.game.languages: "languages", self.game.genre: "genre", self.game.game_description: "game_description", self.game.original_price: "original_price", self.game.discount_price: "discount_price", self.game.combined_text: "combined_text" } ) # Set up in-memory source and executor source = sl.InMemorySource(self.game, parser=parser) self.executor = sl.InMemoryExecutor(sources=[source], indices=[self.index]) self.app = self.executor.run() # Load data source.put([self.df]) print(f"Initialized Superlinked retriever with {len(self.df)} games") នៅមជ្ឈមណ្ឌលនៃប្រព័ន្ធស្វែងរករបស់យើងគឺជាប្រព័ន្ធបំពង់ដែលមានភាពងាយស្រួលដែលត្រូវបានរចនាឡើងសម្រាប់ភាពងាយស្រួលនិងល្បឿន។ ខ្ញុំចាប់ផ្តើមជាមួយ វាគឺជាការធានាថាសម្រាប់ការសរសេរគ្រប់គ្រងនៅក្នុងទិន្នន័យដែលត្រូវបានសរសេរយ៉ាងត្រឹមត្រូវនិងរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀបចំនៃការរៀប DataFrameParser នៅពេលដែលទិន្នន័យនេះត្រូវបានរចនាឡើងខ្ញុំផ្គត់ផ្គង់វាទៅក្នុង នេះគឺជាការល្អឥតខ្ចោះសម្រាប់ទិន្នន័យដែលមានភាពងាយស្រួលក្នុងការចែកចាយនៅក្នុងការចែកចាយ។ គោលបំណងនេះធ្វើឱ្យអ្វីគ្រប់យ៉ាងយ៉ាងឆាប់រហ័សដោយគ្មានការបង្កើតការចែកចាយការចែកចាយការចែកចាយការចែកចាយការចែកចាយការចែកចាយការចែកចាយការចែកចាយការចែកចាយការចែកចាយការចែកចាយការចែកចាយ។ នេះគឺជាអ្វីដែលធ្វើឱ្យ Superlinked ល្អសម្រាប់កម្មវិធីពេលវេលាពិតប្រាកដដូចជាប្រព័ន្ធការណែនាំអ៊ីនធឺណិតដែលមានប្រសិទ្ធិភាពល្បឿនដោយផ្ទាល់ប្រសិទ្ធិភាពសម្រាប់បទពិសោធន៍អ្នកប្រើ។ InMemorySource InMemoryExecutor ផ្នែក 6: ម៉ាស៊ីន Retrieval def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: """ Retrieve top-k games based on the query string. Args: query_bundle (QueryBundle): Contains the query string Returns: List[NodeWithScore]: List of retrieved games with scores """ query_text = query_bundle.query_str # Define Superlinked query with explicit field selection query = ( sl.Query(self.index) .find(self.game) .similar(self.text_space, query_text) .select([ self.game.game_number, self.game.name, self.game.desc_snippet, self.game.game_details, self.game.languages, self.game.genre, self.game.game_description, self.game.original_price, self.game.discount_price ]) .limit(self.top_k) ) # Execute query result = self.app.query(query) df_result = sl.PandasConverter.to_pandas(result) មួយនៃអ្វីដែលធ្វើឱ្យ Superlinked មានភាពងាយស្រួលក្នុងការធ្វើការជាមួយវាគឺជាអ្នកបង្កើតសំណួររចនាសម្ព័ន្ធរបស់វា។ ប្រសិនបើអ្នកបានប្រើសៀវភៅដូចជា SQLAlchemy ឬ Django ORM អ្នកនឹងមានគំរូដែលគួរឱ្យចាប់អារម្មណ៍។ គំរូទាំងអស់នៅក្នុងរចនាសម្ព័ន្ធនេះបានបន្ថែម clarity ដូចគ្នានេះមិនមែនជាការបង្វិល។ ក្នុងករណីរបស់យើងសំណួរនេះចាប់ផ្តើមដោយការជ្រើសរើសឧបករណ៍បញ្ចូលគ្នានេះនិងកំណត់ការស្វែងរកគ្នានេះដោយប្រើឧបករណ៍ គោលបំណង, ដែលគណនានៅក្នុងការគណនានៅក្នុងការបណ្តុះបណ្តាល។ នេះគឺជាអ្វីដែលអនុញ្ញាតឱ្យយើងដើម្បីស្វែងរកការជួបប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំប្រជុំ .similar() គោលបំណងច្នៃប្រឌិតថ្មីមួយដែលខ្ញុំបានធ្វើគឺ ខ្ញុំនៅក្នុងការកំណត់ផលប៉ះពាល់ជាងធ្វើអ្វីដែលដូចជា នេះអាចជឿទុកចិត្តបានទេប៉ុន្តែវាអាចធ្វើឱ្យទិន្នន័យមានលក្ខណៈពិសេសក្នុងការកាត់បន្ថយការដំណើរការនិងធានាថាយើងមិនបានបាត់បង់ទិន្នន័យដែលមិនចាំបាច់នៅពេលដំណើរការបន្ទាប់ពីការដំណើរការ។ សូមគិតថាវាជាភាពត្រឹមត្រូវជាងទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យជាសំខាន់ណាស់នៅពេលដែលអ្នកកំពុងផ្លាស់ប្តូរទិន្នន័យរវាងផ្នែកមួយនៅក្នុងបំពង់ដែលមានភាពងាយស្រួល។ explicitly select the fields SELECT * ផ្នែក 7: ការដំណើរការផលិតផលនិងការបង្កើត Node # Convert to LlamaIndex NodeWithScore format nodes_with_scores = [] for i, row in df_result.iterrows(): text = f"{row['name']}: {row['desc_snippet']}" metadata = { "game_number": row["id"], "name": row["name"], "desc_snippet": row["desc_snippet"], "game_details": row["game_details"], "languages": row["languages"], "genre": row["genre"], "game_description": row["game_description"], "original_price": row["original_price"], "discount_price": row["discount_price"] } # Simple ranking score based on result position score = 1.0 - (i / self.top_k) node = TextNode(text=text, metadata=metadata) nodes_with_scores.append(NodeWithScore(node=node, score=score)) return nodes_with_scores ឥឡូវនេះនៅពេលដែលយើងទទួលបានផលិតផលពី Superlinked, ខ្ញុំបានផ្លាស់ប្តូរវាទៅជាទំហំដែលលេងល្អជាមួយ LlamaIndex ។ ជាលើកដំបូងខ្ញុំបានបង្កើត វាត្រូវបានបង្កើតឡើងដោយការរួមបញ្ចូលឈ្មោះនៃការប្រកួតជាមួយនឹងការបង្ហាញតូចរបស់វា។ វាត្រូវបានបង្កើតឡើងជាគណនីនៃការគ្រប់គ្រងមួយដែលធ្វើឱ្យវាជាការងាយស្រួលសម្រាប់ម៉ូដែលភាសាដើម្បីគិតអំពី។ វាគឺជាការចាក់តូចមួយប៉ុន្តែវាត្រូវបានធ្វើឱ្យប្រសើរឡើងយ៉ាងណាក៏ដោយរបៀបដែលទិន្នន័យដែលបានរកឃើញគឺមានប្រសិទ្ធិភាពនិងអាច理解បាននៅពេលដែលបានផ្លាស់ប្តូរទៅ LLM ។ human-readable text បន្ទាប់មកយើងធ្វើឱ្យប្រាកដថា ពីទម្រង់ទិន្នន័យ, រួមទាំងអ្វីដែលដូចជាប្រភេទ, តម្លៃ, និងលក្ខណៈពិសេសនៃការប្រកួត - ត្រូវបានរក្សាទុកនៅក្នុង metadata នេះ។ នេះគឺជាការសំខាន់ណាស់ដោយសារតែដំណើរការបន្ទាប់ពីនេះអាចចង់រំលែក, បង្ហាញ, ឬការកំណត់ផលិតផលដោយផ្អែកលើទិន្នន័យនេះ។ ខ្ញុំមិនចង់បាត់បង់បញ្ហាដែលមានប្រសិទ្ធិភាពណាមួយបន្ទាប់ពីយើងចាប់ផ្តើមធ្វើការជាមួយ nodes ដែលបានទាញយក។ all original fields ឥឡូវនេះខ្ញុំបានប្រើសម្រាប់កម្រិតខ្ពស់ លក្ខណៈពិសេសនៃការធ្វើតេស្តនេះគឺជាការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្តនៃការធ្វើតេស្ត។ score normalisation ការបង្ហាញពេលវេលា: ការអនុវត្តបំពង់ ឥឡូវនេះជាពេលដែលសមាសភាគទាំងអស់មានទីតាំងស្ថិត, វាត្រូវបានធ្វើឱ្យប្រព័ន្ធ Retrieval-Augmented Generation (RAG) របស់យើងមានជីវិត។ ខាងក្រោមនេះគឺជាការរួមបញ្ចូល end-to-end នៃ Superlinked និង LlamaIndex ក្នុងការប្រតិបត្តិការ។ # Initialize the RAG pipeline print("Setting up complete Retrieval pipeline...") # Create response synthesizer and query engine response_synthesizer = get_response_synthesizer() query_engine = RetrieverQueryEngine( retriever=retriever, response_synthesizer=response_synthesizer ) print("✅ RAG pipeline configured successfully!") print("\n" + "="*60) print("FULL RAG PIPELINE DEMONSTRATION") print("="*60) # Test queries with full RAG responses test_queries = [ "I want to find a magic game with spells and wizards", "Recommend a fun party game for friends", "I'm looking for a strategic sci-fi game", "What's a good cooperative game for teamwork?" ] for i, query in enumerate(test_queries, 1): print(f"\nQuery {i}: '{query}'") print("-" * 50) response = query_engine.query(query) print(f"Response: {response}") print("\n" + "="*50) ការដំឡើងនេះរួមបញ្ចូលគ្នានៃការទទួលយកអាសអាភាសដោយផ្ទាល់របស់យើងជាមួយនឹងក្រុមហ៊ុនផលិតអត្ថប្រយោជន៍ដែលមានប្រសិទ្ធិភាពដោយ LLM ។ គម្រោងដំណើរការយ៉ាងឆាប់រហ័សតាមរយៈការដោះស្រាយនិងជាផ្នែកមួយនៃការបាត់បង់ទិន្នន័យធម្មតាត្រូវបានផ្លាស់ប្តូរដោយការផ្តល់ជូននូវសំណួរអំពីប្រភេទនៃការលេងដែលអ្នកប្រើអាចចង់លេងដោយផ្អែកលើអ្វីដែលពួកគេបានសរសេរ។ Takeaways សត្វ Custom retrievers let you bake domain rules and jargon into the system. Combining multiple text fields into one index improves query understanding. In LlamaIndex you only need to implement _retrieve for a custom backend. Superlinked InMemoryExecutor gives real time latency on moderate datasets. Schema choice matters for clean parsing and mapping. Simple position based scoring is a stable default when you want predictable ranks.\ If you want a quick chat about where mixture of encoders or multi-field retrieval fits in your pipeline, ! talk to one of our engineers ប្រសិនបើអ្នកចង់ទាក់ទងយ៉ាងឆាប់រហ័សអំពីទីផ្សារនៃការកំណត់កូដឬការស្វែងរកខ្សែភាពយន្តជាច្រើនដែលអាចចូលទៅក្នុងបំពង់របស់អ្នក, ! សូមទាក់ទងជាមួយអ្នកវិស្វកររបស់យើង សូមទាក់ទងជាមួយអ្នកវិស្វកររបស់យើង សូមទាក់ទងជាមួយអ្នកវិស្វកររបស់យើង ការបណ្តុះបណ្តាល: កញ្ចប់ Superlinked Retriever នៅលើកម្មវិធី PyPI និង LlamaIndex សម្រាប់កម្មវិធី Retriever ដោយផ្ទាល់ខ្លួន។ អ្នកជំនួយ លោក Vipul Maheshwari, អ្នកនិពន្ធ លោក Filip Makraduli, អ្នកផ្លាស់ប្តូរ