perf: 优化自动压缩记忆的表现
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user