通过第三方软件,借助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);
}
五、不足
感觉与本地模型对话,需要等待的时间,有点长......
有待改进。
本文暂时没有评论,来添加一个吧(●'◡'●)