perf: 优化自动压缩记忆的表现

This commit is contained in:
2026-05-28 11:15:52 +08:00
parent 5c7182ac3f
commit 8b600f9d6c
2 changed files with 14 additions and 9 deletions

View File

@@ -168,12 +168,10 @@ public class AutoContextInterceptor implements AgentRuntimeInterceptor {
CompressionCheck compressionCheck = compressionCheck(autoContextMemory.getMessages()); CompressionCheck compressionCheck = compressionCheck(autoContextMemory.getMessages());
int beforeEventCount = compressionEventCount(autoContextMemory); int beforeEventCount = compressionEventCount(autoContextMemory);
if (compressionCheck.thresholdReached()) { if (compressionCheck.thresholdReached()) {
emitCompressionStarted(compressionCheck);
boolean compressed = autoContextMemory.compressIfNeeded(); boolean compressed = autoContextMemory.compressIfNeeded();
List<CompressionEvent> newEvents = newCompressionEvents(autoContextMemory, beforeEventCount); List<CompressionEvent> newEvents = newCompressionEvents(autoContextMemory, beforeEventCount);
if (compressed && !newEvents.isEmpty()) { emitCompressionCompleted(compressionCheck, newEvents, compressed && !newEvents.isEmpty());
emitCompressionStarted(compressionCheck);
emitCompressionCompleted(compressionCheck, newEvents);
}
} }
// 压缩完毕后自动进行当前的会话 // 压缩完毕后自动进行当前的会话
event.setInputMessages(buildInputMessages(event, autoContextMemory)); event.setInputMessages(buildInputMessages(event, autoContextMemory));
@@ -281,13 +279,14 @@ public class AutoContextInterceptor implements AgentRuntimeInterceptor {
* @param events 新增压缩事件 * @param events 新增压缩事件
*/ */
private void emitCompressionCompleted(CompressionCheck compressionCheck, private void emitCompressionCompleted(CompressionCheck compressionCheck,
List<CompressionEvent> events) { List<CompressionEvent> events,
boolean compressed) {
AgentRuntimeEvent event = eventBridge.event(AgentRuntimeEventType.MEMORY_COMPRESSION_COMPLETED); AgentRuntimeEvent event = eventBridge.event(AgentRuntimeEventType.MEMORY_COMPRESSION_COMPLETED);
event.getPayload().put("statusKey", STATUS_KEY); event.getPayload().put("statusKey", STATUS_KEY);
event.getPayload().put("phase", "completed"); event.getPayload().put("phase", "completed");
event.getPayload().put("status", "done"); event.getPayload().put("status", "done");
event.getPayload().put("label", "已整理上下文"); event.getPayload().put("label", compressed ? "已整理上下文" : "无需压缩上下文");
event.getPayload().put("compressed", true); event.getPayload().put("compressed", compressed);
event.getPayload().put("eventCount", events == null ? 0 : events.size()); event.getPayload().put("eventCount", events == null ? 0 : events.size());
event.getPayload().put("events", toPayloadEvents(events)); event.getPayload().put("events", toPayloadEvents(events));
putCompressionCheckPayload(event, compressionCheck); putCompressionCheckPayload(event, compressionCheck);

View File

@@ -338,7 +338,7 @@ public class AgentScopeStatefulRuntimeTest {
} }
@Test @Test
public void shouldNotEmitAutoContextCompressionEventsWhenCompressionIsSkipped() { public void shouldEmitNoCompressionCompletedEventWhenCompressionIsSkipped() throws Exception {
AgentInitRequest request = initRequest(); AgentInitRequest request = initRequest();
AgentMemoryCompressionParameter parameter = new AgentMemoryCompressionParameter(); AgentMemoryCompressionParameter parameter = new AgentMemoryCompressionParameter();
parameter.setMsgThreshold(1); parameter.setMsgThreshold(1);
@@ -362,12 +362,18 @@ public class AgentScopeStatefulRuntimeTest {
Sinks.Many<AgentRuntimeEvent> sink = Sinks.many().replay().all(); Sinks.Many<AgentRuntimeEvent> sink = Sinks.many().replay().all();
AutoContextInterceptor interceptor = new AutoContextInterceptor( AutoContextInterceptor interceptor = new AutoContextInterceptor(
AgentRuntimeEventBridge.fixed(executionContext(), sink), memoryResult.getAutoContextConfig()); AgentRuntimeEventBridge.fixed(executionContext(), sink), memoryResult.getAutoContextConfig());
CompletableFuture<List<AgentRuntimeEvent>> eventsFuture = sink.asFlux().take(2).collectList().toFuture();
PreReasoningEvent event = new PreReasoningEvent(agent, "fake-model", null, PreReasoningEvent event = new PreReasoningEvent(agent, "fake-model", null,
List.of(Msg.builder().role(MsgRole.SYSTEM).textContent("system").build())); List.of(Msg.builder().role(MsgRole.SYSTEM).textContent("system").build()));
interceptor.intercept(event).block(); interceptor.intercept(event).block();
List<AgentRuntimeEvent> events = eventsFuture.get(3, TimeUnit.SECONDS);
Assert.assertTrue(sink.asFlux().take(Duration.ofMillis(100)).collectList().block().isEmpty()); Assert.assertEquals(AgentRuntimeEventType.MEMORY_COMPRESSION_STARTED, events.get(0).getEventType());
Assert.assertEquals(AgentRuntimeEventType.MEMORY_COMPRESSION_COMPLETED, events.get(1).getEventType());
Assert.assertEquals(Boolean.FALSE, events.get(1).getPayload().get("compressed"));
Assert.assertEquals("无需压缩上下文", events.get(1).getPayload().get("label"));
Assert.assertEquals(0, ((Number) events.get(1).getPayload().get("eventCount")).intValue());
Assert.assertTrue(event.getInputMessages().get(0).getTextContent().contains("CONTEXT_OFFLOAD")); Assert.assertTrue(event.getInputMessages().get(0).getTextContent().contains("CONTEXT_OFFLOAD"));
} }