程序员的知识教程库

网站首页 > 教程分享 正文

学用大语言模型(6):Microsoft.Extensions.AI与本地模型对话

henian88 2025-03-03 18:43:40 教程分享 19 ℃ 0 评论

用代码,缓解焦虑,舒张血压,难得的宁静。


继续,借用Microsoft.Extensions.AI,用C#,与本地Ollama模型对话。

一、引用包

包括2个:

二、添加控件

添加webview2

三、输入代码

using System;
using System.Drawing;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Extensions.AI;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;

namespace 财务指标分析最终版
{
    public partial class MicrosoftExtensionsAI对话 : Form
    {
        public string strAsk = ""; // 用于存储用户输入的问题

        public string modelName = "qwen2.5:3b";

        public MicrosoftExtensionsAI对话()
        {
            InitializeComponent();
            InitializeWebView2(); 
        }

        private async void MicrosoftExtensionsAI对话_Load(object sender, EventArgs e)
        {
            // 延迟 1 秒后执行 模型对话()
            await Task.Delay(500); // 延迟 1 秒(1000 毫秒)
            this.Text = strAsk;
            模型对话();
        }

        private async void InitializeWebView2()
        {
            try
            {
                // 初始化 WebView2 环境
                await webView21.EnsureCoreWebView2Async(null);

                // 设置初始 HTML 内容
                webView21.CoreWebView2.NavigateToString("
"); // 设置 WebView2 的背景颜色为系统控件颜色 await SetWebView2BackgroundColor(SystemColors.Control); } catch (Exception ex) { MessageBox.Show($"WebView2 初始化失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private async Task SetWebView2BackgroundColor(Color color) { try { // 将 SystemColors.Control 转换为 RGB 格式 string rgbColor = $"rgb({color.R}, {color.G}, {color.B})"; // 设置 WebView2 的背景颜色 string script = $@" document.body.style.backgroundColor = '{rgbColor}'; "; await webView21.CoreWebView2.ExecuteScriptAsync(script); } catch (Exception ex) { MessageBox.Show($"设置 WebView2 背景颜色失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private async void 模型对话() { // 清空之前的输出 await webView21.CoreWebView2.ExecuteScriptAsync("document.getElementById('content').innerHTML = '';"); try { Uri uri = new Uri("http://localhost:11434"); IChatClient chatClient = new OllamaChatClient(uri, modelName); var responseStream = chatClient.GetStreamingResponseAsync(strAsk); // 用于缓存响应内容 var responseBuilder = new StringBuilder(); var lastUpdateTime = DateTime.Now; // 逐段读取响应并更新 WebView2 await foreach (var message in responseStream) { // 将消息追加到缓存中 responseBuilder.Append(message.ToString()); // 定期更新 WebView2(例如每 100ms 或每 10 条消息) if ((DateTime.Now - lastUpdateTime).TotalMilliseconds > 100 || responseBuilder.Length > 1000) { // 将内容追加到 WebView2 await AppendToWebView2(responseBuilder.ToString()); // 清空缓存 responseBuilder.Clear(); lastUpdateTime = DateTime.Now; } } // 追加剩余内容 if (responseBuilder.Length > 0) { await AppendToWebView2(responseBuilder.ToString()); } } catch (Exception ex) { // 异常处理 MessageBox.Show($"发生错误:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private async Task AppendToWebView2(string content) { try { // 将内容追加到 WebView2 的 HTML 中 string appendScript = $@" var contentDiv = document.getElementById('content'); contentDiv.innerHTML += '{EscapeJavaScriptString(content)}'; "; await webView21.CoreWebView2.ExecuteScriptAsync(appendScript); // 增加短暂延迟,确保内容渲染完成 await Task.Delay(10); // 滚动到底部 string scrollScript = @" var contentDiv = document.getElementById('content'); contentDiv.scrollTop = contentDiv.scrollHeight; "; await webView21.CoreWebView2.ExecuteScriptAsync(scrollScript); } catch (Exception ex) { MessageBox.Show($"更新 WebView2 失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private string EscapeJavaScriptString(string input) { // 转义 JavaScript 字符串中的特殊字符 return input.Replace("\\", "\\\\") .Replace("'", "\\'") .Replace("\"", "\\\"") .Replace("\r", "\\r") .Replace("\n", "\\n"); } } }

四、对话结果


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表