经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
记一次WPF集成SemanticKernel+OneAPI+讯飞星火认知大模型实践
来源:cnblogs  作者:mingupupup  时间:2024/3/1 8:46:07  对本文有异议

开启OneAPI服务

OneAPI介绍

OpenAI 接口管理 & 分发系统,支持 Azure、Anthropic Claude、Google PaLM 2 & Gemini、智谱 ChatGLM、百度文心一言、讯飞星火认知、阿里通义千问、360 智脑以及腾讯混元,可用于二次分发管理 key,仅单可执行文件,已打包好 Docker 镜像,一键部署,开箱即用. OpenAI key management & redistribution system, using a single API for all LLMs, and features an English UI.

项目地址:https://github.com/songquanpeng/one-api

image-20240227105438373

使用OneAPI

基于docker部署:

  1. # 使用 SQLite 的部署命令:
  2. docker run --name one-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data justsong/one-api
  3. # 使用 MySQL 的部署命令,在上面的基础上添加 `-e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi"`,请自行修改数据库连接参数,不清楚如何修改请参见下面环境变量一节。
  4. # 例如:
  5. docker run --name one-api -d --restart always -p 3000:3000 -e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi" -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data justsong/one-api

部署完成后,打开本地3000端口,如下所示:

image-20240227110126395

初始账户为root,密码为123456。

登录之后,会提示修改密码。

点击渠道,创建新的渠道:

image-20240227112714344

填入自己的大模型密钥。

添加令牌:

image-20240227112824812

测试OneAPI服务是否可用

使用Postman查看接口是否可用:

image-20240227113413504

注意事项

接口地址:http://<你的IP地址>:3000/v1/chat/completions

ip地址可通过cmd输入ipconfig查到。

在请求中加入令牌

image-20240227113639334

在红框位置输入OneAPI中的令牌。

测试的json

  1. {
  2. "model":"SparkDesk",
  3. "messages":[
  4. {
  5. "role":"user",
  6. "content":"你是谁"
  7. }
  8. ],
  9. "temperature":0.7
  10. }

星火大模型的响应

  1. {
  2. "id": "",
  3. "object": "chat.completion",
  4. "created": 1709004732,
  5. "choices": [
  6. {
  7. "index": 0,
  8. "message": {
  9. "role": "assistant",
  10. "content": "您好,我是科大讯飞研发的认知智能大模型,我的名字叫讯飞星火认知大模型。我可以和人类进行自然交流,解答问题,高效完成各领域认知智能需求。"
  11. },
  12. "finish_reason": "stop"
  13. }
  14. ],
  15. "usage": {
  16. "prompt_tokens": 2,
  17. "completion_tokens": 40,
  18. "total_tokens": 42
  19. }
  20. }

创建WPF项目

SemanticKernel简介

Semantic Kernel 是一个开源 SDK,可让您轻松构建可以调用现有代码的代理。作为高度可扩展的 SDK,可以将语义内核与 OpenAI、Azure OpenAI、Hugging Face 等模型一起使用!通过将现有的 C#、Python 和 Java 代码与这些模型相结合,可以生成用于回答问题和自动执行流程的代理。

image-20240227141312234

安装SemanticKernel

image-20240227141440713

在SemanticKernel中使用星火大模型

创建一个OpenAIHttpClientHandler类

OpenAIHttpClientHandler类代码:

  1. public class OpenAIHttpClientHandler : HttpClientHandler
  2. {
  3. protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  4. {
  5. UriBuilder uriBuilder;
  6. switch (request.RequestUri?.LocalPath)
  7. {
  8. case "/v1/chat/completions":
  9. uriBuilder = new UriBuilder(request.RequestUri)
  10. {
  11. // 这里是你要修改的 URL
  12. Scheme = "http",
  13. Host = "你的ip地址",
  14. Port = 3000,
  15. Path = "v1/chat/completions",
  16. };
  17. request.RequestUri = uriBuilder.Uri;
  18. break;
  19. }
  20. // 接着,调用基类的 SendAsync 方法将你的修改后的请求发出去
  21. HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
  22. int n = 0;
  23. while ((int)response.StatusCode == 500 && n < 10)
  24. {
  25. response = await base.SendAsync(request, cancellationToken);
  26. n++;
  27. }
  28. return response;
  29. }
  30. }

使用dotenv.net存储敏感数据

在dotenv.net.dll同一路径下,创建一个.env文件:

image-20240227153748317

在.env文件中存储敏感数据:

image-20240227154101538

模型ID要写SparkDesk,注意不要有空格,试过了有空格会报错。

APIKey就是写之前在OneAPI中复制的令牌。

测试能不能用

测试代码如下:

  1. // 加载环境变量
  2. DotEnv.Load();
  3. // 读取环境变量
  4. var envVars = DotEnv.Read();
  5. // Create kernel
  6. var builder = Kernel.CreateBuilder();
  7. var handler = new OpenAIHttpClientHandler();
  8. builder.AddOpenAIChatCompletion(
  9. modelId: envVars["ModeId"],
  10. apiKey: envVars["APIKey"],
  11. httpClient: new HttpClient(handler));
  12. var kernel = builder.Build();
  13. // Create chat history
  14. ChatHistory history = [];
  15. // Get chat completion service
  16. var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
  17. // Start the conversation
  18. history.AddUserMessage("你是谁?");
  19. // Enable auto function calling
  20. OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
  21. {
  22. ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
  23. };
  24. // Get the response from the AI
  25. var result = await chatCompletionService.GetChatMessageContentAsync(
  26. history,
  27. executionSettings: openAIPromptExecutionSettings,
  28. kernel: kernel);
  29. // Print the results
  30. Console.WriteLine("Assistant > " + result);
  31. // Add the message from the agent to the chat history
  32. history.AddMessage(result.Role, result.Content);
  33. }

查看结果:

image-20240227154656502

第一次请求失败,为了解决这个问题,我们加了下面这段代码:

  1. int n = 0;
  2. while ((int)response.StatusCode == 500 && n < 10)
  3. {
  4. response = await base.SendAsync(request, cancellationToken);
  5. n++;
  6. }

image-20240227154922453

再请求一遍就成功了。

image-20240227155010554

收到了星火认知大模型的回答。

使用HandyControl构建页面

xaml如下:

  1. <Window x:Class="SK_Wpf.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:hc="https://handyorg.github.io/handycontrol"
  7. xmlns:local="clr-namespace:SK_Wpf"
  8. mc:Ignorable="d"
  9. Title="SK_WPF" Height="450" Width="800"
  10. Loaded="Window_Loaded">
  11. <StackPanel Margin="32">
  12. <hc:Row Margin="0,20,0,0">
  13. <hc:Col Span="11">
  14. <StackPanel>
  15. <Button Style="{StaticResource ButtonPrimary}" Content="问AI" Width="80"
  16. Click="Button_Click_1"/>
  17. <hc:TextBox x:Name="textBox1"
  18. Margin="0,20,0,0"
  19. Width="300" Height="200"
  20. AcceptsReturn="True"/>
  21. </StackPanel>
  22. </hc:Col>
  23. <hc:Col Span="2">
  24. <Grid >
  25. <hc:LoadingCircle x:Name="loading1"
  26. HorizontalAlignment="Center"
  27. VerticalAlignment="Center"
  28. Visibility="Hidden"/>
  29. </Grid>
  30. </hc:Col>
  31. <hc:Col Span="11">
  32. <StackPanel>
  33. <hc:Tag ShowCloseButton="False" Content="AI回答"/>
  34. <RichTextBox x:Name="richTextBox2"
  35. VerticalAlignment="Center"
  36. HorizontalAlignment="Center"
  37. Margin="0,20,0,0"
  38. Width="300" Height="200">
  39. </RichTextBox>
  40. </StackPanel>
  41. </hc:Col>
  42. </hc:Row>
  43. </StackPanel>
  44. </Window>

实现效果如下:

image-20240227181715497

在WPF中集成SK+OneAPI+星火认知大模型

cs如下:

  1. using dotenv.net;
  2. using HandyControl.Controls;
  3. using Microsoft.SemanticKernel;
  4. using Microsoft.SemanticKernel.ChatCompletion;
  5. using Microsoft.SemanticKernel.Connectors.OpenAI;
  6. using SK_Wpf.Plugins;
  7. using System.Net.Http;
  8. using System.Text;
  9. using System.Windows;
  10. using System.Windows.Controls;
  11. using System.Windows.Data;
  12. using System.Windows.Documents;
  13. using System.Windows.Input;
  14. using System.Windows.Media;
  15. using System.Windows.Media.Imaging;
  16. using System.Windows.Navigation;
  17. using System.Windows.Shapes;
  18. namespace SK_Wpf
  19. {
  20. /// <summary>
  21. /// Interaction logic for MainWindow.xaml
  22. /// </summary>
  23. public partial class MainWindow : System.Windows.Window
  24. {
  25. IDictionary<string, string>? envVars;
  26. Kernel? kernel;
  27. ChatHistory history = [];
  28. IChatCompletionService chatCompletionService;
  29. public MainWindow()
  30. {
  31. InitializeComponent();
  32. }
  33. private void Window_Loaded(object sender, RoutedEventArgs e)
  34. {
  35. // 加载环境变量
  36. DotEnv.Load();
  37. // 读取环境变量
  38. envVars = DotEnv.Read();
  39. // Create kernel
  40. var builder = Kernel.CreateBuilder();
  41. var handler = new OpenAIHttpClientHandler();
  42. builder.AddOpenAIChatCompletion(
  43. modelId: envVars["ModeId"],
  44. apiKey: envVars["APIKey"],
  45. httpClient: new HttpClient(handler));
  46. builder.Plugins.AddFromType<HelloPlugin>("helloPlugin");
  47. var kernel = builder.Build();
  48. // Get chat completion service
  49. chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
  50. }
  51. private async void Button_Click_1(object sender, RoutedEventArgs e)
  52. {
  53. loading1.Visibility = Visibility.Visible;
  54. string question = textBox1.Text;
  55. // Get user input
  56. history.AddUserMessage(question);
  57. // Enable auto function calling
  58. OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
  59. {
  60. ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
  61. };
  62. // Get the response from the AI
  63. var result = await chatCompletionService.GetChatMessageContentAsync(
  64. history,
  65. executionSettings: openAIPromptExecutionSettings,
  66. kernel: kernel);
  67. // Print the results
  68. richTextBox2.AppendText(result.ToString());
  69. // Add the message from the agent to the chat history
  70. history.AddMessage(result.Role, result.Content);
  71. loading1.Visibility = Visibility.Hidden;
  72. }
  73. }
  74. }

实现效果如下所示:

实现效果

总结

本文是一次在WPF使用SemanticKernel基于OneAPI集成讯飞星火认知大模型的实践,没有申请OpenAIAPIKey的可以使用讯飞星火认知大模型,现在个人身份认证有送200万token,个人使用可以用很久了。但是效果上肯定和OpenAI还有差别,经过测试,自动本地函数调用,用OpenAI可以用星火认知大模型不行。下期可以写一下两个模型回答的对比。

image-20240228122947902

最后感谢大佬们的分享,见参考。

参考

1、想学Semantic Kernel,没有OpenAI接口该怎么办? (qq.com)

2、实战教学:用Semantic Kernel框架集成腾讯混元大模型应用 (qq.com)

3、Create AI agents with Semantic Kernel | Microsoft Learn

4、songquanpeng/one-api: OpenAI 接口管理 & 分发系统,支持 Azure、Anthropic Claude、Google PaLM 2 & Gemini、智谱 ChatGLM、百度文心一言、讯飞星火认知、阿里通义千问、360 智脑以及腾讯混元,可用于二次分发管理 key,仅单可执行文件,已打包好 Docker 镜像,一键部署,开箱即用. OpenAI key management & redistribution system, using a single API for all LLMs, and features an English UI. (github.com)

5、microsoft/semantic-kernel: Integrate cutting-edge LLM technology quickly and easily into your apps (github.com)

原文链接:https://www.cnblogs.com/mingupupu/p/18040008

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号