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:
kappa
2026-02-05 12:25:57 +09:00
parent a14e640db9
commit 1ecbf19f66

View File

@@ -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,10 +419,16 @@ ${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개)
role: m.role === 'user' ? 'user' as const : 'assistant' as const, const recentContext = smartMessages.length > 0
content: m.message, ? 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,
content: m.message,
}));
// OpenAI 사용 (설정된 경우) // OpenAI 사용 (설정된 경우)
if (env.OPENAI_API_KEY) { if (env.OPENAI_API_KEY) {