当前位置: 首页 > article >正文

AI Agent开发(3) -如何做上下文管理?

目录前言思路collection设计示例前言书接上文https://blog.csdn.net/roadtohacker/article/details/156004134在Agent开发中上下文信息的处理很重要当用户给出新的输入的时候如何让模型保持对旧消息的记忆我们知道对于大模型而言有知识和记忆两种数据输入。模型训练固化下来的参数和外挂的知识库可以认为是模型的知识模型还有长期记忆和短期记忆长期记忆可以理解为用户长时间之前的输入或者说用户画像短期记忆就是用户最近的输入。但每次请求对于模型而言都是独立的也就是说模型本身不会记住之前的输入因为它本身的参数不会跟着输入的变化而变化(但谷歌、英伟达在做类似的研究https://www.thepaper.cn/newsDetail_forward_32133128https://36kr.com/p/3647056233926277让模型在推理贵过程中动态调整参数实现真正的“记忆”)所以说让模型拥有记忆实际上是一个工程问题。思路一个简单的办法是把所有的对话都原封不动的发送给大模型这样能够保留所有的记录但问题是这样token的增长是线性的如果不控制一会就超过上下文限制了而且这种方式是把不太重要的消息跟重要的消息注意力提到同等位置也会导致模型忽略了重要的信息。所以我们可以考虑短期记忆和长期记忆结合的方式来做上下文的管理。对于短期记忆我们可以保留最近的n nn轮完整用户对话只需要把最近n nn轮对话原封不动再发送给大模型即可这样最近若干轮用户的输入模型一定是原原本本的保存下来的对于长期记忆可以通过摘要向量数据库(milvus)存储的方式对用户的输入到向量数据库与检索topk个历史记录把它跟短期记忆结合到一块这样就实现了完整的上下文记忆collection设计var(ChatHistoryCollectionCollection{Name:CHatHistoryCollectionName,Schema:entity.Schema{Description:AI助手用户对话历史表,CollectionName:CHatHistoryCollectionName,Fields:[]*entity.Field{{Name:id,DataType:entity.FieldTypeInt64,AutoID:true,PrimaryKey:true,},{Name:user,DataType:entity.FieldTypeVarChar,TypeParams:map[string]string{max_length:255,},},{Name:request_id,DataType:entity.FieldTypeVarChar,TypeParams:map[string]string{max_length:255,},},{Name:session,DataType:entity.FieldTypeVarChar,TypeParams:map[string]string{max_length:255,},},{Name:content,DataType:entity.FieldTypeVarChar,TypeParams:map[string]string{max_length:65535,},},{Name:vector,DataType:entity.FieldTypeFloatVector,TypeParams:map[string]string{dim:1024,},},{Name:timestamp,DataType:entity.FieldTypeInt64,TypeParams:map[string]string{max_length:255,},},},},})// DB初始化func(a*AgentMilVusClient)DBInit(ctx context.Context)error{collections:[]Collection{ChatHistoryCollection,}for_,collection:rangecollections{has,err:a.MilVusCli.HasCollection(ctx,milvusclient.NewHasCollectionOption(collection.Name))iferr!nil{returnerr}ifhas{log.Logger.Info(AgentMilVusClient found collection, skipped,name,collection.Name)}else{log.Logger.Info(AgentMilVusClient creating collection...,name,collection.Name)iferra.MilVusCli.CreateCollection(ctx,milvusclient.NewCreateCollectionOption(collection.Name,collection.Schema));err!nil{returnerr}}index:milvusindex.NewGenericIndex(vector_index,map[string]string{metric_type:string(entity.COSINE),})log.Logger.Info(AgentMilVusClient creating index...,name,collection.Name,index,index.Name())createdIndexTask,err:a.MilVusCli.CreateIndex(ctx,milvusclient.NewCreateIndexOption(CHatHistoryCollectionName,vector,index))iferr!nil{log.Logger.Error(err,failed to create index,name,collection.Name)returnerr}iferrcreatedIndexTask.Await(ctx);err!nil{log.Logger.Error(err,failed to create index,name,collection.Name)returnerr}if_,erra.MilVusCli.LoadCollection(ctx,milvusclient.NewLoadCollectionOption(CHatHistoryCollectionName));err!nil{log.Logger.Error(err,failed to load collection,name,collection.Name)}log.Logger.Info(AgentMilVusClient has created collection,name,collection.Name)}returnnil}示例下面是一个长短期记忆结合的例子// loadUserHistory topK组长期记忆最近k轮短期记忆func(a*AgentService)loadUserHistory(ctx context.Context,cDto*dto.ChatDto,kint)[]*schema.Message{results,err:a.agentMilVusCli.Search(ctx,milvuscli.AgentSearchParams{TopK:5,Message:cDto.Message,FieldNames:[]string{content},Session:cDto.Session,User:cDto.Erp,})varmsgs[]*schema.Messageiferr!nil{log.Logger.Error(err,failed to search from milVus,user,cDto.Erp,session,cDto.Session)}else{for_,result:rangeresults{contentCol:result.GetColumn(content)fori:0;iresult.ResultCount;i{content,err:contentCol.Get(i)iferr!nil{log.Logger.Error(err,failed to get the content,user,cDto.Erp,session,cDto.Session)continue}msgsappend(msgs,schema.SystemMessage(gconv.String(content)))}}}returnappend(msgs,a.loadUserHistoryFromRedis(ctx,cDto,k)...)}上面是一个简单的思路但生产环境可能遇到下面的问题仅用“固定保留最近n轮”容易在长对话、长输入时爆token上限或把无关长段文字保留而挤占真正重要信息。单纯“向量top-k”易命中相似但不关键的片段且易受长文本噪声影响。具体实现需要结合下面的指标检测进行动态调整设定指标检索命中率是否命中真正所需记忆、答案正确率/一致性、摘要一致性与抽取真值对齐度、时延与token成本。灰度与A/B对记忆策略n、topk、权重公式做可控实验落库版本化便于回滚。

相关文章:

AI Agent开发(3) -如何做上下文管理?

目录前言思路collection设计示例前言 书接上文 https://blog.csdn.net/roadtohacker/article/details/156004134 在Agent开发中,上下文信息的处理很重要,当用户给出新的输入的时候,如何让模型保持对旧消息的记忆?我们知道&#…...

STM32硬件I2C驱动AS5600磁编码器:从CubeMX配置到完整代码实现

STM32硬件I2C驱动AS5600磁编码器:从CubeMX配置到完整代码实现 在电机控制、机器人关节定位等需要高精度角度检测的应用场景中,磁性旋转位置传感器因其非接触式测量特性而备受青睐。AS5600作为一款12位高分辨率磁性编码器,通过I2C接口可提供精…...

基于51单片机的智能饮水机控制系统(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T0012305C设计简介:本设计是基于51单片机的智能饮水机控制系统,主要实现以下功能:1.可通过显示屏显示当前水温和温度阈值…...

STPopup键盘处理详解:智能避让和自动重定位的终极解决方案

STPopup键盘处理详解:智能避让和自动重定位的终极解决方案 【免费下载链接】STPopup STPopup provides STPopupController, which works just like UINavigationController in popup style, for both iPhone and iPad. Its written in Objective-C and compatible w…...

Ammonite BSP协议详解:如何实现与IDE的无缝集成

Ammonite BSP协议详解:如何实现与IDE的无缝集成 【免费下载链接】Ammonite Scala Scripting 项目地址: https://gitcode.com/gh_mirrors/amm/Ammonite Ammonite作为一款强大的Scala脚本工具,通过BSP(Build Server Protocol&#xff09…...

Docker 从入门到实践:容器化你的应用

Docker 从入门到实践:容器化你的应用 在当今快速发展的软件开发领域,Docker 已成为一项革命性的技术,它通过容器化技术彻底改变了应用的开发、部署和运行方式。无论是开发者、运维工程师还是技术爱好者,掌握 Docker 都能显著提升…...

C++的std--format:C++20中的现代化字符串格式化

C的std::format:C20中的现代化字符串格式化 在C20标准中,std::format的引入彻底改变了字符串格式化的方式,为开发者提供了一种更现代化、更安全且高效的解决方案。传统的字符串格式化方法,如C风格的printf或C的iostream&#xff…...

突破网络限制:本地化部署bert_base_uncased的实践指南

1. 为什么需要本地化部署bert_base_uncased 最近在复现一个CVPR论文的代码时,遇到了一个让人头疼的问题:代码需要从Hugging Face下载bert_base_uncased预训练模型,但由于网络环境限制,始终无法成功连接。相信很多开发者都遇到过类…...

5个实用技巧掌握BOTW Save Editor GUI存档修改工具

5个实用技巧掌握BOTW Save Editor GUI存档修改工具 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI BOTW Save Editor GUI是一款专为《塞尔达传说:旷野之…...

Nordic主题高级配置:性能优化与多平台兼容性解决方案

Nordic主题高级配置:性能优化与多平台兼容性解决方案 【免费下载链接】Nordic :snowflake: Dark Gtk3.20 theme created using the awesome Nord color pallete. 项目地址: https://gitcode.com/gh_mirrors/no/Nordic Nordic是一款基于Nord北极蓝色彩方案的专…...

终极指南:东南大学论文模板的完整解决方案,高效完成毕业论文格式排版

终极指南:东南大学论文模板的完整解决方案,高效完成毕业论文格式排版 【免费下载链接】SEUThesis 项目地址: https://gitcode.com/gh_mirrors/seu/SEUThesis SEUThesis是东南大学官方认证的论文模板库,为本科生、硕士生和博士生提供一…...

实测实在Agent:打破“龙虾”落地僵局,科普Agent如何进化为企业级数字员工?

摘要: 站在2026年4月的技术拐点,以“龙虾”(OpenClaw)为代表的科普Agent已从极客圈的“命令行玩具”演变为产业界的“执行力支柱”。然而,在企业级落地过程中,API缺失导致的“系统围墙”、信创环境下的适配…...

Ai2Psd:告别矢量丢失!Illustrator到PSD无损转换的终极解决方案

Ai2Psd:告别矢量丢失!Illustrator到PSD无损转换的终极解决方案 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd 还在为…...

解放数字音乐:QMCDecode让加密音频转换变得简单高效

解放数字音乐:QMCDecode让加密音频转换变得简单高效 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换…...

ARM交叉编译避坑指南:搞懂-mfloat-abi参数,告别ABI不兼容的诡异错误

ARM交叉编译避坑指南:搞懂-mfloat-abi参数,告别ABI不兼容的诡异错误 在嵌入式开发领域,ARM架构的交叉编译是每个工程师的必修课。但当你信心满满地配置好工具链,执行make命令时,突然跳出的fatal error: gnu/stubs-soft…...

Qwen2.5-VL-7B-Instruct部署教程:国产化信创环境(昇腾/海光)适配可行性分析

Qwen2.5-VL-7B-Instruct部署教程:国产化信创环境(昇腾/海光)适配可行性分析 1. 项目背景与意义 Qwen2.5-VL-7B-Instruct作为阿里通义千问推出的多模态大模型,在图文理解和交互方面表现出色。随着国产化信创环境的普及&#xff0…...

【Python原生AOT编译终极指南(2026权威实测版)】:覆盖CPython 3.14+、PyO3深度集成与生产级二进制交付全流程

第一章:Python原生AOT编译演进全景与2026技术定位Python长期以解释执行和字节码(.pyc)为核心运行范式,但自2021年CPython 3.11引入更快的PEP 659自适应解释器起,AOT(Ahead-of-Time)编译路径开始…...

MySQL 索引实战详解:为什么B+类型的索引查询更快

MySQL 索引实战详解:为什么B类型的索引查询更快 在MySQL数据库实战中,索引是提升查询性能的核心手段——无需逐行扫描全表,通过索引可快速定位目标数据,将千万级数据的查询耗时从分钟级压缩到毫秒级。某电商平台用户表(5000万数据…...

Pixel Aurora Engine效果展示:极光视觉系统UI与生成图像色调自动匹配机制

Pixel Aurora Engine效果展示:极光视觉系统UI与生成图像色调自动匹配机制 1. 像素极光引擎概览 Pixel Aurora Engine是一款融合复古美学与现代AI技术的创意工具,它将扩散模型的高质量图像生成能力与8-bit像素艺术风格完美结合。这款"虚拟游戏机&q…...

为什么你的C# 13主构造函数无法单步执行?微软Roslyn团队2024Q2调试协议变更详解(首批实测报告)

第一章:为什么你的C# 13主构造函数无法单步执行?C# 13 引入的主构造函数(Primary Constructor)语法简洁优雅,但调试时却常出现断点失效、F10/F11 无法单步进入等问题。根本原因在于:**主构造函数不生成独立…...

MySQL 实战进阶:从单表优化到分布式数据库适配

MySQL 实战进阶:从单表优化到分布式数据库适配 在企业业务发展的不同阶段,MySQL 的应用场景从简单的单表查询,逐步演进到高并发、海量数据的处理场景。多数开发者在入门 MySQL 后,容易陷入“会用但不会优”的困境——单表数据量激…...

LoRA训练助手GPU算力优化:支持FP16/INT4双精度推理,显存占用降低58%

LoRA训练助手GPU算力优化:支持FP16/INT4双精度推理,显存占用降低58% 1. 为什么需要GPU算力优化 如果你尝试过训练自己的AI绘画模型,一定遇到过这样的困扰:生成训练标签时显存爆满、推理速度慢、甚至因为资源不足而中断进程。传统…...

如何快速实现FastAPI国际化:多语言支持完整指南

如何快速实现FastAPI国际化:多语言支持完整指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI作为一款高性能、易…...

腾讯混元OCR网页推理快速搭建:新手友好型部署指南与问题汇总

腾讯混元OCR网页推理快速搭建:新手友好型部署指南与问题汇总 1. 认识腾讯混元OCR 腾讯混元OCR是一款基于混元原生多模态架构的轻量级文字识别专家模型。作为一款仅1B参数的轻量化模型,它在多项OCR任务中取得了业界领先的成绩。这个网页推理版本将强大的…...

7个强力修复方案:解决Windows更新故障的创新方法

7个强力修复方案:解决Windows更新故障的创新方法 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool Windows更新故障是…...

LangFlow可视化优势:拖拽式AI流水线构建实操案例

LangFlow可视化优势:拖拽式AI流水线构建实操案例 1. 引言:告别代码,用拖拽构建AI应用 如果你对AI应用开发感兴趣,但一看到复杂的代码和框架就头疼,那么LangFlow可能就是为你量身打造的工具。想象一下,构建…...

window 10 主机安装ubuntu22 系统

准备工作 下载ubuntu22镜像 使用ubuntu_server_220405时,当在/etc/netplan/50-cloud-init.yaml文件里编辑网卡信息 network:version: 2renderer: networkdethernets:eth0:dhcp4: noaddresses: - 172.20.10.2/24routes:- to: defaultvia: 172.20.10.1nameservers:ad…...

解锁Android黑科技:动态加载Activity,让你的App秒变变形金刚

解锁Android黑科技:动态加载Activity,让你的App秒变变形金刚 一、开篇引入 在如今的移动应用开发领域,动态加载 Activity 技术在 Android 开发中占据着举足轻重的地位。想象一下,你使用的 360 安全卫士,在不重新安装…...

深度解析Emby高级功能解锁技术:3种高效破解方案完整指南

深度解析Emby高级功能解锁技术:3种高效破解方案完整指南 【免费下载链接】emby-unlocked Emby with the premium Emby Premiere features unlocked. 项目地址: https://gitcode.com/gh_mirrors/em/emby-unlocked 还在为Emby Premiere的高昂订阅费用而烦恼吗&…...

openvino-plugins-ai-audacity高效部署指南:跨平台配置与性能优化避坑指南

openvino-plugins-ai-audacity高效部署指南:跨平台配置与性能优化避坑指南 【免费下载链接】openvino-plugins-ai-audacity A set of AI-enabled effects, generators, and analyzers for Audacity. 项目地址: https://gitcode.com/gh_mirrors/op/openvino-plugin…...