-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
WithPlugins.cs
96 lines (75 loc) · 3.52 KB
/
WithPlugins.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Copyright (c) Microsoft. All rights reserved.
using System.Net.Http.Headers;
using System.Text.Json;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Chroma;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel.Memory;
using Microsoft.SemanticKernel.Plugins.OpenApi;
using Resources;
namespace RAG;
public class WithPlugins(ITestOutputHelper output) : BaseTest(output)
{
[Fact]
public async Task RAGWithCustomPluginAsync()
{
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(TestConfiguration.OpenAI.ChatModelId, TestConfiguration.OpenAI.ApiKey)
.Build();
kernel.ImportPluginFromType<CustomPlugin>();
var result = await kernel.InvokePromptAsync("{{search 'budget by year'}} What is my budget for 2024?");
Console.WriteLine(result);
}
/// <summary>
/// Shows how to use RAG pattern with <see cref="Microsoft.SemanticKernel.Plugins.Memory.TextMemoryPlugin"/>.
/// </summary>
[Fact(Skip = "Requires Chroma server up and running")]
public async Task RAGWithTextMemoryPluginAsync()
{
var memory = new MemoryBuilder()
.WithMemoryStore(new ChromaMemoryStore("http://localhost:8000"))
.WithOpenAITextEmbeddingGeneration(TestConfiguration.OpenAI.EmbeddingModelId, TestConfiguration.OpenAI.ApiKey)
.Build();
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(TestConfiguration.OpenAI.ChatModelId, TestConfiguration.OpenAI.ApiKey)
.Build();
kernel.ImportPluginFromObject(new Microsoft.SemanticKernel.Plugins.Memory.TextMemoryPlugin(memory));
var result = await kernel.InvokePromptAsync("{{recall 'budget by year' collection='finances'}} What is my budget for 2024?");
Console.WriteLine(result);
}
/// <summary>
/// Shows how to use RAG pattern with ChatGPT Retrieval Plugin.
/// </summary>
[Fact(Skip = "Requires ChatGPT Retrieval Plugin and selected vector DB server up and running")]
public async Task RAGWithChatGPTRetrievalPluginAsync()
{
var openApi = EmbeddedResource.ReadStream("chat-gpt-retrieval-plugin-open-api.yaml");
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(TestConfiguration.OpenAI.ChatModelId, TestConfiguration.OpenAI.ApiKey)
.Build();
await kernel.ImportPluginFromOpenApiAsync("ChatGPTRetrievalPlugin", openApi!, executionParameters: new(authCallback: async (request, cancellationToken) =>
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", TestConfiguration.ChatGPTRetrievalPlugin.Token);
}));
const string Query = "What is my budget for 2024?";
var function = KernelFunctionFactory.CreateFromPrompt("{{search queries=$queries}} {{$query}}");
var arguments = new KernelArguments
{
["query"] = Query,
["queries"] = JsonSerializer.Serialize(new List<object> { new { query = Query, top_k = 1 } }),
};
var result = await kernel.InvokeAsync(function, arguments);
Console.WriteLine(result);
}
#region Custom Plugin
private sealed class CustomPlugin
{
[KernelFunction]
public async Task<string> SearchAsync(string query)
{
// Here will be a call to vector DB, return example result for demo purposes
return "Year Budget 2020 100,000 2021 120,000 2022 150,000 2023 200,000 2024 364,000";
}
}
#endregion
}