Использование модели встраивания текста локально с семантическим ядром

Я читал пост в блоге Стивена Тауба о создании простого консольного чат-приложения .NET с нуля с помощью семантического ядра. Я следую примерам, но вместо OpenAI хочу использовать Microsoft Phi 3 и модель встраивания nomic. Первые примеры в блоге я смог воссоздать с помощью плагина семантического ядраhuggingface. Но я не могу запустить пример встраивания текста.

Я загрузил текст для встраивания Phi и nomic и запускаю их на локальном сервере с помощью lm studio.

Вот код, который я придумал и использует плагин Huggingface:

using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Embeddings;
using Microsoft.SemanticKernel.Memory;
using System.Numerics.Tensors;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel.ChatCompletion;

#pragma warning disable SKEXP0070, SKEXP0003, SKEXP0001, SKEXP0011, SKEXP0052, SKEXP0055, SKEXP0050  // Type is for evaluation purposes only and is subject to change or removal in future updates. 

internal class Program
{
    private static async Task Main(string[] args)
    {
        //Suppress this diagnostic to proceed.
        // Initialize the Semantic kernel
        IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
        kernelBuilder.Services.ConfigureHttpClientDefaults(c => c.AddStandardResilienceHandler());
        var kernel = kernelBuilder
            .AddHuggingFaceTextEmbeddingGeneration("nomic-ai/nomic-embed-text-v1.5-GGUF/nomic-embed-text-v1.5.Q8_0.gguf",
            new Uri("http://localhost:1234/v1"),
            apiKey: "lm-studio",
            serviceId: null)
            .Build();

        var embeddingGenerator = kernel.GetRequiredService<ITextEmbeddingGenerationService>();
        var memoryBuilder = new MemoryBuilder();
        memoryBuilder.WithTextEmbeddingGeneration(embeddingGenerator);
        memoryBuilder.WithMemoryStore(new VolatileMemoryStore());
        var memory = memoryBuilder.Build();
        // Download a document and create embeddings for it
        string input = "What is an amphibian?";
        string[] examples = [ "What is an amphibian?",
                              "Cos'è un anfibio?",
                              "A frog is an amphibian.",
                              "Frogs, toads, and salamanders are all examples.",
                              "Amphibians are four-limbed and ectothermic vertebrates of the class Amphibia.",
                              "They are four-limbed and ectothermic vertebrates.",
                              "A frog is green.",
                              "A tree is green.",
                              "It's not easy bein' green.",
                              "A dog is a mammal.",
                              "A dog is a man's best friend.",
                              "You ain't never had a friend like me.",
                              "Rachel, Monica, Phoebe, Joey, Chandler, Ross"];
        for (int i = 0; i < examples.Length; i++)
            await memory.SaveInformationAsync("net7perf", examples[i], $"paragraph{i}");
        var embed = await embeddingGenerator.GenerateEmbeddingsAsync([input]);
        ReadOnlyMemory<float> inputEmbedding = (embed)[0];
        // Generate embeddings for each chunk.
        IList<ReadOnlyMemory<float>> embeddings = await embeddingGenerator.GenerateEmbeddingsAsync(examples);
        // Print the cosine similarity between the input and each example
        float[] similarity = embeddings.Select(e => TensorPrimitives.CosineSimilarity(e.Span, inputEmbedding.Span)).ToArray();
        similarity.AsSpan().Sort(examples.AsSpan(), (f1, f2) => f2.CompareTo(f1));
        Console.WriteLine("Similarity Example");
        for (int i = 0; i < similarity.Length; i++)
            Console.WriteLine($"{similarity[i]:F6}   {examples[i]}");
    }
}

На линии:

for (int i = 0; i < examples.Length; i++)
    await memory.SaveInformationAsync("net7perf", examples[i], $"paragraph{i}");

Я получаю следующее исключение:

JsonException: значение JSON не удалось преобразовать в Microsoft.SemanticKernel.Connectors.HuggingFace.Core.TextEmbeddingResponse

Кто-нибудь знает, что я делаю неправильно?

Я загрузил в проект следующие пакеты nuget:

Идентификатор Версии Название проекта Microsoft.SemanticKernel.Core {1.15.0} LocalLlmApp Microsoft.SemanticKernel.Plugins.Memory {1.15.0-альфа} LocalLlmApp Microsoft.Extensions.Http.Resilience {8.6.0} LocalLlmApp Microsoft.Extensions.Logging {8.0.0} LocalLlmApp Microsoft.SemanticKernel.Connectors.HuggingFace {1.15.0-предварительный просмотр} LocalLlmApp Ньютонсофт.Json {13.0.3} LocalLlmApp Microsoft.Extensions.Logging.Console {8.0.0} LocalLlmApp
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
339
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что вы не можете использовать AddHuggingFaceTextEmbeddingGeneration с встраиваемой моделью от LM Studio из коробки. Причина в том, что HuggingFaceClient внутренне меняет URL-адрес и добавляет:

конвейер/извлечение функций/

 private Uri GetEmbeddingGenerationEndpoint(string modelId)
     => new($"{this.Endpoint}{this.Separator}pipeline/feature-extraction/{modelId}");

Это то же сообщение об ошибке, которое я получаю в консоли LM Studio:

[2024-07-03 22:18:19.898] [ОШИБКА] Неожиданная конечная точка или метод. (ПОЧТА /v1/embedding/pipeline/feature-extraction/nomic-ai/nomic-embed-text-v1.5-GGUF/nomic-embed-text-v1.5.Q5_K_M.gguf). Все равно вернуть 200

Чтобы это работало, необходимо изменить URL-адрес.

Ответ принят как подходящий

Я нашел решение этой проблемы благодаря сообщению в блоге Бруно Капуано о создании локального сценария RAG с использованием Phi-3 и SemanticKernel.

Код до строки string input = "What is an amphibian?"; теперь выглядит так:

    // Initialize the Semantic kernel
    IKernelBuilder kernelBuilder = Kernel.CreateBuilder();

    Kernel kernel = kernelBuilder
        .AddOpenAIChatCompletion(
                    modelId: "phi3",
                endpoint: new Uri("http://localhost:1234"),
                apiKey: "lm-studio")
        .AddLocalTextEmbeddingGeneration()
        .Build();

    // get the embeddings generator service
    var embeddingGenerator = kernel.Services.GetRequiredService<ITextEmbeddingGenerationService>();
    var memory = new SemanticTextMemory(new VolatileMemoryStore(), embeddingGenerator);

Поэтому, хотя мы и не используем OpenAI, мы все равно можем использовать метод AddOpenAIChatCompletion.

Метод AddLocalTextEmbeddingGeneration() взят из пакета SmartComponents.LocalEmbeddings.SemanticKernel Nuget.

Я написал небольшую консольную программу с большинством примеров из сообщений в блоге. Вы можете найти его на github

Другие вопросы по теме