【LLM】Agent在智能客服的实践(AI agent、记忆、快捷回复 | ReAct)
note
内容概况:结合京粉app学习agent的实践
- Agent架构:通过模型训练提升LLM识别工具的准确性;设计可扩展并安全可控的agent架构扩展业务能力。
- 记忆:多轮对话应用中如何组织、存储和检索记忆来提升大模型对用户的理解。
- 快捷回复:利用快捷回复做用户意图的路径规划,实现业务目标。
Agent落地具体场景,需要定制:
- Prompt 模板中 few shot 中的内容。
- function calling 中的外部工具定义。
注意事项:
- 本质上所有的 Agent 设计模式都是将人类的思维、管理模式以结构化prompt的方式告诉大模型来进行规划,并调用工具执行,且不断迭代的方法。
未来展望:
- 1、垂类领域用户意图的理解:结合垂类业务的特点,通过自然语言沟通交流的方式,更加精准更快速的识别用户的意图,模型上需要大量的真实可靠的业务数据来进行训练,机制上需要对Agent进行升级,多个更加专业的助理进行协作,例如multi Agent的应用。
- 2、生成式推荐技术:对现有推荐系统进行技术变革,从召回、排序、重排固有的推荐链路演变成直接生成用户所需的内容或商品。
- 3、成本效率:大语言模型虽然很强大,但是其应用也带来巨大的成本和效率上的考验,如何在垂类领域采用较小的模型实现大模型的效果,如何对模型推理加速,提高计算利用效率,降低机器成本,也是我们长期需要考虑和优化的地方。
文章目录
- note
- 一、LLM based agent实践
- 二、实战1-AI Agent
- 1. 工具识别
- 2. Agent实现
- (1)Agent的两阶段
- (2)合理的架构
- 三、实战2- 记忆
- 四、实战3-快捷回复
- 五、ReAct原理和实现
- Reference
一、LLM based agent实践
某东客户端背景:一个助手帮助推客,随时解答用户问题、利用数据分析指导用户进行选品推广、提醒活动、经营指导、素材生成等。
Agent:进行规则、决策、执行。同时智能体拥有记忆、使用工具能力。
痛点:解决LLM对垂直场景专业知识不足、知识的时效性、容易出现幻觉等。
挑战:
- 工具的识别:开源模型对于外部工具使用能力准确率有待提高
- Agent架构:智能客服->智能创意->推荐系统->自动驾驶->智能机器人
二、实战1-AI Agent
1. 工具识别
- system prompt:不稳定
- 把工具训练到模型:利用ToolLLM框架提供的数据构建、模型微调、评测框架来增强对工具的使用能力
2. Agent实现
(1)Agent的两阶段
- 最初agent实现,是基于langchain的agent来开发的
- langchain的开发问题:过度封装、异步并发效率低、版本前后不兼容、核心功能难易控制,由于langchain是用python实现:解释性语言进行速度慢、并发处理能力较弱、适合做实验或小型应用。
- 在ReAct范式上,结合内部组件、自研组件,融入了工具/接口的接入、自定义工具的编排、记忆模块、vearch向量检索、prompt引擎、流式回调函数、各模块的监控、用golang重写了agent架构等,提升了系统稳定性、高并发能力。
- Agent分为2各阶段:
- 初始化阶段:
- 对环境信息的收集,包括用户的输入、历史记忆加载、工具的接入、prompt接入、模型的接入、流式/非流式回调接入,langchain中agent启动阶段很耗时。
- 针对每轮用户的交互,agent需要初始化,采用agent复用的方式进行预加载,除了用户的输入、历史记忆,其他模块全部提前加载,提升效率
- 迭代执行阶段:预处理模块、规划、后处理模块、执行
- 预处理模块需要维护一个阶段状态(第几轮迭代)和数据的拼接处理(用户的输入+大模型回复+执行结果)。
- 规划阶段主要是通过大模型推理阶段,这里需要预留对工具的解析模块,因为不同的模型对于工具的输入是不一样的。
- 后处理模块是对模型规划的结果进行解析,有部分需要注意对模型规划的结果做区分,结束或调用工具,需要在这里进行流式和非流式的结果存储和返回,如果需要调用工具,就进入执行模块。
- 执行阶段将工具的调用结果送入预处理模块进行下一轮的迭代,在模型的调用和工具的调用中都预设了自定义钩子,用户可以根据需求在自定义工具执行的任意阶段进行流式输出。
- 初始化阶段:
(2)合理的架构
(1)完全智能化架构:系统的运行完全依靠agent自主执行
(2)安全性架构:系统运行依靠提前编写的任务流,agent只做流程的选择和选择。
京粉智能推广助手的业务主要需求:
功能 | 描述及解决方案 | 依赖 |
---|---|---|
知识问答 | 京东联盟有很多针对推客的使用介绍、规则、常用问题。可以通过外挂知识库解决 | 知识库 |
经营分析 | 对于推客经营状进行分析,包括收入、客群画像、推广建议。可以通过联盟各种已有工具接口进行数据的接入。 | 推查/用户画像/活动等工具接口 |
推广选品 | 目标明确的(搜索iphone15 pro max)、目标模糊的(过年送长辈的礼物)、无目的对于推荐的商品,要有推荐理由。同步相似品牌多维度对比(佣金、价格、销量、评论等)分别简单任务和复杂任务。复杂任务可以通过特定的任务流实现 | 商品接口/历史数据/同品相似品牌数据 |
文案生成 | 对于选好的商品,帮助推客自动化生推广文案和分享链接 | 转链工具 |
- 从功能需求来看,既有简单任务,又有复杂任务,而且随着时间的推移,增加的任务会越来越多,同时业务的定制化内容越来越复杂,对Agent的难度会增加很多。
- 为了平衡从业务、安全、成本、效率考虑,最终通过自定义任务流与agent自主决策相结合的方式,兼容了动态规划、自主决策执行任务流与业务的可定制化、可扩展性。
三、实战2- 记忆
对于多轮对话形式的大模型应用来说,上下文信息对于模型理解人类需求有很大的帮助,如果没有记忆,在多轮对话中,大模型的表现会比较割裂,长期的记忆也会让模型对用户的习惯、偏好有更好的认知。
重点:
- 模拟人类大脑记忆和检索方式,构建长/短期记忆
- 多轮对话中的垂类领域知识的结构化记忆
技术方案:记忆的构建可以概括为理解、存储、删除和检索的过程。
- 短期记忆:短期记忆的设计比较容易,包括短期滑窗多轮对话的方式和定长时间内的多轮对话都可以作为短期记忆,短期记忆要尽可能的存储细节信息,但是轮数要尽可能的少。
- 长期记忆:将短期的记忆提取实体信息(通过NER抽取实体信息;通过LLM对缓存进行总结、压缩,按照记忆片段和时间戳进行向量表征并存入向量库中)
- 垂类领域知识:比如京东的skuid,是一个数字类型,不代表任何语义信息,在前面的对话中可能会输出给用户某个skuid,如果短期记忆已被压缩成长期记忆,就会导致不包含任何语义信息的数字类型消失,我们可以通过自定义结构化信息存储的方式将这类信息与长/短时记忆进行融合存储和检索,这样在用户多轮次对话中就可以通过(“分析上一个商品”)从记忆中获取结构化的skuid来查找并分析该商品,而不是必须输入分析上一个商品的“skuid”才能够识别。
- 检索时同时检索短时缓存记忆和向量库长时记忆检索(通过vearch实现)以及垂类领域知识,将三部分进行融合后,作为整体的记忆模块,节省记忆空间。
四、实战3-快捷回复
1.通过历史信息和用户的当前输入,利用大模型总结续写能力,生成一些用户可能继续输入的内容。
2.结合应用的功能预设一些常用问题。
3.重点:可以根据应用的业务目标,来规划用户使用路径图,使用户按照快捷回复的路径最终达成我们需要的业务目标,在实际业务中可以结合1、2点,既有用户想输入的,又有我们想让用户看到的功能。
五、ReAct原理和实现
Agent落地具体场景,需要定制:
- Prompt 模板中 few shot 中的内容。
- function calling 中的外部工具定义。
LLM agent第一文,发表于2022年10月(chatgpt还没出来),提出让大模型学会工具。在论文的开头作者也提到了人类智能的一项能力就是 Actions with verbal reasoning,即每次执行行动后都有一个“碎碎念 Observation”:我现在做了啥,是不是已经达到了目的。这相当于让 Agent 能够维持短期记忆。
EX:让孩子帮去厨房拿一个胡椒粉。
Action1:先看看台面上有没有;
Observation1:台面上没有胡椒粉,执行下一步;
Action2:再拉开灶台底下抽屉里看看;
Observation2:抽屉里有胡椒粉;
Action3:把胡椒粉拿出来。
重点:本质上所有的 Agent 设计模式都是将人类的思维、管理模式以结构化prompt的方式告诉大模型来进行规划,并调用工具执行,且不断迭代的方法。
(1)生成提示词。首先,将代码中预设好 ReAct 的提示词模板(格式为Quesion->Thought->Action->Observation)和用户的问题进行合并。得到的提示词是这样的。
- 如果要针对自己的领域定制,需要将fewshot的内容替换,比如action可能有"Send message to someone",这里的send可能对应一个外部接口。
(2)调用大模型生成Thought+Action。 接下来将 few shot 提示词发给大模型。如果直接将上述提示词发给大模型,大模型生成将针对用户问题生成一堆 Thought,Action 和 Observation,但显然这里 Action 还没有展开,我们并不希望大模型输出 Observation。在代码里通过 Stop.Observation 来控制大模型遇到Observation后停止输出,于是大模型仅仅返回 Thought 和 Action,而不会把 Observation 给生成出来。
(3)调用大模型生成Thought+Action。 接下来将 few shot 提示词发给大模型。大模型仅仅返回 Thought 和 Action,而不会把 Observation 给生成出来。
(3)调用外部工具。拿到action后走function call,可以微调。
(4)生成Observation。api返回结果,还会将接口返回内容转换为自然语言输出,生成 Observation,然后将 Observation 的内容,加上刚刚的 Thought, Action 内容输入给大模型,重复第 2,3 步,直至 Action 为Finish 为止。
(5)完成输出。将最后一步的 Observation 转化为自然语言输出给用户。
Reference
[1] 京粉智能推广助手-LLM based Agent在联盟广告中的应用与落地
[2] Agent的九种设计模式(图解+代码)
相关文章:

【LLM】Agent在智能客服的实践(AI agent、记忆、快捷回复 | ReAct)
note 内容概况:结合京粉app学习agent的实践 Agent架构:通过模型训练提升LLM识别工具的准确性;设计可扩展并安全可控的agent架构扩展业务能力。记忆:多轮对话应用中如何组织、存储和检索记忆来提升大模型对用户的理解。快捷回复&…...

19款奔驰E300升级新款触摸屏人机交互系统
《19 款奔驰 E300 的科技焕新之旅》 在汽车科技日新月异的时代,19 款奔驰 E300 的车主们为了追求更卓越的驾驶体验,纷纷选择对爱车进行升级改装,其中新款触摸屏人机交互系统的改装成为了热门之选。 19 款奔驰 E300 作为一款经典车型&#x…...

Python知识点:如何使用Spark与PySpark进行分布式数据处理
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! Apache Spark 是一个强大的分布式数据处理系统,而 PySpark 是 Spark …...

低功耗4G模组Air780E之串口通信篇
你对低功耗4G模组Air780E有多少了解? 今天我们来讲解低功耗4G模组Air780E的串口通信的基本用法,小伙伴们,学起来吧! 一、硬件准备 780E开发板一套,包括天线、USB数据线。 USB转TTL工具或线(例如ch340、…...

Python | Leetcode Python题解之第455题分发饼干
题目: 题解: class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort()s.sort()m, n len(g), len(s)i j count 0while i < m and j < n:while j < n and g[i] > s[j]:j 1if j < n:count 1i …...

交叠型双重差分法
交叠型双重差分法(Staggered Difference-in-Differences, Staggered DiD)是一种扩展的双重差分(Difference-in-Differences, DiD)方法,用于处理多个时间点的政策干预或处理组(treatment group)并…...

Java中的数据合并与拆分:使用Stream API实现数据的灵活处理
Java中的数据合并与拆分:使用Stream API实现数据的灵活处理 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,数据处理是最基础的操作之一,而在面对…...

Arthas(阿尔萨斯)
Arthas Arthas可以为你做什么? 安装下载 //Linux环境下 wget https://alibaba.github.io/arthas/arthas-boot.jar //Windows环境下可以直接去官网下载压缩包 https://arthas.aliyun.com/doc/download.html//启动命令 java -jar arthas-boot.jar 启动阿尔萨斯&#…...

黑马linux笔记(转载)
学习链接 视频链接:黑马程序员新版Linux零基础快速入门到精通 原文链接:黑马程序员新版Linux零基础快速入门到精通——学习笔记 黑马Linux笔记 文章目录 学习链接01初识Linux1.1、操作系统概述1.1.1、硬件和软件1.1.2、操作系统1.1.3、常见操作系统 1.…...

SQL Server—通配符(模糊查询)详解
SQL Server—通配符(模糊查询)详解 在SQL Server中,通配符是一种特殊的符号,用于在LIKE运算符中搜索模式。SQL Server支持三种通配符:百分号(%),下划线(_)和方括号([]&am…...

软考系统分析师知识点二:经济管理
前言 今年报考了11月份的软考高级:系统分析师。 考试时间为:11月9日。 倒计时:35天。 目标:优先应试,其次学习,再次实践。 复习计划第一阶段:扫平基础知识点,仅抽取有用信息&am…...

C语言自定义类型联合和枚举(25)
文章目录 前言一、联合体联合体的声明联合体的特点联合体和结构体内存布局对比联合体的大小计算联合体的实际使用样例礼品兑换单判断当前机器是大端还是小端 二、枚举枚举的定义枚举类型的声明枚举类型的优点枚举类型的使用 总结 前言 关于自定义类型除了我们常用的结构体&…...

Kafka 的重平衡问题详解及解决方案
引言 Kafka 是目前非常流行的分布式消息队列系统,被广泛应用于流数据处理、日志分析、事件驱动架构等场景中。Kafka 的高吞吐量和分布式架构在应对海量数据传输方面具有显著优势。然而,Kafka 在处理消费者组时,会面临一个核心问题——重平衡…...

比较GPT4比较正确的回复的提问方式和比较失败的提问方式之间的区别?
比较GPT4比较正确的回复的提问方式和比较失败的提问方式之间的区别? 正确提问失败提问异同 正确提问 ####一堆python源码############# 这里如何根据数据是新建还是更新来调用不同的save方法? 失败提问 ####一堆python源码############# 为什么在修改…...

jmeter学习(1)线程组与发送请求
1、线程组 执行顺序 :setUp线程组 > 线程组 > tearDown线程组 2、 发送请求 可以发送http、java、dubbo 请求等 下面讲解发送http 1)Http请求默认值 作用范围是该线程组下的所有HTTP请求,如果http请求设置的与默认值冲突࿰…...

【小技巧】mysql 判断表字段是否存在 删除字段 sql脚本
MySQL 判断表字段是否存在 删除字段 sql脚本 下面是一个包含插入和更新操作的流程: -- 先尝试插入数据 INSERT IGNORE INTO user_info (last_name, first_name) VALUES (x, y);-- 如果插入成功,ROW_COUNT() 返回 1,否则返回 0 IF ROW_COUNT…...

低代码革命:重塑工业互联网的未来版图
在数字化转型的浪潮中,低代码应用正以前所未有的速度席卷各行各业,尤其是在工业互联网领域,它正悄然改变着企业的技术架构和业务模式。本文将深入探讨低代码应用如何成为工业互联网的技术趋势,并展望其未来的辉煌前景,…...

KNN算法
KNN算法 一 KNN算法介绍二 KNN算法API2.1 KNeighborsClassifier 分类算法2.2 KNeighborsRegressor 回归算法 三 两个经典案例3.1 鸢尾花案例3.2 手写数字识别案例 一 KNN算法介绍 K-近邻算法(K Nearest Neighbor,简称KNN).比如根据你的“邻居…...

TS 中类型的继承
在 TypeScript(TS)中,类型的继承通常通过接口(Interfaces)和类(Classes)来实现。接口提供了一种定义对象形状的方式,而类则提供了一种创建对象实例的方式。以下是如何在 TypeScript …...

在VS code 中部署C#和avalonia开发环境
要在 Mac 的 VS Code 中配置 C# 和 Avalonia 的开发环境,您可以按照以下步骤进行: 1. 安装 .NET SDK 下载 .NET SDK: 访问 .NET 下载页面。选择适用于 macOS 的最新稳定版本的 .NET SDK,并下载安装程序。安装 .NET SDK࿱…...
Windows删除service服务
Windows删除service服务 找到命令提示符: 右键,以管理员身份运行 输入: sc delete 服务名 Windows根据TCP端口号查找进程PID再kill进程_windows tcpkill-CSDN博客文章浏览阅读5.3k次,点赞42次,收藏104次。Windows根据…...

【数据结构】---图
图 前言 本篇作为图的基础概念篇, 了解图的离散数学定义, 图的分类, 图模型解决的问题(图的应用), 图的相关算法(仅仅介绍,具体不在此篇展开)。 学习基本路线ÿ…...

《 C++ 修炼全景指南:十四 》大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能!
本篇博客深入探讨了 C 中的两种重要数据结构——BitSet 和 BloomFilter。我们首先介绍了它们的基本概念和使用场景,然后详细分析了它们的实现方法,包括高效接口设计和性能优化策略。接着,我们通过对比这两种数据结构的性能,探讨了…...

相机基础概念
景深: 景深的定义 DOF:depth of filed 是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。光圈、镜头、及焦平面到拍摄物的距离是影响景深的重要因素。定义3:在镜头前方(焦点的前、后)有一…...

【python】追加写入excel
输出文件运行前(有两张表,“表1”和“Sheet1”): 目录 一:写入单表(删除所有旧工作表,写入新表)二:写入多表(删除所有旧工作表,写入新表&#x…...

继承实现单例模式的探索(二)
前言 本篇文章继续探索通过继承实现单例模式的可行方案,这次的方案将采用反射机制隐式创建派生类实例,示例代码为C#。 代码 v1.0 using System.Reflection;/// <summary> /// 单例模式基类 /// </summary> /// <typeparam name"T&…...

设计模式-访问者模式
访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使得在不改变个元素的类的前提下定义作用于这些元素的新操作。...

国创——基于Unity3D和MediaPipe构建虚拟人物驱动系统
以下是一个基于Unity3D和MediaPipe构建虚拟人物驱动系统的基本概念和简化的Python示例代码框架。请注意,这只是一个基础示例,实际应用中可能需要更多的完善和调整。 一、整体概念 1. MediaPipe - MediaPipe是一个用于构建多模态(例如视频、…...

环境可靠性
一、基础知识 1.1 可靠性定义 可靠性是指产品在规定的条件下、在规定的时间内完成规定的功能的能力。 可靠性的三大要素:耐久性、可维修性、设计可靠性 耐久性:指的是产品能够持续使用而不会故障的特性,或者说是产品的使用寿命。 可维修性&a…...

Chromium 设置页面打开系统代理源码分析c++
1、前端页面调用showProxySettings() {chrome.send("showProxySettings")} 2、c 响应代码如下 chrome\browser\ui\webui\settings\system_handler.ccvoid SystemHandler::RegisterMessages() {web_ui()->RegisterMessageCallback("showProxySettings",b…...