广告位联系
返回顶部

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

C#教程 来源:互联网 作者:佚名 发布时间:2026-10-01 10:03:32 人浏览
摘要

在 C# 中调用千问(Qwen)、DS(通义千问)和智谱(如 GLM)等大模型时,记忆机制(Memory)和Token 消耗优化是提升交互体验和降低成本的关键。本文将从技术实现、代码示例、优化策略等方面详

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

一、记忆机制的实现方式

1. 基于ConversationBufferMemory的简单记忆

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

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

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 消耗。该模块通过生成摘要的方式,保留关键信息,同时丢弃冗余内容。

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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 等)的自动切块、向量化、索引,并支持语义检索。

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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 消耗。

示例代码:

1

2

3

4

5

6

7

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。

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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 参数级)进行路由判断,只有复杂任务才调用大模型。

示例代码:

1

2

3

4

5

6

7

8

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. 安装依赖

1

2

3

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

1

Environment.SetEnvironmentVariable("DASHSCOPE_API_KEY", "your-api-key-here");

3. 初始化千问模型

1

2

3

4

5

6

7

8

using LangChain.ChatModels;

using LangChain.Agents;

 

var llm = new ChatTongyi(

    model: "qwen-turbo",

    temperature: 0.7,

    maxTokens: 1024

);

4. 实现记忆功能

1

2

3

4

5

6

7

8

9

10

11

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. 执行任务

1

2

3

4

5

6

7

8

9

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 消耗,提高系统的稳定性和效率。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • C#调用千问、DS、智谱等AI时实现记忆与Token节省方
    在 C# 中调用千问(Qwen)、DS(通义千问)和智谱(如 GLM)等大模型时,记忆机制(Memory)和Token 消耗优化是提升交互体验和降低成本的关键
  • C#上位机多线程介绍
    C# 多线程的四种打开方式 C# 发展到今天,多线程的写法也经历了几代演变。你不需要全都精通,但至少要知道它们是什么、什么时候用。
  • C#三步实现Word转Excel并保留格式

    C#三步实现Word转Excel并保留格式
    在许多业务流程中,重要数据通常以 Word 文档的形式存在,例如报告、发票、客户清单或其他结构化列表。Microsoft Word 在排版、格式化和展
  • C#代码实现生成带Logo的二维码
    在生成二维码时,您可能希望在其中加入自定义图片,例如公司的 Logo 或个人头像。本文将介绍如何使用Spire.Barcode for .NET库,通过C# 和 VB
  • C#使用Spire.PDF实现PDF与OFD的互转
    在日常办公和电子文档处理中,PDF和OFD是两种最常见的电子文档格式。PDF作为国际通用格式广为人知,而OFD作为国家标准版式文档格式,在
  • 使用C#创建PDF文档的完整教程(文本、图片、形状

    使用C#创建PDF文档的完整教程(文本、图片、形状
    在企业级应用和信息系统中,PDF 一直是最常见、也是最稳定的文档输出格式之一。无论是财务报表、合同文档、业务统计报告,还是系统自
  • C# Spire.XLS for .NET轻松实现Excel到TXT的转换
    在数据处理领域,Excel文件以其强大的功能占据着举足轻重的地位。然而,在诸多应用场景下,我们却需要将这些结构化的Excel数据转换为更
  • C#中弱引用使用介绍

    C#中弱引用使用介绍
    弱引用(Weak Reference)是一种特殊的引用类型,它允许你引用一个对象,但不会阻止该对象被垃圾回收器(GC)回收。弱引用通常用于需要缓
  • C++ move的作用介绍及陷阱最佳实践
    C++ move 的作用详解 这是个核心概念题!让我从浅到深给你讲清楚。 一、一句话总结 std::move的作用:将对象转换为右值引用,允许资源被移
  • C#借助Spire.XLS for .NET实现在Excel中添加文档属性
    在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色。然而,除了单元格中的数据,你是否曾关注过Excel文件的幕后信息文档属
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计