برنامه نویسی

جستجوی معنایی با بوت بهار و redis

tl ؛ دکتر:
شما در حال ساخت یک برنامه جستجوی معنایی با استفاده از چکمه بهاری وت مجدداًبشر

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

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

https%3A%2F%2Fdev to

ویدئو: جستجوی معنایی چیست؟

یک سیستم جستجوگر سنتی با تطبیق کلمات یک کاربر با کلمات ذخیره شده در یک پایگاه داده یا مجموعه اسناد کار می کند. معمولاً به دنبال مسابقات دقیق یا جزئی بدون درک معنی در پشت کلمات است.

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

به عنوان مثال ، در یک سرویس پخش فیلم ، اگر خلاصه داستان یک فیلم در یک پایگاه داده ذخیره شود “یک عروسک کابوی وقتی یک اسباب بازی فضایی جدید مورد علاقه صاحب او قرار می گیرد ، احساس تهدید می کند.” اما کاربر جستجو می کند “اسباب بازی های حسادت با رقیب جدید مبارزه می کند ،” یک سیستم جستجوی سنتی ممکن است فیلم را پیدا نکند زیرا کلمات دقیق خط نمی شوند.

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

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

امروز ، ما می خواهیم یک برنامه جستجوی شباهت وکتور بسازیم که به کاربران امکان می دهد فیلم ها را بر اساس *معنی *خلاصه داستان خود پیدا کنند – نه فقط مطابقت با کلمات کلیدی دقیقبشر به طوری که حتی اگر آنها عنوان را نمی دانند ، هنوز هم می توانند فیلم مناسبی را بر اساس توضیحات عمومی از خلاصه داستان بدست آورند.

برای انجام این کار ، ما یک برنامه بوت بهار را از ابتدا می سازیم و به آن وصل می شویم redis در مورد بهاربشر این کار داده های ما را به بردارها تبدیل می کند ، آنها را در Redis ذخیره می کند و هنگام ارسال پرس و جو ، جستجوهای بردار سریع را انجام می دهد.

redis به عنوان یک بانک اطلاعاتی بردار

ویدئو: بانک اطلاعاتی بردار چیست؟

در 15 سال گذشته ، Redis به زیرساخت های بنیادی برنامه های Realtime تبدیل شد. امروز ، با Redis 8 ، متعهد شده است که به زیرساخت های بنیادی برای برنامه های هوش مصنوعی تبدیل شود.

Redis 8 نه تنها نسخه جامعه Redis را به یک پایگاه داده بردار تبدیل می کند ، بلکه آن را سریعترین و مقیاس پذیر ترین بانک اطلاعاتی امروز در بازار قرار می دهد. Redis 8 به شما امکان می دهد بدون مجازات تأخیر به یک میلیارد بردار مقیاس دهید.

بیشتر بیاموزید: https://redis.io/blog/searching-1-billion-vectors-with-redis-8/

redis در مورد بهار

به کاربران و مشتریان ما اجازه می دهد تا از همه کارهایی که Redis می تواند انجام دهد – با سرعت Redis شناخته شود – ما تصمیم گرفتیم که پیاده سازی کنیم redis در مورد بهار، کتابخانه ای که در بالای داده های بهاری ساخته شده است.

بهار redis om به کاربران ما اجازه می دهد تا به راحتی با redis ارتباط برقرار کنند ، نهادهای خود را به عنوان الگوبرداری کنید jsons یا هش ، با استفاده از آنها به طور مؤثر از آنها پرس و جو کنید موتور پرس و جو Redis و حتی از ساختارهای داده احتمالی مانند استفاده کنید Count-Min Sketch ، فیلترهای شکوفه ، فیلترهای فاخته، و بیشتر

بهار redis om on github: https://github.com/redis/redis-om-spring

مجموعه داده

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

نمونه:

{
  "title": "Toy Story",
  "year": 1995,
  "cast": [
   "Tim Allen",
   "Tom Hanks",
   "Don Rickles"
  ],
  "genres": [
   "Animated",
   "Comedy"
  ],
  "href": "Toy_Story",
  "extract": "Toy Story is a 1995 American computer-animated comedy film directed by John Lasseter, produced by Pixar Animation Studios and released by Walt Disney Pictures. The first installment in the  Toy Story franchise, it was the first entirely computer-animated feature film, as well as the first feature film from Pixar. It was written by Joss Whedon, Andrew Stanton, Joel Cohen, and Alec Sokolow from a story by Lasseter, Stanton, Pete Docter, and Joe Ranft. The film features music by Randy Newman, was produced by Bonnie Arnold and Ralph Guggenheim, and was executive-produced by Steve Jobs and Edwin Catmull. The film features the voices of Tom Hanks, Tim Allen, Don Rickles, Jim Varney, Wallace Shawn, John Ratzenberger, Annie Potts, R. Lee Ermey, John Morris, Laurie Metcalf, and Erik von Detten.",
  "thumbnail": "https://upload.wikimedia.org/wikipedia/en/1/13/Toy_Story.jpg",
  "thumbnail_width": 250,
  "thumbnail_height": 373
}
حالت تمام صفحه را وارد کنید

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

ساخت برنامه

برنامه ما با استفاده از Boot Spring با Redis Om Spring ساخته خواهد شد. این اجازه می دهد تا فیلم ها بر اساس جستجوی معنایی به جای تطبیق کلمات کلیدی ، توسط خلاصه داستان آنها جستجو شوند. ** علاوه بر آن ، برنامه ما همچنین به کاربران خود امکان می دهد ** جستجوی ترکیبی را انجام دهندبا تکنیکی که شباهت بردار را با فیلتر و مرتب سازی سنتی ترکیب می کند.

0. مخزن GitHub

** برنامه کامل را می توان در GitHub یافت: ** https: //github.com/redis/redis-om-ompring/tree/main/demos/roms-vss-movies/

1. وابستگی های مورد نیاز را اضافه کنید

از یک برنامه بوت بهار ، وابستگی های زیر را به پرونده maven یا Gradle خود اضافه کنید:



    com.redis.om.spring
    redis-om-spring
    0.9.11




    org.springframework.ai
    spring-ai-openai
    1.0.0-M6


    org.springframework.ai
    spring-ai-transformers
    1.0.0-M6

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

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

2. موجودیت فیلم را تعریف کنید

Redis Om Spring دو حاشیه نویسی را فراهم می کند که باعث می شود بردار داده ها و انجام جستجوی شباهت بردار از درون بوت بهار آسان شود.

  • Vectorize: به طور خودکار تعبیه های بردار را از قسمت متن تولید می کند

  • indexed: برای جستجوی کارآمد ، نمایه سازی بردار را در یک زمینه امکان پذیر می کند

هسته اصلی اجرای کلاس فیلم با حاشیه نویسی وکتور Redis:

@RedisHash // This annotation is used by Redis OM Spring to store the entity as a hash in Redis
public class Movie {

    @Id // IDs are automatically generated by Redis OM Spring as ULID
    private String title;

    @Indexed(sortable = true) // This annotation enables indexing on the field for filtering and sorting
    private int year;

    @Indexed
    private List cast;

    @Indexed
    private List genres;

    private String href;

    // This annotation automatically generates vector embeddings from the text
    @Vectorize(
            destination = "embeddedExtract", // The field where the embedding will be stored
            embeddingType = EmbeddingType.SENTENCE, // Type of embedding to generate (Sentence, Image, face, or word)
            provider = EmbeddingProvider.OPENAI, // The provider for generating embeddings (OpenAI, Transformers, VertexAI, etc.)
            openAiEmbeddingModel = OpenAiApi.EmbeddingModel.TEXT_EMBEDDING_3_LARGE // The specific OpenAI model to use for embeddings
    )
    private String extract;

    // This defines the vector field that will store the embeddings
    // The indexed annotation enables vector search on this field
    @Indexed(
            schemaFieldType = SchemaFieldType.VECTOR, // Defines the field type as a vector
            algorithm = VectorField.VectorAlgorithm.FLAT, // The algorithm used for vector search (FLAT or HNSW)
            type = VectorType.FLOAT32,
            dimension = 3072, // The dimension of the vector (must match the embedding model)
            distanceMetric = DistanceMetric.COSINE, // The distance metric used for similarity search (Cosine or Euclidean)
            initialCapacity = 10
    )
    private byte[] embeddedExtract;

    private String thumbnail;
    private int thumbnailWidth;
    private int thumbnailHeight;

    // Getters and setters...
}
حالت تمام صفحه را وارد کنید

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

3. رابط مخزن

یک رابط مخزن ساده که باعث افزایش مجدد مجدد Repository می شود. این برای بارگذاری داده ها با استفاده از روش SaveAll () استفاده می شود:

public interface MovieRepository extends RedisEnhancedRepository {}
حالت تمام صفحه را وارد کنید

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

این عملیات اصلی CRUD را برای موجودات فیلم فراهم می کند ، با اولین پارامتر عمومی نوع موجودیت و نوع دوم نوع ID است.

4. سرویس جستجو

سرویس جستجو از دو لوبیای ارائه شده توسط Redis Om Spring استفاده می کند:

  • EntityStream: برای ایجاد یک جریان از نهادها برای انجام جستجو. جریان نهاد نباید با API Java Streams اشتباه گرفته شود. جریان موجودیت یک دستور redis ایجاد می کند که به Redis ارسال می شود تا Redis بتواند جستجو ، فیلتر و مرتب سازی را به طور کارآمد در سمت خود انجام دهد.

  • تعبیه: برای تولید تعبیه برای پرس و جو ارسال شده توسط کاربر استفاده می شود. پس از پیکربندی حاشیه نویسی Vectorize تعریف شده در کلاس فیلم تولید می شود/

عملکرد جستجو در SearchService اجرا می شود:

@Service
public class SearchService {

    private static final Logger logger = LoggerFactory.getLogger(SearchService.class);
    private final EntityStream entityStream;
    private final Embedder embedder;

    public SearchService(EntityStream entityStream, Embedder embedder) {
        this.entityStream = entityStream;
        this.embedder = embedder;
    }

    public List> search(
            String query,
            Integer yearMin,
            Integer yearMax,
            List cast,
            List genres,
            Integer numberOfNearestNeighbors) {
        logger.info("Received text: {}", query);
        logger.info("Received yearMin: {} yearMax: {}", yearMin, yearMax);
        logger.info("Received cast: {}", cast);
        logger.info("Received genres: {}", genres);

        if (numberOfNearestNeighbors == null) numberOfNearestNeighbors = 3;
        if (yearMin == null) yearMin = 1900;
        if (yearMax == null) yearMax = 2100;

        // Convert query text to vector embedding
        byte[] embeddedQuery = embedder.getTextEmbeddingsAsBytes(List.of(query), Movie$.EXTRACT).getFirst();

        // Perform vector search with additional filters
        SearchStream stream = entityStream.of(Movie.class);
        return stream
                // KNN search for nearest vectors
                .filter(Movie$.EMBEDDED_EXTRACT.knn(numberOfNearestNeighbors, embeddedQuery))
                // Additional metadata filters (hybrid search)
                .filter(Movie$.YEAR.between(yearMin, yearMax))
                .filter(Movie$.CAST.eq(cast))
                .filter(Movie$.GENRES.eq(genres))
                // Sort by similarity score
                .sorted(Movie$._EMBEDDED_EXTRACT_SCORE)
                // Return both the movie and its similarity score
                .map(Fields.of(Movie$._THIS, Movie$._EMBEDDED_EXTRACT_SCORE))
                .collect(Collectors.toList());
    }
}
حالت تمام صفحه را وارد کنید

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

ویژگی های اصلی سرویس جستجو:

  • از EntityStream برای ایجاد جریان جستجو برای موجودات فیلم استفاده می کند

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

  • از جستجوی K-Nearest همسایگان (KNN) برای یافتن بردارهای مشابه استفاده می کند

  • فیلترهای اضافی را برای جستجوی ترکیبی اعمال می کند (ترکیب بردار و جستجوی سنتی)

  • جفت فیلم ها و نمرات شباهت آنها را برمی گرداند

5. سرویس فیلم برای بارگیری داده ها

Movieservice بارگیری داده های فیلم را به Redis می رساند. این یک پرونده JSON حاوی تاریخ فیلم را می خواند و فیلم ها را در Redis ذخیره می کند.

ممکن است یک یا دو دقیقه طول بکشد تا داده ها برای هزاران فیلم در پرونده بارگیری شود زیرا نسل تعبیه در پس زمینه انجام می شود. حاشیه نویسی Vectorize قبل از ذخیره فیلم در Redis ، تعبیه برای زمینه عصاره ایجاد می کند.

@Service
public class MovieService {

    private static final Logger log = LoggerFactory.getLogger(MovieService.class);
    private final ObjectMapper objectMapper;
    private final ResourceLoader resourceLoader;
    private final MovieRepository movieRepository;

    public MovieService(ObjectMapper objectMapper, ResourceLoader resourceLoader, MovieRepository movieRepository) {
        this.objectMapper = objectMapper;
        this.resourceLoader = resourceLoader;
        this.movieRepository = movieRepository;
    }

    public void loadAndSaveMovies(String filePath) throws Exception {
        Resource resource = resourceLoader.getResource("classpath:" + filePath);
        try (InputStream is = resource.getInputStream()) {
            List movies = objectMapper.readValue(is, new TypeReference<>() {});
            List unprocessedMovies = movies.stream()
                    .filter(movie -> !movieRepository.existsById(movie.getTitle()) &&
                            movie.getYear() > 1980
                    ).toList();
            long systemMillis = System.currentTimeMillis();
            movieRepository.saveAll(unprocessedMovies);
            long elapsedMillis = System.currentTimeMillis() - systemMillis;
            log.info("Saved " + movies.size() + " movies in " + elapsedMillis + " ms");
        }
    }

    public boolean isDataLoaded() {
        return movieRepository.count() > 0;
    }
}
حالت تمام صفحه را وارد کنید

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

5. کنترل کننده جستجو

کنترلر REST نقطه پایانی جستجو را در معرض نمایش قرار می دهد:

@RestController
public class SearchController {

    private final SearchService searchService;

    public SearchController(SearchService searchService) {
        this.searchService = searchService;
    }

    @GetMapping("/search")
    public Map search(
            @RequestParam(required = false) String text,
            @RequestParam(required = false) Integer yearMin,
            @RequestParam(required = false) Integer yearMax,
            @RequestParam(required = false) List cast,
            @RequestParam(required = false) List genres,
            @RequestParam(required = false) Integer numberOfNearestNeighbors
    ) {
        List> matchedMovies = searchService.search(
                text,
                yearMin,
                yearMax,
                cast,
                genres,
                numberOfNearestNeighbors
        );
        return Map.of(
                "matchedMovies", matchedMovies,
                "count", matchedMovies.size()
        );
    }
}
حالت تمام صفحه را وارد کنید

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

6. بوت استرپ

کلاس برنامه اصلی REDIS OM Spring را آغاز می کند و داده ها را بارگیری می کند. حاشیه نویسی EnabledisEnhancedReposities پشتیبانی مخزن Redis Om Spring را فعال می کند:

@SpringBootApplication
@EnableRedisEnhancedRepositories(basePackages = {"dev.raphaeldelio.redis8demo*"})
public class Redis8DemoVectorSimilaritySearchApplication {

    public static void main(String[] args) {
        SpringApplication.run(Redis8DemoVectorSimilaritySearchApplication.class, args);
    }

    @Bean
    CommandLineRunner loadData(MovieService movieService) {
        return args -> {
            if (movieService.isDataLoaded()) {
                System.out.println("Data already loaded. Skipping data load.");
                return;
            }
            movieService.loadAndSaveMovies("movies.json");
        };
    }
}
حالت تمام صفحه را وارد کنید

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

7. درخواست های نمونه

می توانید به نقطه پایانی جستجو درخواست کنید:

GET http://localhost:8082/search?text=A movie about a young boy who goes to a wizardry school

GET http://localhost:8082/search?numberOfNearestNeighbors=1&yearMin=1970&yearMax=1990&text=A movie about a kid and a scientist who go back in time

GET http://localhost:8082/search?cast=Dee Wallace,Henry Thomas&text=A boy who becomes friend with an alien
حالت تمام صفحه را وارد کنید

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

درخواست نمونه:

GET http://localhost:8082/search?numberOfNearestNeighbors=1&yearMin=1970&yearMax=1990&text=A movie about a kid and a scientist who go back in time
حالت تمام صفحه را وارد کنید

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

پاسخ نمونه:

{
"count": 1,
"matchedMovies": [
{
"first": { // matched movie
"title": "Back to the Future",
"year": 1985,
"cast": [
"Michael J. Fox",
"Christopher Lloyd"
],
"genres": [
"Science Fiction"
],
"extract": "Back to the Future is a 1985 American science fiction film directed by Robert Zemeckis and written by Zemeckis, and Bob Gale. It stars Michael J. Fox, Christopher Lloyd, Lea Thompson, Crispin Glover, and Thomas F. Wilson. Set in 1985, it follows Marty McFly (Fox), a teenager accidentally sent back to 1955 in a time-traveling DeLorean automobile built by his eccentric scientist friend Emmett \"Doc\" Brown (Lloyd), where he inadvertently prevents his future parents from falling in love – threatening his own existence – and is forced to reconcile them and somehow get back to the future.",
"thumbnail": "https://upload.wikimedia.org/wikipedia/en/d/d2/Back_to_the_Future.jpg"
},
"second": 0.463297247887 // similarity score (the lowest the closest)
}
]
}
حالت تمام صفحه را وارد کنید

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

پیچیدن

و این همان است – شما اکنون یک برنامه جستجوی معنایی کار با استفاده از Spring Boot و Redis دارید.

برنامه شما به جای تکیه بر مسابقات دقیق کلمات کلیدی ، معنای پشت پرس و جو را درک می کند. Redis بخش سنگین را کنترل می کند: تعبیه ذخیره سازی ، جستجوی شباهت و حتی فیلترهای سنتی – همه با سرعت رعد و برق.

با استفاده از بهار redis om ، شما راهی آسان برای ادغام این برنامه در برنامه های جاوا دریافت می کنید. شما فقط به دو حاشیه نویسی نیاز دارید: Vectorize و Indexed و دو لوبیا: EntityStream و Embedder.

این که آیا شما در حال ساخت جستجو ، توصیه ها یا دستیاران دارای هوش مصنوعی هستید ، این مجموعه یک پایه محکم و مقیاس پذیر به شما می دهد.

آن را امتحان کنید ، فیلترها را تغییر دهید ، مدل های دیگر را کاوش کنید و ببینید که چقدر می توانید بروید!

منابع هوش مصنوعی بیشتر

بهترین راه برای ماندن در مسیر یادگیری هوش مصنوعی ، پیروی از دستور العمل های موجود در مخزن GitHub Redis AI Resources است. در آنجا می توانید ده ها دستور العمل پیدا کنید که شما را به ساخت برنامه های AI سریع ، سریع!

GitHub-Redis-Developer/Redis-Ai-Resources: ✨ لیستی از منابع عالی جامعه ، ادغام ها و نمونه هایی از Redis در اکوسیستم AI.

کنجکاو بمان!

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

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

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

دکمه بازگشت به بالا