需要一种快速的方法在 .NET 应用程序中添加对话式 AI 体验吗?使用 Aspose.LLM,您可以构建一个简单的聊天,而无需显式创建或管理会话 ID。SendMessageAsync 会自动使用当前会话,允许后续消息共享对话上下文。
此模式适用于一次一次的对话,包括 CLI 工具、原型、脚本以及其他简单的应用程序。
何时 Simple Chat 是正确的选择
隐式会话模式非常适用于:
- 单个问答。
- 简短的来回对话。
- CLI 应用程序和脚本。
- 原型。
- 同时只能激活一个对话的应用程序。
如果您的应用程序需要多个独立的对话——例如,为多个用户提供服务的聊天机器人——则应改用 Aspose.LLM 的显式会话 API。
在不管理会话的情况下发送消息
核心消息传递模式刻意保持简洁:
string reply = await api.SendMessageAsync("What is 2 + 2?");
Console.WriteLine(reply);
当您对同一个 AsposeLLMApi 实例进行后续调用时,它们属于同一个当前对话:
await api.SendMessageAsync("My name is Alice.");
string reply = await api.SendMessageAsync("What is my name?");
Console.WriteLine(reply);
您不需要创建会话 ID、在调用之间传递它,或显式追加对话历史。同一个 AsposeLLMApi 实例会为您维护当前对话。现有的源文档将此行为描述为在 API 实例生命周期内维护的隐式会话。 fileciteturn0file0L29-L34
完整的设置仍然需要一个已授权的 API 实例和一个预设。源示例使用 Aspose.LLM.License、Qwen25Preset 和 AsposeLLMApi.Create(preset)。 fileciteturn0file0L87-L122
构建交互式控制台聊天
在了解了基本的消息传递模式后,让我们将其转换为一个小型交互式控制台应用程序。
重要的是只创建一次 API,然后在每条消息中重复使用它:
using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;
internal class SimpleChatDemo
{
public static async Task Main()
{
var license = new Aspose.LLM.License();
license.SetLicense("Aspose.LLM.lic");
var preset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(preset);
Console.WriteLine("Ask me anything. Type 'quit' to exit.");
while (true)
{
Console.Write("> ");
string? line = Console.ReadLine();
if (line == null || line.Equals("quit", StringComparison.OrdinalIgnoreCase))
break;
try
{
string reply = await api.SendMessageAsync(line);
Console.WriteLine(reply);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
}
此示例保持聊天简洁:
- API 实例仅创建一次。
- 每个
SendMessageAsync调用使用相同的隐式会话。 - 先前的消息仍然对模型可用。
- 循环提供自然的来回对话。
- 异常按消息处理,单个请求失败不会导致应用程序终止。
源示例使用相同的结构,并指出单个 API 实例在迭代过程中保留上下文。 fileciteturn0file0L192-L245
要运行它,请创建一个 .NET 控制台项目,替换生成的 Program.cs,然后运行:
dotnet new console
dotnet run
Aspose.LLM 提供了一个高级的 AsposeLLMApi 类,用于抽象模型加载、标记化和推理。要开始使用,请安装 NuGet 包:
Install-Package Aspose.LLM
使用不同的预设自定义单条消息
如果大部分对话都应该使用默认行为,但某个特定问题需要更确定的响应怎么办?
您可以为该调用向 SendMessageAsync 传递不同的预设:
var strictPreset = new Qwen25Preset();
strictPreset.SamplerParameters.Temperature = 0.1f;
string reply = await api.SendMessageAsync(
"What is the square root of 144?",
preset: strictPreset);
Console.WriteLine(reply);
覆盖仅适用于该调用。API 的默认预设保持不变,底层会话仍然提供对话上下文。 fileciteturn0file0L126-L159
较低的温度,例如 0.1f,会使采样更具确定性,这在希望生成的响应变化较小的问题中可能有用。 fileciteturn0file0L155-L159
使用取消保护长时间运行的聊天请求
对于大型提示或较长的响应,本地模型推理可能需要更长时间。您可以通过传递 CancellationToken 来防止单个请求无限期运行。
例如,设置 30 秒的超时:
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
try
{
string reply = await api.SendMessageAsync(
"Write a 500-word essay about migration patterns of the Arctic tern.",
cancellationToken: cts.Token);
Console.WriteLine(reply);
}
catch (OperationCanceledException)
{
Console.WriteLine("Generation timed out.");
}
源文档展示了相同的模式:创建一个带有超时的 CancellationTokenSource,将其令牌传递给 SendMessageAsync,并在请求被取消时捕获 OperationCanceledException。 fileciteturn0file0L161-L190
在 ASP.NET Core 应用程序中,您还可以传递请求的取消令牌,以便在客户端断开连接时停止生成。
常见问题
| 问题 | 检查项 |
|---|---|
Not licensed for this method | 确保在调用 SendMessageAsync 之前已加载许可证。 |
Multiple AsposeLLMApi instances | 复用单个实例并正确释放它。 |
| Slow first response | 在全新机器上,首次模型/引擎下载可能需要几分钟。 |
该来源特别记录了许可错误、单活动实例行为以及首次模型加载较慢的问题。 fileciteturn0file0L249-L255
简单聊天 vs. 显式会话
隐式会话方法有意受到限制:它通过在 AsposeLLMApi 实例上维护一个当前对话来保持实现的简洁。
| 如果您需要… | 使用 |
|---|---|
| 单个会话 | SendMessageAsync |
| 短交互聊天 | SendMessageAsync |
| CLI 或原型 | SendMessageAsync |
| 多个独立会话 | 显式会话 |
| 多个用户或并发聊天 | 显式会话 |
| 持久化会话状态 | 会话持久化 |
当一次对话足够时,请使用隐式消息传递。当您需要独立的对话、并发用户、持久状态或对会话标识有更多控制时,请改用显式会话 API。现有来源建议在并发对话和持久状态情况下使用显式会话。 fileciteturn0file0L266-L274
对于显式会话方法,请参阅 Aspose.LLM 文档和多轮/会话 API。
获取免费许可证
Aspose 提供临时许可证用于评估。请从 Aspose 临时许可证页面 获取,并将 Aspose.LLM.lic 文件放置在应用程序可以加载的位置。
免费额外资源
结论
使用 Aspose.LLM 构建简单的 AI 聊天无需显式会话管理。通过创建一个 AsposeLLMApi 实例并调用 SendMessageAsync,您可以构建一个对话体验,API 会自动维护当前会话。
对于简单的应用程序、原型、脚本和单用户聊天体验,这可以保持实现的最小化。当您的应用程序扩展以支持多个会话或需要显式的会话控制时,您可以转向基于会话的 API。
常见问题
我需要手动管理聊天会话吗,使用 Aspose.LLM?
不需要。隐式会话SendMessageAsync方法会在AsposeLLMApi实例的整个生命周期内自动跟踪对话状态。我可以仅针对一个问题更改模型行为吗? 是的。提供一个不同的预设(例如,使用较低的温度)作为
preset参数传递给SendMessageAsync。只有该调用会使用新的设置。如何停止长时间运行的生成? 创建一个带有超时的
CancellationTokenSource并将其令牌传递给SendMessageAsync。捕获OperationCanceledException以处理超时。我应该注意哪些常见错误? 缺少许可证、同时创建多个 API 实例以及首次模型加载缓慢是最常见的问题。请遵循上述缓解步骤。
示例代码准备好用于生产环境了吗? 这些代码片段摘自 Aspose 官方文档,尚未在沙箱中进行测试。请在自己的环境中进行测试,并在部署前添加健壮的错误处理。
