feat: integrate smart context in AI response generation
- Add import for getSmartContext from conversation-storage service - Modify generateAIResponse to use smart context (recent 20 + keyword-related 10 messages) - Keep existing getAllSummaries for archived profile system - Use smart context (max 30 messages) when available, fallback to legacy buffer (10 messages) - Maintain backward compatibility with existing conversation system Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import { Env, BufferedMessage, Summary, ConversationContext, WorkersAITextGenerationOutput, WorkersAITextGenerationInput } from './types';
|
import { Env, BufferedMessage, Summary, ConversationContext, WorkersAITextGenerationOutput, WorkersAITextGenerationInput } from './types';
|
||||||
import { createLogger } from './utils/logger';
|
import { createLogger } from './utils/logger';
|
||||||
|
import { getSmartContext } from './services/conversation-storage';
|
||||||
|
|
||||||
const logger = createLogger('summary-service');
|
const logger = createLogger('summary-service');
|
||||||
|
|
||||||
@@ -361,11 +362,17 @@ export async function generateAIResponse(
|
|||||||
userMessage: string,
|
userMessage: string,
|
||||||
telegramUserId?: string
|
telegramUserId?: string
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
const context = await getConversationContext(env.DB, userId, chatId);
|
// 1. 스마트 컨텍스트 조회 (새 시스템 - 최근 20개 + 키워드 관련 10개, 중복 제거)
|
||||||
|
const smartMessages = telegramUserId
|
||||||
|
? await getSmartContext(env.DB, telegramUserId, userMessage)
|
||||||
|
: [];
|
||||||
|
|
||||||
|
// 2. 기존 요약 조회 (아카이브된 프로필용)
|
||||||
|
const summaries = await getAllSummaries(env.DB, userId, chatId);
|
||||||
|
|
||||||
// 모든 요약 통합 (최신순 → 오래된순으로 정렬하여 시간순 표시)
|
// 모든 요약 통합 (최신순 → 오래된순으로 정렬하여 시간순 표시)
|
||||||
const integratedProfile = context.summaries.length > 0
|
const integratedProfile = summaries.length > 0
|
||||||
? context.summaries
|
? summaries
|
||||||
.slice()
|
.slice()
|
||||||
.reverse() // 오래된 것부터 표시
|
.reverse() // 오래된 것부터 표시
|
||||||
.map((s) => `[v${s.generation}] ${s.summary}`)
|
.map((s) => `[v${s.generation}] ${s.summary}`)
|
||||||
@@ -379,7 +386,7 @@ export async function generateAIResponse(
|
|||||||
|
|
||||||
const systemPrompt = `당신은 친절하고 유능한 AI 어시스턴트입니다.
|
const systemPrompt = `당신은 친절하고 유능한 AI 어시스턴트입니다.
|
||||||
${integratedProfile ? `
|
${integratedProfile ? `
|
||||||
## 사용자 프로필 (${context.summaries.length}개 버전 통합)
|
## 사용자 프로필 (${summaries.length}개 버전 통합)
|
||||||
${integratedProfile}
|
${integratedProfile}
|
||||||
|
|
||||||
위 프로필들을 종합하여 사용자의 관심사, 맥락, 변화를 이해하고 개인화된 응답을 제공하세요.
|
위 프로필들을 종합하여 사용자의 관심사, 맥락, 변화를 이해하고 개인화된 응답을 제공하세요.
|
||||||
@@ -412,7 +419,13 @@ ${memoriesSection}
|
|||||||
- manage_deposit, manage_domain, manage_server, manage_troubleshoot, suggest_domains 도구 결과는 그대로 전달하세요.
|
- manage_deposit, manage_domain, manage_server, manage_troubleshoot, suggest_domains 도구 결과는 그대로 전달하세요.
|
||||||
- 도구 결과에 "__DIRECT__" 마커가 포함되어 있으면 해설이나 추가 설명 없이 결과를 그대로 전달하세요. 앞뒤로 텍스트를 추가하지 마세요.`;
|
- 도구 결과에 "__DIRECT__" 마커가 포함되어 있으면 해설이나 추가 설명 없이 결과를 그대로 전달하세요. 앞뒤로 텍스트를 추가하지 마세요.`;
|
||||||
|
|
||||||
const recentContext = context.recentMessages.slice(-10).map((m) => ({
|
// 3. recentContext를 스마트 컨텍스트로 교체 (최대 30개)
|
||||||
|
const recentContext = smartMessages.length > 0
|
||||||
|
? smartMessages.slice(-30).map((m) => ({
|
||||||
|
role: m.role === 'user' ? 'user' as const : 'assistant' as const,
|
||||||
|
content: m.content,
|
||||||
|
}))
|
||||||
|
: (await getConversationContext(env.DB, userId, chatId)).recentMessages.slice(-10).map((m) => ({
|
||||||
role: m.role === 'user' ? 'user' as const : 'assistant' as const,
|
role: m.role === 'user' ? 'user' as const : 'assistant' as const,
|
||||||
content: m.message,
|
content: m.message,
|
||||||
}));
|
}));
|
||||||
|
|||||||
Reference in New Issue
Block a user