1. 多目标优化与AI Agent训练的结合价值
在AI Agent的开发过程中,我们常常面临多个相互冲突的优化目标。比如在游戏AI中需要同时考虑胜率和计算效率,在客服机器人中要平衡回答准确率和响应速度。传统单目标优化方法往往难以应对这种复杂场景,而多目标优化(Multi-Objective Optimization, MOO)技术为此提供了系统性的解决方案。
我最近在一个电商推荐系统Agent项目中深有体会:当同时优化点击率、转化率和用户停留时长时,单目标优化会导致指标严重失衡。通过引入多目标优化框架,最终实现了各项指标的均衡提升。下面分享一些实战经验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 多目标优化核心技术解析
2.1 常用算法对比选型
在实际项目中,我们主要对比了以下几种算法:
| 算法类型 | 代表算法 | 适用场景 | 计算成本 | 解集质量 |
|---|---|---|---|---|
| 基于权重 | Weighted Sum | 目标维度<3 | 低 | 一般 |
| 进化算法 | NSGA-II | 复杂非凸问题 | 中高 | 优 |
| 分解方法 | MOEA/D | 大规模问题 | 中 | 良 |
| 元启发式 | SPEA2 | 高维目标 | 高 | 优 |
经过benchmark测试,我们最终选择NSGA-II作为基础框架,主要考虑:
- 目标间存在非线性关系
- 需要获得Pareto前沿的完整视图
- 计算资源相对充足
2.2 目标函数设计要点
设计良好的目标函数是多目标优化的关键。在我们的推荐Agent项目中,定义了三个核心目标:
- 点击率预测准确度:
python复制
1. 概述
本文分享 Protocol 层。在 dubbo-rpc-api 模块,com.alibaba.dubbo.rpc.protocol 包下实现,如下图所示:

老艿艿:本文对应 《Dubbo 开发指南 —— 协议扩展》 文档。
2. Protocol
com.alibaba.dubbo.rpc.Protocol ,协议接口。代码如下:
Java复制@SPI("dubbo")
public interface Protocol {
/**
* 获取默认端口
*
* @return 默认端口
*/
int getDefaultPort();
/**
* 暴露远程服务:<br>
* 1. 协议在接收请求时,应记录请求来源方地址信息:RpcContext.getContext().setRemoteAddress();<br>
* 2. export() 必须是幂等的,也就是暴露同一个 URL 的 Invoker 两次,和暴露一次没有区别。<br>
* 3. export() 传入的 Invoker 由框架实现并传入,协议不需要关心。<br>
*
* @param <T> 服务的类型
* @param invoker 服务的执行体
* @return exporter 暴露服务的引用,用于取消暴露
* @throws RpcException 当暴露服务出错时抛出,比如端口已占用
*/
@Adaptive
<T> Exporter<T> export(Invoker<T> invoker) throws RpcException;
/**
* 引用远程服务:<br>
* 1. 当用户调用 refer() 所返回的 Invoker 对象的 invoke() 方法时,协议需相应执行同 URL 远端 export() 传入的 Invoker 对象的 invoke() 方法。<br>
* 2. refer() 返回的 Invoker 由协议实现,协议通常需要在此 Invoker 中发送远程请求。<br>
* 3. 当 url 中有设置 check=false 时,连接失败不能抛出异常,并内部自动恢复。<br>
*
* @param <T> 服务的类型
* @param type 服务的类型
* @param url 远程服务的URL地址
* @return invoker 服务的本地代理
* @throws RpcException 当连接服务提供方失败时抛出
*/
@Adaptive
<T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;
/**
* 释放协议:<br>
* 1. 取消该协议所有已经暴露和引用的服务。<br>
* 2. 释放协议所占用的所有资源,比如连接和端口。<br>
* 3. 协议在释放后,依然能暴露和引用新的服务。<br>
*/
void destroy();
}
@SPI("dubbo")注解,Dubbo SPI 拓展点,默认为"dubbo"协议。@Adaptive注解,基于 Dubbo SPI Adaptive 机制,加载对应的 Protocol 实现,使用URL.protocol属性。#getDefaultPort()方法,获得协议的默认端口。#export(invoker)方法,暴露远程服务。- 幂等,任意暴露同一个服务,等价于暴露一次。例如:暴露同一个服务到多个注册中心。
- 在暴露服务完成后,会调用
ProtocolListener#export(Invoker)方法,触发监听器的#export(invoker)方法。
#refer(type, url)方法,引用远程服务,创建 Invoker 对象。- 在引用服务完成后,会调用
ProtocolListener#refer(type, url)方法,触发监听器的#refer(type, url)方法。
- 在引用服务完成后,会调用
#destroy()方法,释放协议。- 例如:在 JVM 关闭时,调用每个协议的
#destroy()方法,释放每个协议的资源。
- 例如:在 JVM 关闭时,调用每个协议的
2.1 AbstractProtocol
com.alibaba.dubbo.rpc.protocol.AbstractProtocol ,实现 Protocol 接口,协议抽象类。代码如下:
Java复制public abstract class AbstractProtocol implements Protocol {
/**
* Exporter 集合
*
* key: 服务键 {@link #serviceKey(URL)} 或 {@link URL#getServiceKey()} 。
* 不同协议会不同
*/
protected final Map<String, Exporter<?>> exporterMap = new ConcurrentHashMap<String, Exporter<?>>();
/**
* Invoker 集合
*/
//TODO SOFEREFENCE
protected final Set<Invoker<?>> invokers = new ConcurrentHashSet<Invoker<?>>();
protected static String serviceKey(URL url) {
return serviceKey(url.getPort(), url.getPath(), url.getParameter(Constants.VERSION_KEY), url.getParameter(Constants.GROUP_KEY));
}
protected static String serviceKey(int port, String serviceName, String serviceVersion, String serviceGroup) {
return ProtocolUtils.serviceKey(port, serviceName, serviceVersion, serviceGroup);
}
@Override
public void destroy() {
// 循环销毁 Exporter
for (Exporter<?> exporter : exporterMap.values()) {
exporter.unexport();
}
exporterMap.clear();
// 循环销毁 Invoker
for (Invoker<?> invoker : invokers) {
if (invoker != null) {
invokers.remove(invoker);
invoker.destroy();
}
}
invokers.clear();
}
}
exporterMap属性,Exporter 集合。其中 Key 为 服务键,不同协议会不同,例如:- Dubbo Protocol 的 Service Key 是
URL#getServiceKey()。 - Injvm Protocol 的 Service Key 是
URL#getPath()。
- Dubbo Protocol 的 Service Key 是
invokers属性,Invoker 集合。#destroy()方法,循环exporterMap和invokers,分别调用Exporter#unexport()和Invoker#destroy()方法,进行销毁。
3. Invoker
在 Protocol 中,每次暴露远程服务时,会创建一个 Exporter 对象。而每个 Exporter 对象,会包含一个 Invoker 对象。通过 Invoker 对象,可以执行调用服务。流程如下图:

3.1 AbstractExporter
com.alibaba.dubbo.rpc.protocol.AbstractExporter ,实现 Exporter 接口,Exporter 抽象类。代码如下:
Java复制public abstract class AbstractExporter<T> implements Exporter<T> {
/**
* Invoker 对象
*/
protected final Invoker<T> invoker;
/**
* 是否取消暴露服务
*/
private volatile boolean unexported = false;
public AbstractExporter(Invoker<T> invoker) {
if (invoker == null)
throw new IllegalStateException("service invoker == null");
if (invoker.getInterface() == null)
throw new IllegalStateException("service type == null");
if (invoker.getUrl() == null)
throw new IllegalSt
