程序员的知识教程库

网站首页 > 教程分享 正文

学用大语言模型(5):通过C#、ollama与模型对话

henian88 2025-03-03 18:43:20 教程分享 6 ℃ 0 评论

通过第三方软件,借助ollamaAPI,在本地对话,应用场景有限。

通过编程方式,开发特定领域应用,适用于专项需求,更有现实意义。

整理了一个C#实例:

一、引用包资源

主要涉及两个:

二、设计对话窗口

大致如下:


三、运行效果


另外,可以根据需要,切换使用不同的模型文件。



四、主要代码

        private async Task chatWithLLM()
        {
            if (string.IsNullOrEmpty(modelName))
            {
                MessageBox.Show("请选择一个模型", "提示", MessageBoxButtons.OK);
                return;
            }
             
            if (modelName.Length < 1)
            {
                MessageBox.Show($"未指定Ollama中相应模型,或指定模型不存在。", "提示", MessageBoxButtons.OK);
                return;
            }
            string userInput = TextBoxQuestion.Text.Trim();

            if (userInput.Contains("<需要耐心等待片刻......>"))
            {
                return;
            }
            if (string.IsNullOrEmpty(userInput))
            {
                RichTextBoxChatContent.ScrollToCaret();
                return;
            }

            // 使用 StringBuilder 缓存内容
            StringBuilder chatContentBuilder = new StringBuilder();
            try
            {
                TextBoxQuestion.Text += "  " + "请耐心等待片刻......";
                chatContentBuilder.AppendLine("问题: " + userInput);
                // 将用户消息添加到消息列表
                string strMessageToAdd = CleanText(userInput);
                userInput += "请参考上下文,结合相应的提问进行答复。";
                messages?.Add(new Ollama.Message(MessageRole.User, strMessageToAdd, null, null));
                if (ollama == null)
                {
                    MessageBox.Show("Ollama sdk 未初始化,请检查配置!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                // 获取模型回复内容

                //用流的方式,逐步获取。
                var enumerable = ollama.Chat.GenerateChatCompletionAsync(modelName, messages!, stream: true);
                StringBuilder builder = new StringBuilder();

                // 标记答题的模型名称
                chatContentBuilder.Append("回答: < " + modelName + " >");
                chatContentBuilder.AppendLine();

                // 逐步显示模型的回复内容,Stream=True
                await foreach (var response in enumerable)
                {
                    string content = response.Message.Content;
                    builder.Append(content);

                    //content = content.Replace("*", "");
                    chatContentBuilder.Append(content);  // 逐步添加
                }
               
                string fullContent = builder.ToString();

                // 关键:将模型的完整回答添加到 messages 列表中
                strMessageToAdd = CleanText(fullContent);

                messages?.Add(new Ollama.Message(MessageRole.Assistant, strMessageToAdd, null, null));

                chatContentBuilder.AppendLine();
                chatContentBuilder.AppendLine(new string('-', 72));

                // 一次性更新 RichTextBox
                RichTextBoxChatContent.AppendText(chatContentBuilder.ToString());
                RichTextBoxChatContent.ScrollToCaret();

                TextBoxQuestion.Clear();
            }
            catch (Exception ex)
            {
                LogError(ex);
                MessageBox.Show($"错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void LogError(Exception ex)
        {
            // 将异常信息记录到日志文件或数据库         
            string logFilePath = Application.StartupPath + "\\" + "error_log.txt";
            string logMessage = $"{DateTime.Now}: {ex.Message}\n{ex.StackTrace}\n";

            // 将日志信息追加到文件
            File.AppendAllText(logFilePath, logMessage);
        }

五、不足

感觉与本地模型对话,需要等待的时间,有点长......

有待改进。

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

欢迎 发表评论:

最近发表
标签列表