在 C# 中实现对话摘要以减少 Token 消耗
在 C# 中调用大模型(如千问、DS、智谱等)时,对话摘要 是一种有效的 Token 消耗优化策略。通过将长对话压缩为摘要,可以显著减少 Token 使用量,同时保留关键信息。
🧠 一、实现方式:使用 ConversationSummaryMemory
ConversationSummaryMemory 是 LangChain 提供的一种记忆机制,它会自动对对话历史进行摘要,从而减少 Token 消耗。
1. 安装依赖
bash
dotnet add package LangChain --version 0.1.17
2. 初始化模型与记忆
csharp
using LangChain.ChatModels;
using LangChain.Memory;
// 初始化千问模型
var llm = new ChatTongyi(
model: "qwen-turbo",
temperature: 0.7,
maxTokens: 1024
);
// 初始化摘要记忆
var summaryMemory = new ConversationSummaryMemory(
llm: llm,
maxTokenLimit: 2000 // 设置最大 Token 限制
);
3. 保存上下文
csharp
// 保存用户输入和模型输出
summaryMemory.SaveContext(
new Dictionary<string, object> { { "input", "你好" } },
new Dictionary<string, object> { { "output", "您好!有什么需要帮助的?" } }
);
4. 加载记忆
csharp
// 加载记忆并获取摘要
var history = summaryMemory.LoadMemoryVariables(new Dictionary<string, object>());
Console.WriteLine(history["summary"]);
💡 二、优化策略:减少 Token 消耗
1. 设置 maxTokenLimit
通过设置 maxTokenLimit,可以控制每次调用 LLM 时的 Token 数量,避免超出模型限制。
csharp
var summaryMemory = new ConversationSummaryMemory(
llm: llm,
maxTokenLimit: 2000 // 控制 Token 数量
);
2. 使用轻量级模型生成摘要
对于摘要生成,可以使用轻量级模型(如 qwen-turbo)来降低 Token 消耗。
csharp
var summaryModel = new ChatTongyi(
model: "qwen-turbo",
temperature: 0.7,
maxTokens: 512
);
3. 避免全量上下文传递
在调用 LLM 时,只传递摘要内容,而不是完整的对话历史。
csharp
var response = await llm.InvokeAsync(
prompt: "根据以下摘要回答问题:" + history["summary"],
temperature: 0.7
);
📦 三、完整示例代码
csharp
using System.Collections.Generic;
using LangChain.ChatModels;
using LangChain.Memory;
class Program
{
static async Task Main(string[] args)
{
// 初始化千问模型
var llm = new ChatTongyi(
model: "qwen-turbo",
temperature: 0.7,
maxTokens: 1024
);
// 初始化摘要记忆
var summaryMemory = new ConversationSummaryMemory(
llm: llm,
maxTokenLimit: 2000
);
// 保存上下文
summaryMemory.SaveContext(
new Dictionary<string, object> { { "input", "你好" } },
new Dictionary<string, object> { { "output", "您好!有什么需要帮助的?" } }
);
// 加载记忆
var history = summaryMemory.LoadMemoryVariables(new Dictionary<string, object>());
Console.WriteLine("摘要内容: " + history["summary"]);
// 使用摘要内容调用 LLM
var response = await llm.InvokeAsync(
prompt: "根据以下摘要回答问题:" + history["summary"],
temperature: 0.7
);
Console.WriteLine("LLM 响应: " + response);
}
}
🚀 四、总结
在 C# 中实现对话摘要以减少 Token 消耗,可以通过以下方式:
- 使用
ConversationSummaryMemory实现对话摘要。 - 设置
maxTokenLimit控制 Token 数量。 - 使用轻量级模型生成摘要,降低 Token 消耗。
- 避免全量上下文传递,只传递摘要内容。
这些方法不仅能够显著降低 Token 消耗,还能提升系统的效率和稳定性。
互动话题:你在 C# 中调用 AI 时,遇到过哪些 Token 消耗过高的问题?欢迎在评论区分享你的经验!