Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
<ItemGroup>
<PackageReference Include="AutoGen" Version="0.2.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" />
<PackageReference Include="Microsoft.SemanticKernel.Plugins.Web" Version="1.48.0-alpha" />
<PackageReference Include="Microsoft.SemanticKernel.Plugins.Web" Version="1.54.0-alpha" />
<PackageReference Include="Senparc.Weixin.Work" Version="3.25.5" />
<PackageReference Include="Senparc.Weixin.Work.Middleware" Version="1.4.9" />
</ItemGroup>
Expand Down
12 changes: 3 additions & 9 deletions Samples/Senparc.AI.Samples.Consoles/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,8 @@
{
//Embedding Sample
Console.WriteLine("请输入需要,进入对应 Embedding测试:");
Console.WriteLine("[1] 普通信息(Information)");
Console.WriteLine("[2] 引用信息(Reference)");
Console.WriteLine("[3] 检索增强生成(RAG)");
Console.WriteLine("[1] 普通 Embedding + 查询");
Console.WriteLine("[2] 检索增强生成(RAG)");
index = Console.ReadLine();
Console.WriteLine();
try
Expand All @@ -103,15 +102,10 @@
{
case "1":
{
await embeddingSample.RunAsync(isReference: false);
await embeddingSample.RunAsync();
}
break;
case "2":
{
await embeddingSample.RunAsync(isReference: true);
}
break;
case "3":
{
await embeddingSample.RunRagAsync(serviceProvider);
}
Expand Down
50 changes: 31 additions & 19 deletions Samples/Senparc.AI.Samples.Consoles/Samples/EmbeddingSample.RAG.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using Microsoft.EntityFrameworkCore.InMemory.Storage.Internal;
using Microsoft.IdentityModel.Abstractions;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Text;
using Senparc.AI.Entities;
using Senparc.AI.Entities.Keys;
using Senparc.AI.Kernel;
using Senparc.AI.Kernel.Handlers;
using Senparc.AI.Trace;
Expand All @@ -14,6 +16,7 @@
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using static Qdrant.Client.Grpc.MaxOptimizationThreads.Types;

namespace Senparc.AI.Samples.Consoles.Samples
{
Expand Down Expand Up @@ -115,7 +118,14 @@ public async Task RunRagAsync(IServiceProvider serviceProvider)
var iWantToRunEmbedding = embeddingAiHandler
.IWantTo()
.ConfigModel(ConfigModel.TextEmbedding, _userId)
.BuildKernel();
.ConfigVectorStore(embeddingAiSetting.VectorDB)
.BuildKernel();

var modelName = textEmbeddingGenerationName(embeddingAiSetting);

var vectorName = "senparc-sample-rag";
var vectorCollection = iWantToRunEmbedding.GetVectorCollection<ulong, Record>(embeddingAiSetting.VectorDB, vectorName);
await vectorCollection.EnsureCollectionExistsAsync();

var i = 0;
var dt = SystemTime.Now;
Expand Down Expand Up @@ -148,17 +158,19 @@ public async Task RunRagAsync(IServiceProvider serviceProvider)
MemoryStore:
try
{
paragraphs.ForEach(paragraph =>
paragraphs.ForEach(async paragraph =>
{
var currentI = i++;

iWantToRunEmbedding
.MemorySaveInformation(
modelName: textEmbeddingGenerationName(embeddingAiSetting),
azureDeployName: textEmbeddingAzureDeployName(embeddingAiSetting),
collection: memoryCollectionName,
id: $"paragraph-{Guid.NewGuid().ToString("n")}",
text: paragraph);
var record = new Record()
{
Id = (ulong)i,
Name = vectorName + "-paragraph-" + i,
Description = paragraph,
DescriptionEmbedding = await iWantToRunEmbedding.SemanticKernelHelper.GetEmbeddingAsync(modelName, paragraph),
Tags = new[] { i.ToString() }
};
await vectorCollection.UpsertAsync(record);
});
}
catch (Exception ex)
Expand Down Expand Up @@ -220,18 +232,18 @@ public async Task RunRagAsync(IServiceProvider serviceProvider)

var questionDt = DateTime.Now;
var limit = 3;
var embeddingResult = await iWantToRunEmbedding.MemorySearchAsync(
modelName: textEmbeddingGenerationName(embeddingAiSetting),
azureDeployName: textEmbeddingAzureDeployName(embeddingAiSetting),
memoryCollectionName: memoryCollectionName,
query: question,
limit: limit);

await foreach (var item in embeddingResult.MemoryQueryResult)


ReadOnlyMemory<float> searchVector = await iWantToRunEmbedding.SemanticKernelHelper.GetEmbeddingAsync(modelName, question);

var vectorResult = vectorCollection.SearchAsync(searchVector, limit);


await foreach (var item in vectorResult)
{
results.AppendLine($@"//////
{item.Metadata.Text}
******{item.Relevance}");
{item.Record.Description}
******{item.Score}");
}

SenparcTrace.SendCustomLog("RAG日志", $@"提问:{question},耗时:{(DateTime.Now - questionDt).TotalMilliseconds}ms
Expand Down
56 changes: 27 additions & 29 deletions Samples/Senparc.AI.Samples.Consoles/Samples/EmbeddingSample.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,19 @@ namespace Senparc.AI.Samples.Consoles.Samples

public class Record
{
[VectorStoreRecordKey]
public string Id { get; set; }
[VectorStoreKey]
public ulong Id { get; set; }

[VectorStoreRecordData(IsIndexed = true)]
[VectorStoreData(IsIndexed = true)]
public string Name { get; set; }

[VectorStoreRecordData(IsFullTextIndexed = true)]
[VectorStoreData(IsFullTextIndexed = true)]
public string Description { get; set; }

[VectorStoreRecordVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
[VectorStoreVector(Dimensions: 3072 /*根据模型调整,例如 text-embedding-ada-002 为 1536*/, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }

[VectorStoreRecordData(IsIndexed = true)]
[VectorStoreData(IsIndexed = true)]
public string[] Tags { get; set; }
}

Expand All @@ -44,29 +44,24 @@ public partial class EmbeddingSample
SemanticAiHandler _semanticAiHandler => (SemanticAiHandler)_aiHandler;
string _userId = "Jeffrey";
string memoryCollectionName = "EmbeddingTest";
Func<ISenparcAiSetting, string> textEmbeddingGenerationName => setting => setting.ModelName.Embedding ?? "text-embedding-ada-002";
Func<ISenparcAiSetting, string> textEmbeddingAzureDeployName => setting => setting.ModelName.Embedding ?? "text-embedding-ada-002";
static Func<ISenparcAiSetting, string> textEmbeddingGenerationName => setting => setting.ModelName.Embedding ?? "text-embedding-ada-002";
static Func<ISenparcAiSetting, string> textEmbeddingAzureDeployName => setting => setting.ModelName.Embedding ?? "text-embedding-ada-002";

public EmbeddingSample(IAiHandler aiHandler)
{
_aiHandler = aiHandler;
_semanticAiHandler.SemanticKernelHelper.ResetHttpClient(enableLog: SampleSetting.EnableHttpClientLog);//同步日志设置状态
}

public async Task RunAsync(bool isReference = false, bool isRag = false)
public async Task RunAsync(bool isRag = false)
{
if (isReference)
{
await Console.Out.WriteLineAsync("EmbeddingSample 开始运行。请输入需要 Embedding 的内容,id 和 text 以 :::(三个英文冒号)分割,输入 n 继续下一步。");
}
else
{
await Console.Out.WriteLineAsync("EmbeddingSample 开始运行。请输入需要 Embedding 的内容,URL 和介绍以 :::(三个英文冒号)分割,输入 n 继续下一步。");
}
await Console.Out.WriteLineAsync("EmbeddingSample 开始运行。请输入需要 Embedding 的内容,输入 n 继续下一步。");

await Console.Out.WriteLineAsync("请输入");


var aiSetting = _semanticAiHandler.SemanticKernelHelper.AiSetting;
var vectorName = "senparc-vector-record-ai";

//测试 TextEmbedding
var iWantToRun = _semanticAiHandler
Expand All @@ -76,7 +71,9 @@ public async Task RunAsync(bool isReference = false, bool isRag = false)
.ConfigVectorStore(aiSetting.VectorDB)
.BuildKernel();

var vectorCollection = iWantToRun.GetVectorCollection<string, Record>(aiSetting.VectorDB, "senparc-vector-record");
var vectorCollection = iWantToRun.GetVectorCollection<ulong, Record>(aiSetting.VectorDB, vectorName);
await vectorCollection.EnsureCollectionExistsAsync();

var modelName = textEmbeddingGenerationName(aiSetting);

//开始对话
Expand All @@ -89,17 +86,14 @@ public async Task RunAsync(bool isReference = false, bool isRag = false)
break;
}

var info = prompt.Split(new[] { ":::" }, StringSplitOptions.None);

var record = new Record()
{
Id = i.ToString(),
Name = info[0],
Description = info[1],
DescriptionEmbedding = await iWantToRun.SemanticKernelHelper.GetEmbeddingAsync(modelName, info[1]),
Tags = new[] { info[0] }
Id = (ulong)i,
Name = vectorName + ":" + i,
Description = prompt,
DescriptionEmbedding = await iWantToRun.SemanticKernelHelper.GetEmbeddingAsync(modelName, prompt),
Tags = new[] { i.ToString() }
};

await vectorCollection.UpsertAsync(record);

i++;
Expand All @@ -117,12 +111,15 @@ public async Task RunAsync(bool isReference = false, bool isRag = false)
}

var questionDt = DateTime.Now;
var top = isReference ? 3 : 2;
var top = 3;// isReference ? 3 : 2;

ReadOnlyMemory<float> searchVector = await iWantToRun.SemanticKernelHelper.GetEmbeddingAsync(modelName, question);

//新方法
var vectorResult = vectorCollection.SearchEmbeddingAsync(searchVector, top);
//var r1 = await vectorCollection.GetAsync(1);//OK
//Console.WriteLine("r1:" + r1.ToJson(true));

//vectorCollection = iWantToRun.GetVectorCollection<string, Record>(aiSetting.VectorDB, "senparc-vector-record");
var vectorResult = vectorCollection.SearchAsync(searchVector, top);
var j = 0;
await foreach (var restulItem in vectorResult)
{
Expand All @@ -132,6 +129,7 @@ public async Task RunAsync(bool isReference = false, bool isRag = false)
await Console.Out.WriteLineAsync(" Id:\t\t" + string.Join(',', restulItem.Record.Tags));
await Console.Out.WriteLineAsync(" Relevance:\t\t" + restulItem.Score);
await Console.Out.WriteLineAsync($"-- cost {(DateTime.Now - questionDt).TotalMilliseconds}ms");
await Console.Out.WriteLineAsync();
j++;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.5" />
<!--<PackageReference Include="Microsoft.KernelMemory.Core" Version="0.71.240820.1" />
<PackageReference Include="Microsoft.KernelMemory.MemoryDb.Redis" Version="0.71.240820.1" />-->
<PackageReference Include="Microsoft.SemanticKernel.Connectors.OpenAI" Version="1.48.0" />
<PackageReference Include="Microsoft.SemanticKernel.Connectors.OpenAI" Version="1.54.0" />
<PackageReference Include="Microsoft.SemanticKernel.Planners.Handlebars" Version="1.47.0-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Plugins.Memory" Version="1.48.0-alpha" />
<PackageReference Include="Senparc.Xncf.SenMapic" Version="0.1.5-alpha4" />
<PackageReference Include="Microsoft.SemanticKernel.Plugins.Memory" Version="1.54.0-alpha" />
<PackageReference Include="Senparc.Xncf.SenMapic" Version="0.1.7-alpha.1" />
<!--<PackageReference Include="Microsoft.SemanticKernel.Planning.SequentialPlanner" Version="0.24.230912.2-preview" />-->
<ProjectReference Include="..\..\src\Senparc.AI.Kernel\Senparc.AI.Kernel.csproj" />
<ProjectReference Include="..\..\src\Senparc.AI\Senparc.AI.csproj" />
Expand Down
18 changes: 9 additions & 9 deletions Samples/Senparc.AI.Samples.Consoles/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,15 @@

### Embedding 普通信息测试
```
1:::My name is Jeffrey
2:::My country is China
3:::I'm working for Senparc
4:::Senparc is a company based in Suzhou
5:::Senparc is founded at 2010
6:::Senparc startup at 2010, in Jiangsu Province, Suzhou City, Gusu Distinct
7:::Senparc.Weixin SDK is made by Senparc, main author is Jeffrey Su who is also the founder of Senparc.
8:::Jeffrey Su's Chinese name is Zhenwei Su.
9:::Zhenwei Su has written two books.
My name is Jeffrey
My country is China
I'm working for Senparc
Senparc is a company based in Suzhou
Senparc is founded at 2010
Senparc startup at 2010, in Jiangsu Province, Suzhou City, Gusu Distinct
Senparc.Weixin SDK is made by Senparc, main author is Jeffrey Su who is also the founder of Senparc.
Jeffrey Su's Chinese name is Zhenwei Su.
Zhenwei Su has written two books.
```

### Embedding 引用信息测试
Expand Down
38 changes: 38 additions & 0 deletions src/Senparc.AI.Agents/AgentExtensions/AgentExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using AutoGen.Core;
using AutoGen.OpenAI;
using AutoGen.SemanticKernel;
using System;
using System.Collections.Generic;

namespace Senparc.AI.Agents.AgentExtensions;

Expand Down Expand Up @@ -94,6 +96,42 @@ public static GroupChat CreateAiTeam<TFromAgent>(this GraphConnector graphConnec
return aiTeam;
}

/// <summary>
/// 创建 AITeam 对象(GroupChat)
/// </summary>
/// <typeparam name="TFromAgent"></typeparam>
/// <param name="graphConnector"></param>
/// <param name="adminAgent"></param>
/// <param name="orchestrator"></param>
/// <returns></returns>
[Obsolete("请使用方法 CreateAiTeam<TFromAgent>(this GraphConnector graphConnector, IOrchestrator orchestrator)")]
public static GroupChat CreateAiTeam<TFromAgent>(this GraphConnector graphConnector, TFromAgent adminAgent, IOrchestrator orchestrator)
where TFromAgent : IAgent
{
var aiTeam = new GroupChat(
members: graphConnector.Agents.Values,
orchestrator: orchestrator//,
/* workflow: graphConnector.Graph*/);
return aiTeam;
}

/// <summary>
/// 创建 AITeam 对象(GroupChat)
/// </summary>
/// <typeparam name="TFromAgent"></typeparam>
/// <param name="graphConnector"></param>
/// <param name="orchestrator"></param>
/// <returns></returns>
public static GroupChat CreateAiTeam<TFromAgent>(this GraphConnector graphConnector, IOrchestrator orchestrator)
where TFromAgent : IAgent
{
var aiTeam = new GroupChat(
members: graphConnector.Agents.Values,
orchestrator: orchestrator//,
/* workflow: graphConnector.Graph*/);
return aiTeam;
}

#endregion
}

Loading
Loading