using BotSharp.Abstraction.Functions; using BotSharp.Core.Infrastructures; namespace BotSharp.Plugin.KnowledgeBase.Functions; public class KnowledgeRetrievalFn : IFunctionCallback { public string Name => "knowledge_retrieval"; private readonly IServiceProvider _services; private readonly KnowledgeBaseSettings _settings; public KnowledgeRetrievalFn(IServiceProvider services, KnowledgeBaseSettings settings) { _services = services; _settings = settings; } public async Task Execute(RoleDialogModel message) { var args = JsonSerializer.Deserialize(message.FunctionArgs ?? "{}"); var embedding = _services.GetServices() .FirstOrDefault(x => x.GetType().FullName.EndsWith(_settings.TextEmbedding)); var vector = await embedding.GetVectorsAsync(new List { args.Question }); var vectorDb = _services.GetRequiredService(); var id = Utilities.HashTextMd5(args.Question); var knowledges = await vectorDb.Search("lessen", vector[0], "answer"); if (knowledges.Count > 0) { message.Content = string.Join("\r\n\r\n=====\r\n", knowledges); } else { message.Content = $"I didn't find any useful knowledge related to [{args.Question}]. \r\nCan you tell me the instruction and I'll memorize it."; message.StopCompletion = true; } return true; } }