Консольное приложение AI Ollama, передайте изображение в LLM с помощью KernelFunction.C#

Место общения программистов C#
Ответить
Anonymous
 Консольное приложение AI Ollama, передайте изображение в LLM с помощью KernelFunction.

Сообщение Anonymous »

Я пишу чат-бота с искусственным интеллектом — консольное приложение, написанное на .NET 9 C# с использованием Visual Studio 2022. Я работаю в Windows 11 и использую Ollama версии 0.12.10, которая работает на:
http://localhost:11434
http://localhost:11434/v1 (for Kernel.CreateBuilder().AddOpenAIChatCompletion)

Модель (LLM) — qwen3-vl.
У меня возник тайм-аут при передаче вопроса в LLM. Вот шаги:
1. Я пропускаю вопрос:
What's in this picture? "C:\\Temp\Picture 1-1.png”

2. ИИ некоторое время думает, затем вызывает KernelFunction FileContentsPlugin.cs ImageFileSearchAsync, который я написал, передавая «C:\\Temp\Picture 1-1.png» в качестве пути к файлу.
3. KernelFunction возвращает строку base64:
$data:image/jpeg;base64,{base64String}

4. Затем ИИ отключается через 100 секунд. Я увеличил время ожидания, но это не изменило ситуацию. Код, на котором он зависает:
await foreach (ChatMessageContent content in chat.InvokeAsync())

У меня также есть еще одна KernelFunction, которая обращается к документу Word, извлекает весь текст и передает обратно строку, которая понимается и выполняется LLM.
Я также пробовал использовать AddOllamaChatCompletion, но время ожидания также истекает.
Я использую следующие SDK:
  • Microsoft.SemanticKernel v1.66
  • Microsoft.SemanticKernel.Agents.Core v1.66
  • Microsoft.SemanticKernel.Connectors.Ollama v.1.66
  • Microsoft.SemanticKernel.Agents.Core v1.66
  • Различные другие пакеты.
Будем благодарны за любую помощь. Спасибо!
Вот пример моего кода (не полностью):
OpenAIChatExample.cs

interface IOpenAIChatExample
{
void Start();
}

internal class OpenAIChatExample : IOllamaChatExample
{
private readonly ILoggerFactory _logger;
private readonly IChatCompletionService _chatCompletionService;
private readonly IConfigurationRoot _configuration;
private readonly Kernel _kernel;

public OpenAIChatExample(Kernel kernel, ILoggerFactory logger, IConfigurationRoot configuration)
{
_configuration = configuration;
_kernel = kernel;
_logger = logger;

_chatCompletionService = _kernel.GetRequiredService();
}

public async void Start()
{
OpenAIPromptExecutionSettings settings = new()
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(),
MaxTokens = 1000,
Temperature = 0.0
};

ChatCompletionAgent completionAgent =
new()
{
Instructions = @"You are a helpful Assistant",
Name = "AI Completion Assistant",
Kernel = _kernel,
Arguments = new(settings),
};
KernelPlugin fileContentsPlugin = KernelPluginFactory.CreateFromType();
completionAgent.Kernel.Plugins.Add(fileContentsPlugin);

AgentGroupChat chat = new();
chat.AddAgent(completionAgent);
chat.AddChatMessage(new ChatMessageContent(AuthorRole.User, "What's in this picture? \"C:\\Temp\\Picture 1-1.png\""));

await foreach (ChatMessageContent content in chat.InvokeAsync())
{
Console.WriteLine(content.Content);
}
}
}
FileContentsPlugin.cs

[KernelFunction, Description("Gets the contents of an image, in base64 format")]
[return: Description("Image file contents details")]
public async Task ImageFileSearchAsync([Description("file path")] string filePath)
{
try
{
if (!File.Exists(filePath))
{
return $"The file at path '{filePath}' does not exist.";
}
byte[] imageBytes = System.IO.File.ReadAllBytes(filePath);
//string base64String = Convert.ToBase64String(imageBytes);
string base64String = Utility.CompressImageToBase64(filePath);
string data = $"data:image/jpeg;base64,{base64String}";
return data;
}
catch (Exception ex)
{
return $"An error occurred while accessing the file: {ex.Message}";
}
}

Utility.cs
public static class Utility
{
public static string CompressImageToBase64(string path, int maxSize = 256)
{
using var img = System.Drawing.Image.FromFile(path);
var resized = new Bitmap(img, new Size(maxSize, maxSize));
using var ms = new MemoryStream();
resized.Save(ms, ImageFormat.Jpeg);
return Convert.ToBase64String(ms.ToArray());
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... elfunction
Ответить

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

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

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

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

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