SemanticKernel с функциями плагина и векторной базой данных на C#C#

Место общения программистов C#
Ответить
Anonymous
 SemanticKernel с функциями плагина и векторной базой данных на C#

Сообщение Anonymous »

Для начала я хотел бы объяснить, чего я хочу достичь. Моя цель — создать бота с искусственным интеллектом, который будет действовать как помощник в отеле и сможет предоставлять пользователям любую информацию, связанную с отелем, которую они запрашивают. Он должен отвечать на основе ввода пользователя, с возможностью проверки наличия номеров и цен на определенные даты.
Я уже реализовал функцию наличия номеров. Для этого используется функция ядра, которая принимает в качестве параметров checkInDate, checkOutDate и список объектов комнаты (например, две комнаты, одна для 1 взрослого, другая для 2 взрослых и ребенка 6 лет).
Эта часть работает хорошо. Например, когда я спрашиваю: «Есть ли номер для 2 взрослых с 7 по 14 ноября?» он предоставляет точную информацию на основе подключения API через плагин.
Проблема возникает с выводом функции ядра, который в настоящее время является большим и сложным из-за подробной схемы, содержащей обширные данные о пакете и комнате. . Для этой обработки требуется много токенов, и я сталкиваюсь с ошибкой 429:

Запросы к операции ChatCompletions_Create в Azure OpenAI API версии 2023 -07-01-preview превысили лимит скорости токена вашей текущей ценовой категории OpenAI S0. Повторите попытку через 50 секунд. Пожалуйста, перейдите сюда: https://aka.ms/oai/quottaincrease, если вы хотите еще больше увеличить предел скорости по умолчанию.

Чтобы уменьшить токен load, я подумал о том, чтобы разделить ответ на две части
а) динамические данные (например, цена)
б) Статические (или нечасто меняющиеся) данные (например, описания пакетов, описания номеров и т. д.).
Этот подход предполагает объединение функции ядра с векторной базой данных для хранения описаний комнат и пакетов, поскольку они меняются нечасто.
Вторая цель — дать возможность боту «узнавать» об отеле, чтобы отвечать на вопросы об отеле (например, время заезда, наличие бассейна, варианты парковки и т. д.).
Я для этого можно использовать точно настроенную модель, но и векторная база данных, которая периодически обновляется, также может работать хорошо. Однако, поскольку я никогда раньше не работал с векторной базой данных, я не знаю, как загружать в нее данные или интегрировать их с моим текущим вариантом использования.
Итак, мой главный вопрос: как я могу эффективно объединить функцию ядра с этой векторной базой данных?
То, что у меня сейчас есть, взято из: https://github.com/PieEatingNinjas /copilot-semantickernel/tree/demo и адаптирован к моему варианту использования (получение информации о тарифах отелей)

Код: Выделить всё

var builder = Kernel.CreateBuilder();

builder.Services.AddAzureOpenAIChatCompletion(
"gpt-4o-mini",
Secrets.AzureOpenAiEndpoint,
Secrets.AzureOpenAiApiKey
);

builder.Plugins.AddFromType();
builder.Plugins.AddFromType();

Kernel kernel = builder.Build();

IChatCompletionService chatCompletionService =
kernel.GetRequiredService();

var systemMessage = HotelBotCore.MainMessage;
/*
Here message is something like: "You are friendly bot that is serving information about hotel. People may ask information about hote rates. To check those you have to have information about check in date, check out date and information about rooms and people in those rooms.  When presenting those rates show information about package name, room type name, price and meals [And so on, and so on]
*/
var chatMessages = new ChatHistory(systemMessage);

Console.WriteLine("--- Hotel info ---");

Console.WriteLine("Bot > How may i help you");

// Start the conversation
while (true)
{
// Get user input
Console.Write("User > ");
chatMessages.AddUserMessage(Console.ReadLine()!);

// Get the chat completions
var result =
chatCompletionService.GetStreamingChatMessageContentsAsync(
chatMessages,
executionSettings: new OpenAIPromptExecutionSettings()
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
Temperature = 0.2
},
kernel: kernel);

// Stream the results
string fullMessage = "";

Console.Write("Bot > ");

await foreach (var content in result)
{
Console.Write(content.Content);
fullMessage += content.Content;
}

Console.WriteLine();

// Add the message from the agent to the chat history
chatMessages.AddAssistantMessage(fullMessage);
}
Просто чтобы добавить немного больше контекста к данным. Давайте представим, что функция ядра в первой версии возвращала данные в таком виде (разумеется, изначально полей было гораздо больше):

Код: Выделить всё

{
"PackageId": 1
"PackageName": "Package 1"
"PackageDescription": "Some long description"
"PackageRooms":
[
{
"RoomId": 1
"RoomDescription": "Long description"
"RoomPrice": 123
},
{
"RoomId": 2
"RoomDescription": "Another long description"
"RoomPrice": 456
}
]
}
Я изменил модель, сделав ее проще:

Код: Выделить всё

{
"PackageId": 1
"PackageName": "Package 1"
"PackageRooms":
[
{
"RoomId": 1
"RoomPrice": 123
},
{
"RoomId": 2
"RoomPrice": 456
}
]
}
И теперь я ожидаю, что этот AI-бот будет извлекать данные об этих комнатах из векторной базы данных при представлении результатов. это возможно? Если нет, я бы попросил совета, как преодолеть эту проблему с токенами, которую я наблюдаю.
Но даже если векторная база данных не является ответом на первую проблему, представленную выше, вероятно, это так. ответ на вторую проблему (т.е. предоставление дополнительной информации о самом отеле, когда его спросят) Чтобы, если кто-то спросит:

Код: Выделить всё

At what time do I need to check out of my room?
Эта информация будет взята из какой-то векторной базы данных, которую я бы подготовил «как-то» (все равно понадобится совет, какие у меня есть варианты). Потому что, например, я видел векторные хранилища в Azure OpenAI studio.
Изображение

Вы можете загрузить туда PDF-файл. Но я понятия не имею, как связать это с моим кодом

Подробнее здесь: https://stackoverflow.com/questions/791 ... th-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»