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
Мобильная версия