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

AI Agent实战:打造京东广告主的超级助手 | 京东零售技术实践

前言

自2022年末ChatGPT的问世,大语言模型(LLM)技术引发全球关注。在大模型技术落地的最佳实践中,智能体(Agent)架构显现出巨大潜力,成为业界的普遍共识,各大公司也纷纷启动Agent技术验证项目。

基于此背景,我们在23年下半年对Agent的应用进行了一些探索,并打造了京东广告投放Agent应用—京准通智能助手。过去一年,京准通智能助手历经多个版本迭代,已经具备智能客服、数据查询、广告创编等AI能力,逐渐成为广告主的超级助手。这背后,依托于我们构建的AI工程化技术体系。本文将详细介绍京准通智能助手的构建过程,并系统化阐述AI工程能力建设中的关键技术实践与创新方法论。

一、Agent 在京东广告投放中的落地

1、Agent 在京东广告投放中的应用场景

经过前期我们对Agent应用方向的探索和尝试,确定了Agent在京东广告投放中落地的两个主要的场景:

1.1 服务提效

1.2 盯盘提效

2、Agent 工程能力实现

在明确具体应用场景的基础上,依托前期技术积累与探索成果,工程实现层面需重点构建RAG和Function Call两大核心技术能力,为智能客服与智能指令场景的应用提供技术支撑。下面将深入阐述这两大核心能力的实现方案。

2.1 RAG能力的演变

RAG能力在实际应用中,经历过多次升级迭代,主要分为两个版本:RAG1.0、RAG2.0

RAG1.0

RAG1.0版本中完成了基础能力的建设,包含两部分:离线知识构建、在线推理引擎。

离线知识构建

离线知识构建的核心工作是将知识转化为向量并存储。主要有以下几个步骤:

1.产品/运营将相关业务的知识整理成文档(Markdown、Excel等)

2.根据不同格式和切割方式将内容切割成若干个内容块

3.调用embedding model,进行内容向量化

4.将向量存储至京东Vearch向量库

在线推理引擎

在线推理引擎提供实时在线服务,核心工作是检索相关知识并调用大模型解决问题。主要有以下几个步骤:

1.收到用户Query,调用embedding 模型,进行向量化,获得向量。

2.根据Query的向量,在向量库中进行相关性检索,获得和Query相关的知识

[{"_score": 0.7526149153709412,//相关性分值"_source": {"title": "搜索快车-定向设置-关键词定向-功能入口","content": " 搜索快车->新增/编辑快车推广单元->添加关键词...", "status": 1, //更多字段...}, 
},
//更多知识...
]

3.拼接提示词,要让模型更方便理解,需要将知识处理成特定的格式

//这里不方便展示业务真实的提示词,以下仅提供大致思路请根据信息
"""
搜索快车-搜索快车投放要素-定向设置-关键词定向-功能入口
- 搜索快车->新增/编辑快车推广单元->添加关键词;
//更多知识...
"""回答问题
"""
搜索快车关键词设置
"""

4.调用大模型接口,传入拼接好的提示词,获取结果返回给用户。

{"output": "在搜索快车中进行关键词设置的步骤如下:\n\n1. **添加关键词**:\n   - 进入搜索..."}

RAG2.0

向量召回时,通常要设置最低相关分值和最大召回数量,来调控召回内容的质量和数量,以追求更好效果。然而,在RAG1.0版本的实际应用中依然遇到了无法召回和召回质量的问题,在解决问题过程中,逐步建设了向量多路召回、ES检索、重排序等能力,形成了RAG2.0版本。

向量多路召回:

场景:部分有用的内容,相关度不够,无法召回。

剖析:向量召回的分数与相关内容密度强相关,理论上密度越高,相关分值越高。同理,文档内容越短时相关内容密度也就越高。

方案:知识构建向量时,将同一块知识,按照【概述+内容】分别存两份向量,其中概述内容较短,也就意味着密度较高,更容易获得高相关性。在召回时,按照概述和内容两路分别召回再去重的方式,提升召回率。

ES检索

场景:在对用户问题分析中,发现有一部分广告主提出一些【智能计划】相关的问题(对于搜索快车或推荐广告的智能出价的计划的习惯性简称),由于广告投放产品中有一个叫做智能投放的产品,在知识召回的时候大部分召回了智能投放相关的知识,导致无法正确回答此类问题。

方案:新增一路ES检索,通过自定义分词器中的同义词、专用词、禁用词的方式,来实现部分内容的召回。比如,同义词设置:智能计划 => 智能出价计划(解决用户习惯的问题)、 购物触点 => 推荐广告 京挑客 => 京东联盟 (解决产品线升级改名的问题)..

重排序

场景:通过以上手段,有效提升了知识召回率,但是引发了另一个问题,召回的部分知识不相关,会误导模型,影响模型作答效果。

方案:引入ReRank模型,在知识召回后,调用算法侧部署的ReRank服务,对知识进行重排序,过滤无关知识。

经过技术迭代,RAG2.0的能力已经演变为上图。

2.2 Function Call 能力的构建

Function Call的能力主要是为了服务智能指令,比如:提供一个计划数据查询的工具,当用户发送【查询今天ROI > 10 的计划】,模型会返回Function Call标识,包括function name 及 arguments,调用成功后,用对应的组件渲染出来报表。

同样包含两部分,分别是:工具能力注册、在线推理引擎。

工具能力注册

该模块主要工作是将工具的信息管理起来,主要包含三部分信息,分别是:

1.模型感知的信息:主要作用是给模型做推理,名称、参数、描述,为了让模型推理更准确,描述的内容我们做了拆分,由基本描述、扩展描述、示例指令几部分组成,下面是一个工具给模型的信息示例:

{"type": "function", "function": {"name": "query_xxxx_data" //名称"description": "根据ROI、时间....查询广告计划数据" + //基本描述"这是一个查询计划数据的工具,可以根据..." + //扩展描述"示例指令:\n- 查询今天ROI > 10的计划数据\n -查询上周..." //示例指令"parameters": { //参数"type":"object","properties":{"startTime":{"type":"string","description":"开始时间,格式yyyy-mm-dd"},"endTime":{"type":"string","description":"结束时间,格式yyyy-mm-dd"},"roi":{"type":"string","description":"ROI(投产比)查询条件,如:“ge|3”代表大于等于3。gt-大于,lt-小于,eq-等于,ge-大于等于,le-小于等于"},//...}}}
}

2.后端感知的信息:正常情况下,工具的执行其实是调用了后端的接口,那么就需要接口地址、接口入参、接口出参、成功条件等信息。其中接口的入参和模型感知信息中的参数是同一份数据。

{"url": "http://xxx.jd.local/xxx", //接口地址"success":{//成功条件"condition":{"from":"code","operator":1,"target":1},"data":"data"},"params":[//出参{"key":"code","type":"integer","description":"code码"},{"key":"msg","type":"string","description":"错误信息"},{"key":"data","type":"string","description":"返回给前端数据"}],"error":{"msgType":1,"msgKey":"msg","msgContent":""}
}

3.前端感知的信息:工具调用成功后,通常有多种处理方式:1.把结果直接返回给用户。2.把结果给到模型,模型继续做推理,同时可以再定义Prompt。3.将结果使用组件渲染给用户。

我们为广告主提供的工具大部分都要用组件进行渲染,比如数据报表。当工具需要和组件结合的时候,需要考虑组件的配置化和复用率,这里我们打通了既有的低代码平台,会将组件的信息保存下来。

{
"pageData":[{"name":"数据表格","componentName":"jad_ReportTable","jsUrl":"jadfe/xxx/ReportTable.6a3493f4.js", //组件CDN地址"options":[//组件配置{"key":"columns","type":"list","name":"列设置","options":[{"key":"title","name":"列名称","type":"input"},{"key":"key","name":"字段key","type":"input"},{"key":"width","name":"宽度","type":"inputNumber"},{"key":"sort","name":"排序","type":"switch"}],"value":[{"title":"计划名称","key":"campaignName","width":110},{"title":"产品线","key":"businessTypeStr","width":110},{"title":"时间","key":"date","sort":false},{"title":"展现数","key":"impressions","sort":true}],}],
}

在线推理引擎

提供实时在线服务,核心作用是组装工具信息调用大模型进行推理。以下是主要步骤:

1.收到用户Query,从数据库读取工具信息

2.将工具组装成模型需要的格式,组装Prompt,调用模型

3.如果模型返回Function Call标识,通过标识中的 function name 找出对应的工具,调用该工具的接口

4.根据结果的展示行为,有以下几种处理方式:

5.前端将返回的内容展示给用户,如需要组件,动态加载组件的CDN地址,完成渲染。

2.3 工程能力全貌

经过各种能力的建设后,工程能力的全貌演变为下图。其中与模型交互的核心能力采用了Langchain框架。

3、京准通智能助手能力展示

基于以上构建的工程化能力,支撑了京准通智能助手的落地,目前已包含:问题解答、数据查询、物料创建、物料编辑等能力。

体验地址:https://jzt.jd.com(需要商家账号)

在支撑京准通智能助手落地中,除了以上一些核心能力的构建,也有很多细节的优化,比如:

指令中日期的准确性优化

二、基于业务沉淀Agent搭建平台

以上就是京准通智能助手业务从0到1的过程,可见一个大模型应用真正应用到生产环境中,是比较复杂且有非常大的工作量的,我们在思考,如果广告内有其他的业务场景,是否能实现一些能力的快速复用?

与此同时,随着业务效果的优化进入深水区,我们需要通过对工作流程更精细化的编排来进行效果的优化。

综合以上考虑,我们决定在工作流能力构建的同时,将已有的能力增强并沉淀一个Agent搭建平台,来提升工程复用率和应用搭建效率。以下是整体架构:

基建:主要是公司的基建,提供一些基础能力,如:向量库、ES、OSS、Mysql、CDN等等

Agent设计器:主要是提供Agent可视化的设计能力,包括智能体、知识库、工具库、记忆库、工作流等核心功能。

Agent引擎:主要是根据设计器产生的配置,动态运行工作流程,如:知识的召回、提示词的加工、模型的推理、工具的调用、代码的执行等等。

端能力:主要是面向用户的对话式组件,这里我们沉淀了一套AI组件库,可快速组装出兼容PC、H5的对话框。与此同时,针对内部的京ME办公场景,对外如微信中的场景,我们也通过API调用的方式进行了支持。

应用场景:有这些能力,就可以轻松的利用平台支撑起各种Agent应用,包括我们的京准通智能助手。同时除了业务之外,还可以做内部提效的Agent应用。

下面我们将主要介绍一下Agent设计器和Agent引擎的实现。

1、Agent设计器

团队空间为了方便协作和做业务隔离,团队空间下,可以进行智能体的搭建、知识库的管理、工具库的管理、工作流的编排等等。

知识库中,可以选择不同的向量模型,方便做召回优化的实验。

工具库中,可以设置每个工具的模型感知信息、接口、参数、渲染组件等。

工作流中,可以随意拖拽编排工作流程,比如:召回节点可以设置召回策略、召回数量、最低分值等;大模型节点可以设置System、User提示词、历史会话轮数等。

2、Agent引擎

Agent引擎负责和模型交互,是影响效果和性能的核心模块。我们做了重点的设计和重构。在设计阶段,我们考虑的首要问题是:Langchain的取舍

Langchain框架提出了LCEL语法,将Prompt、LLM、Tool等概念进行了抽象并高度封装,能快速上手并实现一些Demo,对新手比较友好。

然而,随着业务的复杂度不断增加,以及对模型的了解不断深入,会发现,Langchain的过度封装,把很多简单的事情变的更复杂了,明显影响了业务自由度及开发效率,同时也带来了一定的性能损耗。

举个例子:工具调用中,模型接受的参数是一个JSON Schema,我们只要将工具参数存成一个json用的时候就会非常方便。

然而,如果使用Langchain,就需要先将json转成一个pydantic类,再使用Tool类进行工具的注册,在调用模型时,Langchain又会转换成json。

本来一行代码就可以搞定,使用Langchain后需要几十行代码才能实现,并且降低了性能。

最终,我们决定移除Langchain框架,直接用原生python实现,仅保留个别用起来比较方便的工具,如:文档切割。

整体上,设计了一套工作流调度器,并将所有节点实现了组件化。收到请求后会初始化一个工作流调度器,调度器根据时机来操作每个节点的执行。

截止目前,Agent平台已经为包括智能助手在内的多个Agent应用进行了赋能。其中,在京准通智能助手的效果调优中,基于工作流编排的能力,快速进行了各种策略的迭代,大幅提升了迭代效率。

京准通智能助手工作流示意图

三、总结

以上是我们京东广告在Agent应用上的一些工程化实践,通过构建RAG、Function Call等核心能力,为京准通智能助手业务提供AI 超能力,并为广大商家赋能。

下一步,我们还将推动多Agent架构升级,为更多专业的Agent能力接入铺平道路,促进智能助手能力的持续提升,为商家提供更智能化的产品。总之,道阻且长,行则将至!

相关文章:

AI Agent实战:打造京东广告主的超级助手 | 京东零售技术实践

前言 自2022年末ChatGPT的问世,大语言模型(LLM)技术引发全球关注。在大模型技术落地的最佳实践中,智能体(Agent)架构显现出巨大潜力,成为业界的普遍共识,各大公司也纷纷启动Agent技…...

50周学习go语言:第1周 环境搭建

以下是为零基础学习者准备的详细第1周教程,包含环境搭建、工具配置和首个Go程序的完整操作指南: 一、Go语言环境安装(Windows/macOS/Linux通用) 1. 下载安装包 官网地址:https://go.dev/dl//根据系统选择对应版本&am…...

4. MySQL 逻辑架构说明

4. MySQL 逻辑架构说明 文章目录 4. MySQL 逻辑架构说明1. 逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors(连接器)1.3 第1层:连接层1.4 第2层:服务层1.5 第3层:引擎层1.6 存储层 2. SQL执行流程2.1 MySQL 中的 SQL 执行流程 2.2 MySQL…...

《AI与NLP:开启元宇宙社交互动新纪元》

在科技飞速发展的当下,元宇宙正从概念逐步走向现实,成为人们关注的焦点。而在元宇宙诸多令人瞩目的特性中,社交互动体验是其核心魅力之一。人工智能(AI)与自然语言处理(NLP)技术的迅猛发展&…...

面对STM32的庞大体系,如何避免迷失在细节中?

我第一次接触STM32时,我以为抱着开发板就是拥抱未来,实际上一开机就喜提四大耳光,看到卖家演示的MP3播放、TFT彩屏、网口通信好炫酷,忍不住买回来掌握这些神技,到最后发现最实用的还是开发板的关机键和复位键。 看视频…...

ragflow-RAPTOR到底是什么?请通俗的解释!

RAPTOR有两种不同的含义,具体取决于上下文: RAPTOR作为一种信息检索技术 RAPTOR是一种基于树状结构的信息检索系统,全称为“Recursive Abstractive Processing for Tree-Organized Retrieval”(递归抽象处理树组织检索&#xff09…...

Linux系统移植之Uboot启动流程

Linux系统移植之Uboot启动流程 一,Uboot启动流程1.Uboot的两阶段1.1.第一阶段1.11.硬件初始化1.12.复制 U-Boot 到 RAM1.13.跳转到第二阶段 1.2.第二阶段1.21.C 语言环境初始化1.22. 硬件设备初始化1.23. 加载环境变量1.24. 显示启动信息1.25. 等待用户输入&#xf…...

【Open X-Embodiment】简单数据下载与预处理

文章目录 1. RLDS Dataset2. 处理成numpy格式3. 存储桶 1. RLDS Dataset 从 Octo 里面找到数据下载的代码 rlds_dataset_mod github 按照官网代码配置环境后,修改 prepare_open_x.sh,相当于只用 gsutil 下载数据: DOWNLOAD_DIR/mnt/data…...

【第四节】C++设计模式(创建型模式)-Builder(建造者)模式

目录 引言 一、Builder 模式概述 二、Builder 模式举例 三、Builder 模式的结构 四、Builder 模式的实现 五、Builder 模式的优缺点 六、总结 引言 Builder 模式是一种创建型设计模式,旨在将复杂对象的构建过程与其表示分离。通过一步步构建对象,…...

排查JVM的一些命令

查看JVM相关信息的方法 环境&#xff1a; Win10, jdk17 查看端口的Pid netstat -ano | findstr <端口号>列出当前运行的JVM进程 ## 用于输出JVM中运行的进程状态信息。通过jps&#xff0c;可以快速获取Java进程的PID&#xff08;进程标识符&#xff09;&#xff0c; …...

uni-app(位置1)

文章目录 一、获取当前的地理位置、速度 uni.getLocation(OBJECT)二、打开地图选择位置 uni.chooseLocation(OBJECT)三、使用应用内置地图查看位置。uni.openLocation(OBJECT) 一、获取当前的地理位置、速度 uni.getLocation(OBJECT) App平台 manifest中配置好自己的地图厂商k…...

某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg 最近在学习中发现一个Chomper框架&#xff0c;Chomper 是一个模拟执行iOS可执行文件的框架&#xff0c;类似于安卓端大名鼎鼎的Unidbg。 这篇文章使用Chomper模拟执行某手的sig3算法&#xff0c;初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的…...

登录-05.JWT令牌-介绍

一.JWT令牌 JWT令牌是一种简洁的、自包含的格式&#xff0c;用于在通讯双方之间以json数据格式安全的传输数据。说白了&#xff0c;JWT令牌就是将json格式的数据进行封装&#xff0c;从而实现安全传输。 所谓简洁&#xff0c;就是指JWT令牌就是一个简单的字符串。 所谓自包含…...

Mac下Python版本管理,适用于pyenv不起作用的情况

前言 声明&#xff1a;之前也在网上看到过可以使用pyenv来管理python版本&#xff0c;但由于作者的python安装路径实在是繁杂不堪&#xff0c;因此安装完成pyenv体验下来没有任何用处&#xff0c;但偶然发现vscode似乎可以看到各个python版本&#xff0c;因此写下这篇博客记录…...

Ubuntu 服务器Llama Factory 搭建DeepSeek-R1微调训练环境

1.首先了解一下什么是LLM微调 LLM 微调指的是在已经预训练好的大型语言模型基础上&#xff0c;使用特定的任务数据或领域数据&#xff0c;通过进一步的训练来调整模型的参数&#xff0c;使其在特定任务或领域上能够表现得更好。简单来说&#xff0c;就是对一个已经具备了丰富语…...

【redis】redis内存管理,过期策略与淘汰策略

一&#xff1a;Redis 的过期删除策略及处理流程如下&#xff1a; 1. 过期删除策略 Redis 通过以下两种策略删除过期键&#xff1a; 1.1 惰性删除 触发时机&#xff1a;当客户端访问某个键时&#xff0c;Redis 会检查该键是否过期。执行流程&#xff1a; 客户端请求访问键。…...

RabbitMQ学习—day6—死信队列与延迟队列

目录 死信队列 1. 死信的概念 2. 死信的来源 实战演练 1. 消息TTL过期 2. 队列达到最大长度 3. 消息被拒绝 延迟队列 概念 使用场景 TTL的两种设置 死信队列 1. 死信的概念 1.1 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的…...

seacmsv9联合注入数据以及绕过 ORDERBY

seacmsv9联合注入数据 php源码 <?php session_start(); require_once("../../include/common.php"); $id (isset($gid) && is_numeric($gid)) ? $gid : 0; $page (isset($page) && is_numeric($page)) ? $page : 1; $type (isset($type) …...

day58 第十一章:图论part08

拓扑排序精讲 关键&#xff1a; 先找到入度为0的节点&#xff0c;把这些节点加入队列/结果&#xff0c;然后依次循环再找。 #include <iostream> #include <vector> #include <queue> #include <unordered_map> using namespace std; int main() {int …...

网络安全-openssl工具

OpenSSl是一个开源项目&#xff0c;包括密码库和SSL/TLS工具集。它已是在安全领域的事实标准&#xff0c;并且拥有比较长的历史&#xff0c;现在几乎所有的服务器软件和很多客户端都在使用openssl&#xff0c;其中基于命令行的工具是进行加密、证书管理以及测试最常用到的软件。…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...