Я пытаюсь регистрировать разговоры Spring AI в формате JSON, аналогично тому, как это делает SimpleLoggerAdvisor. Однако когда я установил точку останова в этом методе с помощью IntelliJ IDEA, я заметил, что интерфейс все еще получает выходные данные. Это заставляет меня подозревать, что ответ, отправляемый во внешний интерфейс, и код, в котором я установил точку останова, выполняются в разных потоках, особенно с учетом того, что я агрегировал потоковый ответ.
@Override
public Flux adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain streamAdvisorChain) {
String conversationId = getConversationId(chatClientRequest.context(), ChatMemory.DEFAULT_CONVERSATION_ID);
String prompt = chatClientRequest.prompt().getContents();
Instant start = Instant.now();
logger.atInfo()
.addKeyValue("event", "ai_stream_session")
.addKeyValue("conversationId", conversationId)
.addKeyValue("prompt", prompt)
.log("AI stream request logged");
Flux chatClientResponses = streamAdvisorChain
.nextStream(chatClientRequest)
;
return new ChatClientMessageAggregator()
.aggregateChatClientResponse(chatClientResponses, resp -> logResponse(conversationId, resp, start));
}
private void logResponse(String conversationId, ChatClientResponse response, Instant startTime) {
try {
ChatResponse chatResponse = response.chatResponse();
String responseText = chatResponse.getResult().getOutput().getText();
Instant endTime = Instant.now();
long durationMs = Duration.between(startTime, endTime).toMillis();
LoggingEventBuilder logBuilder = logger.atInfo()
.addKeyValue("response", responseText)
.addKeyValue("durationMs", durationMs);
if (chatResponse != null && chatResponse.getMetadata() != null) {
ChatResponseMetadata meta = chatResponse.getMetadata();
Usage usage = meta.getUsage();
logBuilder
.addKeyValue("model", meta.getModel())
.addKeyValue("promptTokens", usage != null ? usage.getPromptTokens() : 0)
.addKeyValue("completionTokens", usage != null ? usage.getCompletionTokens() : 0)
.addKeyValue("totalTokens", usage != null ? usage.getTotalTokens() : 0);
}
logBuilder.log("AI response logged");
} catch (Exception e) {
logger.atError()
.addKeyValue("conversationId", conversationId)
.addKeyValue("error", e.getMessage())
.setCause(e)
.log("Failed to log AI response");
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... tual-conte
Регистрация потоковых ответов от Spring AI не фиксирует фактический контент. ⇐ JAVA
Программисты JAVA общаются здесь
1762841650
Anonymous
Я пытаюсь регистрировать разговоры Spring AI в формате JSON, аналогично тому, как это делает SimpleLoggerAdvisor. Однако когда я установил точку останова в этом методе с помощью IntelliJ IDEA, я заметил, что интерфейс все еще получает выходные данные. Это заставляет меня подозревать, что ответ, отправляемый во внешний интерфейс, и код, в котором я установил точку останова, выполняются в разных потоках, особенно с учетом того, что я агрегировал потоковый ответ.
@Override
public Flux adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain streamAdvisorChain) {
String conversationId = getConversationId(chatClientRequest.context(), ChatMemory.DEFAULT_CONVERSATION_ID);
String prompt = chatClientRequest.prompt().getContents();
Instant start = Instant.now();
logger.atInfo()
.addKeyValue("event", "ai_stream_session")
.addKeyValue("conversationId", conversationId)
.addKeyValue("prompt", prompt)
.log("AI stream request logged");
Flux chatClientResponses = streamAdvisorChain
.nextStream(chatClientRequest)
;
return new ChatClientMessageAggregator()
.aggregateChatClientResponse(chatClientResponses, resp -> logResponse(conversationId, resp, start));
}
private void logResponse(String conversationId, ChatClientResponse response, Instant startTime) {
try {
ChatResponse chatResponse = response.chatResponse();
String responseText = chatResponse.getResult().getOutput().getText();
Instant endTime = Instant.now();
long durationMs = Duration.between(startTime, endTime).toMillis();
LoggingEventBuilder logBuilder = logger.atInfo()
.addKeyValue("response", responseText)
.addKeyValue("durationMs", durationMs);
if (chatResponse != null && chatResponse.getMetadata() != null) {
ChatResponseMetadata meta = chatResponse.getMetadata();
Usage usage = meta.getUsage();
logBuilder
.addKeyValue("model", meta.getModel())
.addKeyValue("promptTokens", usage != null ? usage.getPromptTokens() : 0)
.addKeyValue("completionTokens", usage != null ? usage.getCompletionTokens() : 0)
.addKeyValue("totalTokens", usage != null ? usage.getTotalTokens() : 0);
}
logBuilder.log("AI response logged");
} catch (Exception e) {
logger.atError()
.addKeyValue("conversationId", conversationId)
.addKeyValue("error", e.getMessage())
.setCause(e)
.log("Failed to log AI response");
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79816288/logging-the-streaming-responses-from-spring-ai-does-not-capture-the-actual-conte[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия