diff --git a/ruoyi-common/ruoyi-common-trace/src/main/java/org/ruoyi/common/trace/core/DefaultTraceStreamSpan.java b/ruoyi-common/ruoyi-common-trace/src/main/java/org/ruoyi/common/trace/core/DefaultTraceStreamSpan.java index a9bb9d64..a73d18a0 100644 --- a/ruoyi-common/ruoyi-common-trace/src/main/java/org/ruoyi/common/trace/core/DefaultTraceStreamSpan.java +++ b/ruoyi-common/ruoyi-common-trace/src/main/java/org/ruoyi/common/trace/core/DefaultTraceStreamSpan.java @@ -43,26 +43,26 @@ public class DefaultTraceStreamSpan implements TraceStreamSpan { } @Override - public void finishSuccess() { - finish(TraceConstants.STATUS_SUCCESS, null); + public void finishSuccess(String outputPayload) { + finish(TraceConstants.STATUS_SUCCESS, null, outputPayload); } @Override public void finishError(Throwable throwable) { - finish(TraceConstants.STATUS_ERROR, TracePayloadUtils.error(throwable, traceProperties)); + finish(TraceConstants.STATUS_ERROR, TracePayloadUtils.error(throwable, traceProperties), null); } @Override public void finishCancelledIfRunning() { - finish(TraceConstants.STATUS_CANCELLED, null); + finish(TraceConstants.STATUS_CANCELLED, null, null); } - private void finish(String status, String errorMessage) { + private void finish(String status, String errorMessage, String outputPayload) { if (!finished.compareAndSet(false, true)) { return; } try { - traceRecordService.finishNode(traceId, nodeId, status, errorMessage, null, + traceRecordService.finishNode(traceId, nodeId, status, errorMessage, outputPayload, new Date(), System.currentTimeMillis() - startMillis); } catch (Exception e) { log.warn("结束 trace stream span 失败,traceId={}, nodeId={}", traceId, nodeId, e); diff --git a/ruoyi-common/ruoyi-common-trace/src/main/java/org/ruoyi/common/trace/core/TraceStreamSpan.java b/ruoyi-common/ruoyi-common-trace/src/main/java/org/ruoyi/common/trace/core/TraceStreamSpan.java index 349238d5..0a82eabc 100644 --- a/ruoyi-common/ruoyi-common-trace/src/main/java/org/ruoyi/common/trace/core/TraceStreamSpan.java +++ b/ruoyi-common/ruoyi-common-trace/src/main/java/org/ruoyi/common/trace/core/TraceStreamSpan.java @@ -7,7 +7,14 @@ public interface TraceStreamSpan { void detach(); - void finishSuccess(); + /** + * 结束成功的流式节点,并可写入输出摘要。 + */ + default void finishSuccess() { + finishSuccess(null); + } + + void finishSuccess(String outputPayload); void finishError(Throwable throwable); diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/chat/impl/ChatServiceFacade.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/chat/impl/ChatServiceFacade.java index 678006f1..2f04c806 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/chat/impl/ChatServiceFacade.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/chat/impl/ChatServiceFacade.java @@ -337,7 +337,8 @@ public class ChatServiceFacade implements IChatService { result, RoleType.ASSISTANT.getName(), chatRequest.getModel()); } if (llmSpan != null) { - llmSpan.finishSuccess(); + llmSpan.finishSuccess(RagTracePayloadBuilder.streamOutputSummary( + result == null ? 0 : result.length())); } finishTraceRun(traceRun, TraceConstants.STATUS_SUCCESS, null); } catch (Exception e) { diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/retrieval/impl/KnowledgeRetrievalServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/retrieval/impl/KnowledgeRetrievalServiceImpl.java index 938fdced..5d3cb5e6 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/retrieval/impl/KnowledgeRetrievalServiceImpl.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/retrieval/impl/KnowledgeRetrievalServiceImpl.java @@ -76,6 +76,8 @@ public class KnowledgeRetrievalServiceImpl implements KnowledgeRetrievalService } log.info("开始知识库检索, kid={}, query={}", queryVectorBo.getKid(), queryVectorBo.getQuery()); + String retrievalInputPayload = traceActive() + ? RagTracePayloadBuilder.retrievalInputSummary(queryVectorBo) : null; List finalResults = TraceNodeTemplate.withNode(traceRecordService, traceProperties, "retrieval", RagTraceNodeTypes.NODE_RETRIEVAL, KnowledgeRetrievalServiceImpl.class.getName(), "retrieve", @@ -206,8 +208,10 @@ public class KnowledgeRetrievalServiceImpl implements KnowledgeRetrievalService */ private List performRerank(QueryVectorBo queryVectorBo, List coarseResults) { int topN = queryVectorBo.getRerankTopN() != null ? queryVectorBo.getRerankTopN() : queryVectorBo.getMaxResults(); + String rerankInputPayload = traceActive() + ? RagTracePayloadBuilder.rerankInputSummary(queryVectorBo, coarseResults.size(), topN) : null; TraceNodeHandle traceNode = startTraceNode("rerank", RagTraceNodeTypes.NODE_RERANK, "performRerank", - RagTracePayloadBuilder.rerankInputSummary(queryVectorBo, coarseResults.size(), topN)); + rerankInputPayload); try { RerankModelService rerankModel = rerankModelFactory.createModel(queryVectorBo.getRerankModelName()); @@ -324,6 +328,10 @@ public class KnowledgeRetrievalServiceImpl implements KnowledgeRetrievalService } } + private boolean traceActive() { + return traceProperties.isEnabled() && StringUtils.isNotBlank(TraceContext.getTraceId()); + } + private void finishTraceNode(TraceNodeHandle traceNode, String status, Throwable error, String outputPayload) { if (traceNode == null || !traceNode.finished.compareAndSet(false, true)) { return;