Home » Упрощение управления контентом с помощью локального искусственного интеллекта с помощью LLAMA и Optimizely 12 – Codevelo.us

Упрощение управления контентом с помощью локального искусственного интеллекта с помощью LLAMA и Optimizely 12 – Codevelo.us

В современном быстро меняющемся мире цифрового контента эффективность редакторов контента имеет важное значение. Одной из трудоемких задач редакторов контента является заполнение метаданных веб-страниц. Но что, если мы скажем вам, что есть решение, которое может автоматизировать этот процесс?

В этом сообщении блога мы рассмотрим, как языковая модель LLama может помочь редакторам контента путем автоматического создания полей метаданных в Optimizely CMS 12.

Создание моделей контента:

Начнем с создания фундамента. Мы создадим определение страницы контента с помощью Optimizely CMS 12, реализуя интерфейс IContentPage. Этот интерфейс будет определять ключевые поля метаданных, которые мы хотим, чтобы LLama автоматически заполняла.

public interface IContentPage
{
    public XhtmlString? Content { get; set; }
    public string? MetaTitle { get; set; }
    public IList? MetaKeywords { get; set; }
    public string? MetaDescription { get; set; }
}

[ContentType(
    DisplayName = "Content Page",
    Description = "Displays a Content Page",
    GUID = "19671657-B684-4D95-A61F-8DD4FE60D559",
    GroupName = "Content")]
public class ContentPage : PageData, IContentPage
{
    // ... Properties and attributes
}

Подключение к событию публикации:

Теперь, когда наше моделирование завершено, давайте подключимся к жизненному циклу публикации контента. Этого можно достичь за несколько шагов. Сначала создайте прослушиватель событий, подключитесь к событию публикации и добавьте прослушиватель событий в контейнер IoC. Убедитесь, что вы подключились к правильному событию, поскольку опубликованное событие будет слишком поздно в жизненном цикле публикации. Наконец, создайте модуль инициализации, чтобы добавить новый прослушиватель событий.

public class ContentEventListener
{
    private readonly IContentEvents _contentEvents;
    private readonly ILLamaService _lLamaService;

    public ContentEventListener(
        IContentEvents contentEvents,
        ILLamaService lLamaService)
    {
        _contentEvents = contentEvents;
        _lLamaService = lLamaService;
    }

    public void AddEvents()
    {
        _contentEvents.PublishingContent += _contentEvents_PublishingContent;
    }

    private void _contentEvents_PublishingContent(object? sender, ContentEventArgs e)
    {
        if (e.Content is not IContentPage contentPage) return;

        // Get content without HTML (Be aware of the LM size limit) 
        var pageContent = contentPage.Content?.GetWithoutMarkup() ?? string.Empty;
        pageContent = pageContent.Length > 500 ? pageContent.Substring(0, 500) : pageContent;

        // Ask for a Meta title/ description and keywords based on the content
        var metaInformation = _lLamaService.GetMetaInformation(pageContent);

        // Fill in the data
        contentPage.MetaDescription = metaInformation.MetaDescription;
        contentPage.MetaTitle = metaInformation.MetaTitle;
        contentPage.MetaKeywords = metaInformation.MetaKeywords;
    }
}

[InitializableModule]
[ModuleDependency(typeof(EPiServer.Initialization.CmsCoreInitialization))]
public class ContentEventsSubscriber : IInitializableModule
{
    public void Initialize(InitializationEngine context)
    {
        context.Locate.Advanced.GetInstance().AddEvents();
    }

    public void Uninitialize(InitializationEngine context)
    {

    }
}

Генерация метаинформации:

При наличии обработки событий следующая задача — дать указание LLama генерировать метаданные на основе контента, предоставленного редактором контента. В этом разделе мы углубимся в процесс общения с LLama, указав инструкции и форматирование вывода метаданных.

Нашей отправной точкой является результат нашего предыдущего блога: Наши первые шаги в области локального искусственного интеллекта.

public interface ILLamaService
{
    MetaInformation GetMetaInformation(string content);
}
public class LLamaService : ILLamaService
{
    private readonly IWebHostEnvironment _env;
    private LLamaWeights? _model;
    private ModelParams? _parameters;

    public LLamaService(IWebHostEnvironment env)
    {
        _env = env;

        Initialize();
    }

    public MetaInformation? GetMetaInformation(string content)
    {
        if (_model == null || _parameters == null)
        {
            // Could not be initialized. Return here
            return new MetaInformation();
        }

        // Initialize a chat session
        using var context = _model.CreateContext(_parameters);

        var ex = new InstructExecutor(context);
        var session = new ChatSession(ex);

        var prompt = "Hi Alice, how are you doing?";

        var inter = new InferenceParams
        {
            Temperature = 0.1f
        };

        foreach (var text in session.Chat(prompt, inter))
        {
            Console.Write(text);
            Debug.Write(text);
        }

        return new MetaInformation();
    }

    private void Initialize()
    {
        var appDataFolder = Path.Combine(_env.ContentRootPath, "App_Data");
        var modelPath = Directory.GetFiles(appDataFolder).FirstOrDefault(file => file.EndsWith(".gguf"));

        if (string.IsNullOrEmpty(modelPath))
        {
            return;
        }

        _parameters = new ModelParams(modelPath)
        {
            ContextSize = 1024,
            Seed = 1337,
            GpuLayerCount = 5,

        };

        _model = LLamaWeights.LoadFromFile(_parameters);
    }
}

Мы хотим, чтобы языковая модель генерировала метаинформацию на основе текста, предоставленного редактором контента. Мы уже получаем контент в Получить метаинформацию метод, хотя на данный момент он не используется. Позже она должна стать частью переменной подсказки. Давайте посмотрим, что происходит, когда мы просим модель обобщить текст и создать мета-заголовок, описание и ключевые слова.

Read more:  Джеффри Хинтон: пионер искусственного интеллекта Джеффри Хинтон говорит, что его угроза миру может быть «более острой», чем изменение климата

Обратите внимание, как мы настроили InferenceParams.Температура до 0,1ф. При использовании более высокой температуры модель будет проявлять больше «креативности», а при более низкой температуре модель будет «менее креативной». Мы не хотим, чтобы модель придумывала ошибки при обобщении текстов.

Обучение языковой модели:

Прежде чем продолжить, давайте обсудим строку var ex = новый InstructExecutor (контекст). Выбор исполнителя может повлиять на результат, и LLama поставляется с тремя исполнителями по умолчанию: InstructExecutor, InteractiveExecutor и StatelessExecutor.

ИнтерактивныйИсполнитель хорошо подойдет для общения. ИнструктЭкзекутор за предоставление инструкций. Если ваши входные данные довольно просты и выполняются одноразово, режим без сохранения состояния будет хорошим выбором. Мы будем использовать ИнструктЭкзекутор для предоставления конкретных инструкций языковой модели.

Начнем с того, что убедимся, что модель понимает свое назначение. Мы спросим его, ясно ли, что нужно сделать. Используется следующая подсказка:

[INST]
<>
You are a Website SEO specialist and can make summaries of text I send to you
<>
What is your task? [/INST] 

И в результате получается вывод:

As a Website SEO specialist, my task is to analyze and summarize the text you provide me with. 
I can help you optimize your website's content for search engines by identifying the most important keywords and phrases, and creating concise and informative summaries of the text. Please provide me with the text you would like me to summarize, and I will get started!

Модель реагирует четким пониманием задачи.

Тестирование суммирования LLama и вывода JSON:

Мы начали с того, что поручил LLama суммировать содержимое, используя содержимое страницы со следующей подсказкой, где {content} — это фактический контент, полученный в методе. Получить метаинформацию:

[INST]
<>
You are a Website SEO specialist and can make summaries of text I send to you.
<>
Summarize the following text and generate a Meta Title, Description, and Keywords:
Text: [{content}]
[/INST] 

Результаты были впечатляющими:

Meta Title: "Domesticated Cats: A Comprehensive Guide"
Description: Learn everything you need to know about domesticated cats, including their history, behavior, and role as pets. Discover the unique characteristics of this species and how they differ from their wild counterparts.
Keywords: domesticated cats, Felis catus, house cats, pet cats, companionship, hunting ability.

Далее мы протестировали способность LLama выводить обобщенную информацию в формате JSON, что важно для интеграции в ваш код. Мы предоставили образец объекта JSON и включили его в приглашение, чтобы модель использовала его формат.

var metaDummyObject = new
{
   MetaTitle = "",
   MetaDescription = "",
   MetaKeywords = "",
};
var metaDummyObjectJson = JsonConvert.SerializeObject(metaDummyObject);

Сериализованная строка «metaDummyObjectJson» вставляется в текст приглашения, выводя желаемый формат JSON.

[INST]
<>
You are a Website SEO specialist and can make summaries of text I send to you.
<>
Summarize the following text and generate a JSON object with Meta Title, Description, and Keywords:
Text: [{content}]
JSON format:
{
  "MetaTitle":"Value",
  "MetaKeywords":["Value"],
  "MetaDescription":"Value"
}
[/INST]

Результат:

Sure, I can help you with that! Here's a summary of the text you provided:
Meta Title: The Domestic Cat - A Small Carnivorous Mammal
Meta Keywords: domestic cat, house cat, Felidae, companionship, hunting ability
Meta Description: Learn about the domestic cat, a small carnivorous mammal commonly kept as a pet and valued for its companionship and hunting abilities.

Here's the JSON format you requested:
{
"MetaTitle": "The Domestic Cat - A Small Carnivorous Mammal",
"MetaKeywords": ["domestic cat", "house cat", "Felidae", "companionship", "hunting ability"],
"MetaDescription": "Learn about the domestic cat, a small carnivorous mammal commonly kept as a pet and valued for its companionship and hunting abilities."
}
I hope this helps! Let me know

Большой! Понятно, что модель понимает концепцию JSON и структуру нашего объекта. Однако мы столкнулись с проблемой: модель включает в ответ дополнительный текст, что затрудняет прямую десериализацию вывода в объект JSON.

Read more:  Политика и культура США, геополитика, Северо-Восточная Азия, Китай, Geostrategy-Direct, международная безопасность, корпоративное наблюдение, наблюдение за СМИ

Мы ввели в приглашение параметр «Только JSON: true» и включили инструкцию «без вводного предложения». Целью этой корректировки является явный запрос модели о том, что нам нужен ответ, содержащий только объект JSON, без какого-либо вводного текста.

Мы попробовали следующую подсказку:

INST]
<>
You are a Website SEO specialist and can make summaries of text I send to you.
<>
Generate a JSON object of the summarized text with Meta Title, Description, and Keywords without the introductory sentence:

Text: [{content}]
JSON only: true
JSON format:
{"MetaTitle":"Value","MetaKeywords":["Value"],"MetaDescription":"Value"}
[/INST]

Resulting in the output:

Sure, here is the summarized text in JSON format:
{
"MetaTitle": "Domesticated Cat",
"MetaKeywords": ["cat", "Felis catus", "domesticated species", "house cat", "pet", "farm cat", "feral cat"],
"MetaDescription": "The domesticated cat (Felis catus) is a small carnivorous mammal that is the only domesticated species in the family Felidae. Cats are commonly kept as pets, but can also be farm or feral cats, with the feral cat ranging freely and avoiding human contact."
}

Сложность модели в создании чистого вывода JSON может быть связана с ее относительно небольшим размером. Мы попробовали несколько подходов к извлечению данных JSON.

Вы можете выбрать один подход, который предполагает ручное удаление всего текста, который появляется перед открывающей фигурной скобкой ‘{‘. Таким образом, вы можете отделить и извлечь данные JSON ответа.

В качестве альтернативы мы могли бы реализовать стратегию двух подсказок. В первом приглашении мы дали указание модели создать объект JSON, содержащий мета-заголовок, описание и ключевые слова, явно указав, что вводный текст включать не следует. Во втором приглашении мы предоставили фактический текст, который нужно резюмировать. Этот метод позволил нам более эффективно управлять моделью, что привело к более чистому выводу JSON.

Read more:  Исследователи заставили ChatGPT раскрывать личные данные пользователя с помощью простой подсказки

Первая подсказка:

[INST]
<>You are a Website SEO specialist and can make summaries of text I send to you.
<>
Generate a JSON object of the summarized text with Meta Title, Description, and Keywords without the introductory sentence of the text I sent to you

JSON format:
{"MetaTitle":"Value","MetaKeywords":["Value"],"MetaDescription":"Value"} 
[/INST]

Выведите первое приглашение:

Of course! Please provide the text you'd like me to summarize, and I will create a JSON object with the relevant metadata.

Выведите второе приглашение:

{
"MetaTitle": "Domesticated Cat",
"MetaKeywords": ["Felis catus", "domestic cat", "house cat", "companionship", "killing"],
"MetaDescription": "The domesticated cat (Felis catus) is a small carnivorous mammal that is commonly kept as a pet and valued for its ability to kill."
}

Процесс прошел гладко. Однако мы столкнулись с другой проблемой: языковая модель использует символ «>», чтобы сигнализировать о завершении ответа и указать, что настала очередь пользователя продолжить. Чтобы обойти эту проблему, мы просто удалили завершающий символ «>» из строки ответа перед ее анализом в объект JSON.

Имейте в виду, что время отклика модели может различаться, поэтому может потребоваться некоторое терпение при ожидании генерации выходных данных.

Вот и все. Приятного кодирования и общения!

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.