From 52f7e01002f5552e229fe0c3fd74efb92402b743 Mon Sep 17 00:00:00 2001 From: AaronWar Date: Wed, 5 Feb 2025 07:49:52 +0800 Subject: [PATCH 1/4] Add files via upload --- .../Hooks/KnowledgeHook.cs | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs new file mode 100644 index 00000000..3d1e88f8 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs @@ -0,0 +1,141 @@ +using BotSharp.Abstraction.Knowledges; +using BotSharp.Abstraction.MLTasks; +using BotSharp.Plugin.KnowledgeBase.Services; +using Microsoft.Extensions.DependencyInjection; +using Tensorflow; + +namespace BotSharp.Plugin.KnowledgeBase.Hooks; + +public class KnowledgeHook : IKnowledgeHook +{ + private readonly IKnowledgeService _knowledgeService; + private readonly ITextEmbedding _textEmbedding; + private readonly IServiceProvider _services; + + public KnowledgeHook( + IKnowledgeService knowledgeService, + ITextEmbedding textEmbedding, + IServiceProvider services) + { + _knowledgeService = knowledgeService; + _textEmbedding = textEmbedding; + _services = services; + } + + private async Task> GetKnowledgeBaseNameByAgentIdAsync(string agentId) + { + var agentService = _services.GetRequiredService(); + var agent = await agentService.GetAgent(agentId); + return agent.KnowledgeBases; + + // if (string.IsNullOrEmpty(agentId)) + // { + // return settings.DefaultKnowledgeBase; + // } + + // return settings.AgentKnowledgeBaseMap.TryGetValue(agentId, out var kbName) + // ? kbName + // : settings.DefaultKnowledgeBase; + } + + public async Task> GetDomainKnowledges(RoleDialogModel message, string text) + { + + + // 根据当前 agent ID 获取对应的知识库名称 + var knowledgeBases = await GetKnowledgeBaseNameByAgentIdAsync(message.CurrentAgentId); + var results = new List(); + + foreach (var knowledgeBase in knowledgeBases) + { + // if(knowledgeBase.Type=="") + // { + // var result = await _knowledgeService.SearchVectorKnowledge(text, knowledgeBase.Name, options); + // results.AddRange(result); + + // } + if (knowledgeBase.Type == "relationships") + { + var options=new GraphSearchOptions{ + Method="local" + }; + var result = await _knowledgeService.SearchGraphKnowledge(text, options); + results.Add(result.Result); + } + else// if(knowledgeBase.Type=="relationships") + { + var options = new VectorSearchOptions + { + Fields = null, + Limit = 5, + Confidence = 0.5f, + WithVector = true + }; + var result = await _knowledgeService.SearchVectorKnowledge(text, knowledgeBase.Name, options); + results.AddRange(result.Where(x => x.Data != null && (x.Data.ContainsKey("text") || x.Data.ContainsKey("answer"))) + .Select(x => x.Data.ContainsKey("answer") ? x.Data["text"].ToString() + "\r\n\r\n" + x.Data["answer"].ToString() : x.Data["text"].ToString()) + .Where(x => x != null)!); + + } + } + + // 从向量数据库中检索相关内容 + // var results = await _knowledgeService.SearchVectorKnowledge(text, knowledgeBases, options); + + return results;//.Select(x => x.Data["text"].ToString()).ToList(); + } + + public async Task> GetGlobalKnowledges(RoleDialogModel message) + { + // return new List(); + + //便利所有的知识库 + var text = message.Content; + var results = new List(); + + // Get all knowledge bases + var knowledgeBases = await _knowledgeService.GetVectorCollections(); + + foreach (var knowledgeBase in knowledgeBases) + { + if (knowledgeBase.Type == "relationships") + { + var options = new GraphSearchOptions + { + Method = "local" + }; + var result = await _knowledgeService.SearchGraphKnowledge(text, options); + results.Add(result.Result); + } + else + { + var options = new VectorSearchOptions + { + Fields = null, + Limit = 5, + Confidence = 0.5f, + WithVector = true + }; + var result = await _knowledgeService.SearchVectorKnowledge(text, knowledgeBase.Name, options); + results.AddRange(result.Where(x => x.Data != null && (x.Data.ContainsKey("text") || x.Data.ContainsKey("answer"))) + .Select(x => x.Data.ContainsKey("answer") ? x.Data["text"].ToString() + "\r\n\r\n" + x.Data["answer"].ToString() : x.Data["text"].ToString()) + .Where(x => x != null)!); + } + } + + return results; + // // 从消息内容中获取向量 + // var vector = await _textEmbedding.GetEmbeddingAsync(message.Content); + + // // 从向量数据库中检索相关内容 + // var results = await _knowledgeService.SearchKnowledgeAsync(vector, 3); + + // return results.Select(x => x.Content).ToList(); + } + + public async Task> CollectChunkedKnowledge() + { + // 如果需要收集和分块知识,可以在这里实现 + return new List();//(); + } +} \ No newline at end of file From 63fb9c2e344e447d51afaa519ff7a93a82f2e7b4 Mon Sep 17 00:00:00 2001 From: AaronWar Date: Wed, 5 Feb 2025 07:51:39 +0800 Subject: [PATCH 2/4] Update KnowledgeBasePlugin.cs --- .../BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs index 8d89daf6..31fa964c 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs @@ -26,6 +26,8 @@ public class KnowledgeBasePlugin : IBotSharpPlugin services.AddSingleton(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); + } public bool AttachMenu(List menu) From 899f03feeeb0e8c66e5032447f67a7629dae8ac5 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Tue, 25 Feb 2025 01:05:26 +0800 Subject: [PATCH 3/4] Clean code #870 --- .../Hooks/KnowledgeHook.cs | 50 +++---------------- 1 file changed, 7 insertions(+), 43 deletions(-) diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs index 3d1e88f8..da4add53 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs @@ -1,9 +1,3 @@ -using BotSharp.Abstraction.Knowledges; -using BotSharp.Abstraction.MLTasks; -using BotSharp.Plugin.KnowledgeBase.Services; -using Microsoft.Extensions.DependencyInjection; -using Tensorflow; - namespace BotSharp.Plugin.KnowledgeBase.Hooks; public class KnowledgeHook : IKnowledgeHook @@ -27,42 +21,26 @@ public class KnowledgeHook : IKnowledgeHook var agentService = _services.GetRequiredService(); var agent = await agentService.GetAgent(agentId); return agent.KnowledgeBases; - - // if (string.IsNullOrEmpty(agentId)) - // { - // return settings.DefaultKnowledgeBase; - // } - - // return settings.AgentKnowledgeBaseMap.TryGetValue(agentId, out var kbName) - // ? kbName - // : settings.DefaultKnowledgeBase; } public async Task> GetDomainKnowledges(RoleDialogModel message, string text) { - - - // 根据当前 agent ID 获取对应的知识库名称 + // Get agent Id by knowledge base name var knowledgeBases = await GetKnowledgeBaseNameByAgentIdAsync(message.CurrentAgentId); var results = new List(); foreach (var knowledgeBase in knowledgeBases) { - // if(knowledgeBase.Type=="") - // { - // var result = await _knowledgeService.SearchVectorKnowledge(text, knowledgeBase.Name, options); - // results.AddRange(result); - - // } if (knowledgeBase.Type == "relationships") { - var options=new GraphSearchOptions{ - Method="local" + var options = new GraphSearchOptions + { + Method = "local" }; var result = await _knowledgeService.SearchGraphKnowledge(text, options); results.Add(result.Result); } - else// if(knowledgeBase.Type=="relationships") + else { var options = new VectorSearchOptions { @@ -79,17 +57,11 @@ public class KnowledgeHook : IKnowledgeHook } } - // 从向量数据库中检索相关内容 - // var results = await _knowledgeService.SearchVectorKnowledge(text, knowledgeBases, options); - - return results;//.Select(x => x.Data["text"].ToString()).ToList(); + return results; } public async Task> GetGlobalKnowledges(RoleDialogModel message) { - // return new List(); - - //便利所有的知识库 var text = message.Content; var results = new List(); @@ -124,18 +96,10 @@ public class KnowledgeHook : IKnowledgeHook } return results; - // // 从消息内容中获取向量 - // var vector = await _textEmbedding.GetEmbeddingAsync(message.Content); - - // // 从向量数据库中检索相关内容 - // var results = await _knowledgeService.SearchKnowledgeAsync(vector, 3); - - // return results.Select(x => x.Content).ToList(); } public async Task> CollectChunkedKnowledge() { - // 如果需要收集和分块知识,可以在这里实现 - return new List();//(); + return new List(); } } \ No newline at end of file From 80fc2f6c782fdecafc1f17de9fa3f016b8e9327f Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 25 Feb 2025 11:56:37 -0600 Subject: [PATCH 4/4] add confidence --- .../Agents/Models/AgentKnowledgeBase.cs | 8 +++++++- .../Collections/ConversationDialogDocument.cs | 1 + .../Collections/ConversationStateDocument.cs | 1 + .../Models/AgentKnowledgeBaseMongoElement.cs | 7 +++++-- .../Repository/MongoRepository.Conversation.cs | 5 ++++- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentKnowledgeBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentKnowledgeBase.cs index 3f116871..29b7c2c2 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentKnowledgeBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentKnowledgeBase.cs @@ -6,16 +6,22 @@ public class AgentKnowledgeBase public string Type { get; set; } public bool Disabled { get; set; } + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public decimal? Confidence { get; set; } + public AgentKnowledgeBase() { } - public AgentKnowledgeBase(string name, string type, bool enabled) + public AgentKnowledgeBase( + string name, string type, + bool enabled, decimal? confidence = null) { Name = name; Type = type; Disabled = enabled; + Confidence = confidence; } public override string ToString() diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationDialogDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationDialogDocument.cs index a3f6ee69..4f896678 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationDialogDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationDialogDocument.cs @@ -4,6 +4,7 @@ public class ConversationDialogDocument : MongoBase { public string ConversationId { get; set; } = default!; public string AgentId { get; set; } = default!; + public string UserId { get; set; } = default!; public DateTime UpdatedTime { get; set; } public List Dialogs { get; set; } = []; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationStateDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationStateDocument.cs index 3df58594..be42823b 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationStateDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationStateDocument.cs @@ -4,6 +4,7 @@ public class ConversationStateDocument : MongoBase { public string ConversationId { get; set; } = default!; public string AgentId { get; set; } = default!; + public string UserId { get; set; } = default!; public DateTime UpdatedTime { get; set; } public List States { get; set; } = []; public List Breakpoints { get; set; } = []; diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentKnowledgeBaseMongoElement.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentKnowledgeBaseMongoElement.cs index 2aca84a2..29dd5e58 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentKnowledgeBaseMongoElement.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentKnowledgeBaseMongoElement.cs @@ -8,6 +8,7 @@ public class AgentKnowledgeBaseMongoElement public string Name { get; set; } = default!; public string Type { get; set; } = default!; public bool Disabled { get; set; } + public decimal? Confidence { get; set; } public static AgentKnowledgeBaseMongoElement ToMongoElement(AgentKnowledgeBase knowledgeBase) { @@ -15,7 +16,8 @@ public class AgentKnowledgeBaseMongoElement { Name = knowledgeBase.Name, Type = knowledgeBase.Type, - Disabled = knowledgeBase.Disabled + Disabled = knowledgeBase.Disabled, + Confidence = knowledgeBase.Confidence }; } @@ -25,7 +27,8 @@ public class AgentKnowledgeBaseMongoElement { Name = knowledgeBase.Name, Type = knowledgeBase.Type, - Disabled = knowledgeBase.Disabled + Disabled = knowledgeBase.Disabled, + Confidence = knowledgeBase.Confidence }; } } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs index 8b6dded6..06512fb7 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs @@ -10,11 +10,12 @@ public partial class MongoRepository if (conversation == null) return; var utcNow = DateTime.UtcNow; + var userId = !string.IsNullOrEmpty(conversation.UserId) ? conversation.UserId : string.Empty; var convDoc = new ConversationDocument { Id = !string.IsNullOrEmpty(conversation.Id) ? conversation.Id : Guid.NewGuid().ToString(), AgentId = conversation.AgentId, - UserId = !string.IsNullOrEmpty(conversation.UserId) ? conversation.UserId : string.Empty, + UserId = userId, Title = conversation.Title, Channel = conversation.Channel, ChannelId = conversation.ChannelId, @@ -30,6 +31,7 @@ public partial class MongoRepository Id = Guid.NewGuid().ToString(), ConversationId = convDoc.Id, AgentId = conversation.AgentId, + UserId = userId, Dialogs = [], UpdatedTime = utcNow }; @@ -39,6 +41,7 @@ public partial class MongoRepository Id = Guid.NewGuid().ToString(), ConversationId = convDoc.Id, AgentId = conversation.AgentId, + UserId = userId, States = [], Breakpoints = [], UpdatedTime = utcNow