当前位置: 代码网 > it编程>编程语言>Asp.net > C#调用千问、DS、智谱等AI时实现记忆与Token节省方案

C#调用千问、DS、智谱等AI时实现记忆与Token节省方案

2026年10月01日 • Asp.net •我要评论
引言在 c# 中调用千问(qwen)、ds(通义千问)和智谱(如 glm)等大模型时,记忆机制(memory) 和 token 消耗优化 是提升交互体验和降低成本的关键。本文将从技术实现、代码示例、优

引言

在 c# 中调用千问(qwen)、ds(通义千问)和智谱(如 glm)等大模型时,记忆机制(memory) 和 token 消耗优化 是提升交互体验和降低成本的关键。本文将从技术实现、代码示例、优化策略等方面详细解析如何在 c# 中实现记忆功能并节省 token。

一、记忆机制的实现方式

1. 基于conversationbuffermemory的简单记忆

这是最基础的记忆形式,适用于对话长度较短的场景。它会将所有对话消息按顺序存储,并在每次调用时以字符串或消息列表的形式返回。

示例代码:

using langchain.memory;
using langchain.chatmodels;

// 初始化记忆
var memory = new conversationbuffermemory();

// 保存上下文
memory.savecontext(new dictionary<string, object> { { "input", "你好" } }, new dictionary<string, object> { { "output", "您好!有什么需要帮助的?" } });

// 加载记忆
var history = memory.loadmemoryvariables(new dictionary<string, object>());
console.writeline(history["history"]);

说明:此方法适合简单的多轮对话,但不适用于长对话或需要摘要的场景。

2. 基于conversationsummarymemory的摘要记忆

对于长对话,可以使用 conversationsummarymemory 来减少 token 消耗。该模块通过生成摘要的方式,保留关键信息,同时丢弃冗余内容。

示例代码:

using langchain.memory;
using langchain.chatmodels;

// 初始化摘要记忆
var summarymemory = new conversationsummarymemory(
    llm: new chattongyi(), // 使用通义千问模型
    maxtokenlimit: 2000 // 设置最大 token 限制
);

// 保存上下文
summarymemory.savecontext(new dictionary<string, object> { { "input", "你好" } }, new dictionary<string, object> { { "output", "您好!有什么需要帮助的?" } });

// 加载记忆
var history = summarymemory.loadmemoryvariables(new dictionary<string, object>());
console.writeline(history["summary"]);

说明:通过设置 maxtokenlimit,可以控制 token 消耗,避免超出模型限制。

3. 基于 kernel memory 的长期记忆

kernel memory 是微软开源的跨语言记忆框架,支持非结构化数据(如 pdf、网页、markdown 等)的自动切块、向量化、索引,并支持语义检索。

示例代码:

using microsoft.kernelmemory;

// 初始化 kernel memory
var memory = new kernelmemorybuilder()
    .withvectordatabase(new qdrantclient("http://localhost:6333"))
    .build();

// 导入文档
await memory.importdocumentasync("docs/report.pdf");

// 查询记忆
var results = await memory.searchasync("项目背景");
foreach (var result in results)
{
    console.writeline(result.content);
}

说明:kernel memory 不依赖数据库,而是通过向量数据库(如 qdrant、azure ai search)进行语义检索,适合长期记忆和复杂查询。

二、token 消耗优化策略

1. 使用摘要记忆(summary memory)

通过 conversationsummarymemory 或 conversationbuffermemory,将长对话压缩为摘要,减少 token 消耗。

示例代码:

var summarymemory = new conversationsummarymemory(
    llm: new chattongyi(),
    maxtokenlimit: 2000
);

// 保存上下文
summarymemory.savecontext(new dictionary<string, object> { { "input", "你好" } }, new dictionary<string, object> { { "output", "您好!有什么需要帮助的?" } });

说明:通过设置 maxtokenlimit,可以控制 token 消耗,避免超出模型限制。

2. 使用缓存机制

对常见问题或重复请求进行缓存,避免重复调用 llm。

示例代码:

using system.collections.generic;

public class cachemanager
{
    private readonly dictionary<string, string> _cache = new dictionary<string, string>();

    public string get(string key)
    {
        return _cache.containskey(key) ? _cache[key] : null;
    }

    public void set(string key, string value)
    {
        _cache[key] = value;
    }
}

// 使用缓存
var cache = new cachemanager();
if (cache.get("user_query") == null)
{
    var response = await callllm("用户问题");
    cache.set("user_query", response);
}
else
{
    console.writeline("从缓存中获取结果:" + cache.get("user_query"));
}

说明:缓存机制可以显著减少 token 消耗,尤其适用于重复性高的任务。

3. 使用轻量级模型进行路由判断

对于简单任务,使用小模型(如 7b 参数级)进行路由判断,只有复杂任务才调用大模型。

示例代码:

var smallmodel = new chattongyi(model: "qwen-turbo");
var largemodel = new chattongyi(model: "qwen-plus");

var response = await smallmodel.invokeasync("用户问题");
if (response.contains("需要进一步分析"))
{
    response = await largemodel.invokeasync("用户问题");
}

说明:通过分层模型调用,可以有效降低 token 消耗。

三、c# 调用千问、ds、智谱的完整流程

1. 安装依赖

dotnet add package microsoft.kernelmemory --version 7.0.0
dotnet add package langchain --version 0.1.17
dotnet add package dashscope --version 1.0.0

2. 配置 api key

environment.setenvironmentvariable("dashscope_api_key", "your-api-key-here");

3. 初始化千问模型

using langchain.chatmodels;
using langchain.agents;

var llm = new chattongyi(
    model: "qwen-turbo",
    temperature: 0.7,
    maxtokens: 1024
);

4. 实现记忆功能

var memory = new conversationsummarymemory(
    llm: llm,
    maxtokenlimit: 2000
);

// 保存上下文
memory.savecontext(new dictionary<string, object> { { "input", "你好" } }, new dictionary<string, object> { { "output", "您好!有什么需要帮助的?" } });

// 加载记忆
var history = memory.loadmemoryvariables(new dictionary<string, object>());
console.writeline(history["summary"]);

5. 执行任务

var agent = initialize_agent(
    tools: new list<tool>(),
    llm: llm,
    agenttype: agenttype.zeroshotreactdescription,
    verbose: true
);

var response = await agent.runasync("用户问题");
console.writeline(response);

四、总结

在 c# 中调用千问、ds、智谱等 ai 时,记忆机制 和 token 消耗优化 是提升交互体验和降低成本的关键。通过以下方式可以实现:

  • 基于 conversationbuffermemory 和 conversationsummarymemory 的简单或摘要记忆
  • 基于 kernel memory 的长期记忆
  • 使用缓存机制减少重复调用
  • 使用轻量级模型进行路由判断

这些方法不仅能够提升 ai 的智能水平,还能显著降低 token 消耗,提高系统的稳定性和效率。

以上就是c#调用千问、ds、智谱等ai时实现记忆与token节省方案的详细内容,更多关于c#实现ai记忆与token优化的资料请关注代码网其它相关文章!

赞 (0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com