Skip to content

Commit 1fb11bc

Browse files
authored
πŸ› μ±„νŒ… μš”μ²­μžκ°€ 달라도 μΊμ‹œλ˜κ²Œ μˆ˜μ •, ν”„λ‘¬ν”„νŠΈ κ°œμ„  (#25)
* πŸ› μ±„νŒ… μš”μ²­μžκ°€ 달라도 μΊμ‹œλ˜κ²Œ μˆ˜μ • * πŸ› 검색 μ—λŸ¬ μˆ˜μ • * βš‘οΈν”„λ‘¬ν”„νŠΈ κ°œμ„ 
1 parent dacca01 commit 1fb11bc

7 files changed

Lines changed: 14 additions & 15 deletions

File tree

β€Ždocs/history-tasks/ASK_DUPLICATE_CACHE.mdβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
- `persistConversation`(`session-history.service.ts:68`)이 answer toneκ³Ό 쀑볡 질문 벑터λ₯Ό ν•¨κ»˜ `ask_question_cache`에 upsertν•œλ‹€.
2222

2323
### 3. tone-aware μΊμ‹œ 쑰회
24-
- `findCachedAnswer`(`session-history.service.ts:146`)κ°€ owner, requester, post, category 쑰건에 λ§žλŠ” 후보λ₯Ό tone ID와 ν•¨κ»˜ λŒλ €μ€€λ‹€.
24+
- `findCachedAnswer`(`session-history.service.ts:146`)κ°€ owner, post, category 쑰건에 λ§žλŠ” 후보λ₯Ό tone ID와 ν•¨κ»˜ λŒλ €μ€€λ‹€. `requester_user_id` ν•„ν„°λ₯Ό μ—†μ•  동일 κΈ€μ˜ κ΄€λ¦¬μžλŠ” μ—¬λŸ¬ 상담 채널/μš”μ²­μž 간에도 μΊμ‹œλ₯Ό μž¬ν™œμš©ν•  수 μžˆλ‹€.
2525
- `selectToneAwareCacheCandidate`(`session-history.service.ts:36`)κ°€ μš”μ²­ toneκ³Ό λ™μΌν•œ 후보λ₯Ό κ³ λ₯΄κ³ , μ—†μœΌλ©΄ top-1 후보λ₯Ό rewrite λŒ€μƒμœΌλ‘œ μ§€μ •ν•œλ‹€.
2626
- `qa.service.ts:192`, `qa.v2.service.ts:175`μ—μ„œ tone이 λ§žλŠ” μΊμ‹œλŠ” κ·ΈλŒ€λ‘œ μž¬μƒν•˜κ³ , tone이 λ‹€λ₯΄λ©΄ rewrite 경둜둜 λΆ„κΈ°ν•œλ‹€.
2727

β€Žsrc/prompts/qa.prompts.tsβ€Ž

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,11 @@ ${speechTonePrompt}
8080
[응닡 κ·œμΉ™]
8181
1. κ·œμΉ™κ³Ό 말투λ₯Ό μ§€μΌœ λ‹΅ν•˜κ³ , 질문과 κ΄€λ ¨λ˜μ–΄ λΈ”λ‘œκ·Έ μ΄μš©μžκ°€ 더 μ‚΄νŽ΄λ³Ό λ§Œν•œ ν¬μŠ€νŠΈΒ·μΉ΄ν…Œκ³ λ¦¬λ₯Ό ν•¨κ»˜ μΆ”μ²œν•œλ‹€.
8282
2. μš•μ„€Β·λΉ„λ‚œΒ·λ¬΄κ΄€Β·λΆ€μ μ ˆν•œ μ§ˆλ¬Έμ€ 사과 ν›„ λΈ”λ‘œκ·Έ κ΄€λ ¨ 질문만 응닡 κ°€λŠ₯함을 μ•Œλ¦¬κ³ , μΉœμ ˆν•˜κ²Œ 탐색 κ°€λŠ₯ν•œ μ˜μ—­μ„ μ•ˆλ‚΄ν•œλ‹€.
83-
3. λΈ”λ‘œκ·Έ μ£Όμ œμ—λŠ” λ§žμ§€λ§Œ κ΄€λ ¨ 글이 μ—†κ±°λ‚˜ λŒ€λ‹΅ν•˜κΈ° λΆ€μ‘±ν•˜λ©΄ 뢀쑱함을 μ•Œλ¦°λ‹€.`;
83+
3. λΈ”λ‘œκ·Έ μ£Όμ œμ—λŠ” λ§žμ§€λ§Œ ν•΄λ‹Ή 글이 μ—†κ±°λ‚˜ λŒ€λ‹΅ν•˜κΈ° λΆ€μ‘±ν•˜λ©΄ 뢀쑱함을 μ•Œλ¦¬κ³  4번 κ·œμΉ™μ„ λ¬΄μ‹œν•˜λ©° λŒ€ν™”λ₯Ό 마무리 ν•œλ‹€.
84+
3-1. μ§ˆλ¬Έμ— μ™„λ²½νžˆ λΆ€ν•©ν•˜μ§€ μ•ŠμœΌλ©΄ κ΄€λ ¨λœ 뢀뢄을 근거둜 λ‹΅λ³€ν•˜λ˜, 뢀쑱함을 μ•Œλ¦°λ‹€.
85+
4. 질문의 주제 및 λŒ€μƒμ΄ \β€™μΌλ°˜μ μΈ κ°œλ…\’과 \β€™λΈ”λ‘œκ·Έ 포슀트 κ°œλ…\β€™μœΌλ‘œ 두가지 μ΄μƒμ˜ 의미λ₯Ό κ°–κ³  μžˆμ„ 경우, \β€™λΈ”λ‘œκ·Έ 포슀트 κ΄€λ ¨ κ°œλ…\’ μœ„μ£Όλ‘œ κ°€μž₯ λ¨Όμ € μ„€λͺ…ν•˜κ³ , λ§ˆμ§€λ§‰μœΌλ‘œ β€™μΌλ°˜μ μΈ κ°œλ…\’을 κ°„λ‹¨ν•˜κ²Œ μ†Œκ°œν•œλ‹€. μ΄λ•Œ, 두 κ°œλ…μ΄ λΆ„λ¦¬λ˜μ–΄ μ •λ¦¬λ˜κ²Œ λ‚˜νƒ€λ‚˜λ„λ‘ 가독성을 높인닀.
86+
5. \β€™μΌλ°˜μ μΈ\ κ°œλ…β€™μ΄ μ‘΄μž¬ν•˜μ§€ μ•Šκ³  κ΄€λ ¨ 주제, μΉ΄ν…Œκ³ λ¦¬, \β€™λΈ”λ‘œκ·Έ 포슀트 κ°œλ…\’이 μ‘΄μž¬ν•˜λŠ” 경우, κ·Έ κ°œλ…μ„ 기반으둜 λŒ€λ‹΅μ„ ν•˜κ³  λ§ˆμ§€λ§‰μœΌλ‘œ ν•΄λ‹Ή κ²Œμ‹œκΈ€μ΄ μ–΄λ–€ 글인지 μ•Œλ¦¬λ©° μ§ˆλ¬Έμ„ μœ λ„ν•˜κ³  λŒ€ν™”λ₯Ό λ§ˆλ¬΄λ¦¬ν•œλ‹€.`;
87+
8488

8589
const userMessage = `[context]
8690
${topicHint}
@@ -191,8 +195,10 @@ ${speechTonePrompt}
191195
[응닡 κ·œμΉ™]
192196
1. κ·œμΉ™κ³Ό 말투λ₯Ό μ§€μΌœ λ‹΅ν•˜κ³ , 질문과 κ΄€λ ¨λ˜μ–΄ λΈ”λ‘œκ·Έ μ΄μš©μžκ°€ 더 μ‚΄νŽ΄λ³Ό λ§Œν•œ ν¬μŠ€νŠΈΒ·μΉ΄ν…Œκ³ λ¦¬λ₯Ό ν•¨κ»˜ μΆ”μ²œν•œλ‹€.
193197
2. μš•μ„€Β·λΉ„λ‚œΒ·λ¬΄κ΄€Β·λΆ€μ μ ˆν•œ μ§ˆλ¬Έμ€ 사과 ν›„ λΈ”λ‘œκ·Έ κ΄€λ ¨ 질문만 응닡 κ°€λŠ₯함을 μ•Œλ¦¬κ³ , μΉœμ ˆν•˜κ²Œ 탐색 κ°€λŠ₯ν•œ μ˜μ—­μ„ μ•ˆλ‚΄ν•œλ‹€.
194-
3. λΈ”λ‘œκ·Έ μ£Όμ œμ—λŠ” λ§žμ§€λ§Œ κ΄€λ ¨ 글이 μ—†κ±°λ‚˜ λŒ€λ‹΅ν•˜κΈ° λΆ€μ‘±ν•˜λ©΄ 뢀쑱함을 μ•Œλ¦°λ‹€.
195-
4. κ΄€λ ¨ μ£Όμ œλ‚˜ μΉ΄ν…Œκ³ λ¦¬κ°€ μžˆμ„ 경우 μ•ˆλ‚΄ν•˜κ³  μ§ˆλ¬Έμ„ μœ λ„ν•œλ‹€`;
198+
3. λΈ”λ‘œκ·Έ μ£Όμ œμ—λŠ” λ§žμ§€λ§Œ κ΄€λ ¨ 글이 μ—†κ±°λ‚˜ λŒ€λ‹΅ν•˜κΈ° λΆ€μ‘±ν•˜λ©΄ 뢀쑱함을 μ•Œλ¦¬κ³ , 이후 κ·œμΉ™μ„ λ¬΄μ‹œν•˜λ©° λŒ€ν™”λ₯Ό 마무리 ν•œλ‹€.
199+
3-1. μ§ˆλ¬Έμ— μ™„λ²½νžˆ λΆ€ν•©ν•˜μ§€ μ•ŠμœΌλ©΄ κ΄€λ ¨λœ 뢀뢄을 근거둜 λ‹΅λ³€ν•˜λ˜, 뢀쑱함을 μ•Œλ¦°λ‹€.
200+
4. 질문의 주제 및 λŒ€μƒμ΄ \β€™μΌλ°˜μ μΈ κ°œλ…\’과 \β€™λΈ”λ‘œκ·Έ 포슀트 κ°œλ…\β€™μœΌλ‘œ 두가지 μ΄μƒμ˜ 의미λ₯Ό κ°–κ³  μžˆμ„ 경우, \β€™λΈ”λ‘œκ·Έ 포슀트 κ΄€λ ¨ κ°œλ…\’ μœ„μ£Όλ‘œ κ°€μž₯ λ¨Όμ € μ„€λͺ…ν•˜κ³ , λ§ˆμ§€λ§‰μœΌλ‘œ β€™μΌλ°˜μ μΈ κ°œλ…\’을 κ°„λ‹¨ν•˜κ²Œ μ†Œκ°œν•œλ‹€. μ΄λ•Œ, 두 κ°œλ…μ΄ λΆ„λ¦¬λ˜μ–΄ μ •λ¦¬λ˜κ²Œ λ‚˜νƒ€λ‚˜λ„λ‘ 가독성을 높인닀.
201+
5. \β€™μΌλ°˜μ μΈ\ κ°œλ…β€™μ΄ μ‘΄μž¬ν•˜μ§€ μ•Šκ³  κ΄€λ ¨ 주제, μΉ΄ν…Œκ³ λ¦¬, \β€™λΈ”λ‘œκ·Έ 포슀트 κ°œλ…\’이 μ‘΄μž¬ν•˜λŠ” 경우, κ·Έ κ°œλ…μ„ 기반으둜 λŒ€λ‹΅μ„ ν•˜κ³  λ§ˆμ§€λ§‰μœΌλ‘œ ν•΄λ‹Ή κ²Œμ‹œκΈ€μ΄ μ–΄λ–€ 글인지 μ•Œλ¦¬λ©° μ§ˆλ¬Έμ„ μœ λ„ν•˜κ³  λŒ€ν™”λ₯Ό λ§ˆλ¬΄λ¦¬ν•œλ‹€.`;
196202

197203
const retrievalSummary = buildRetrievalSummary(options?.retrievalMeta, similarChunks.length);
198204

β€Žsrc/repositories/ask-question-cache.repository.tsβ€Ž

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ export interface SimilarMessage {
112112

113113
export interface SimilarSearchParams {
114114
ownerUserId: string;
115-
requesterUserId: string;
116115
embedding: number[];
117116
postId?: number | null;
118117
categoryId?: number | null;
@@ -121,14 +120,13 @@ export interface SimilarSearchParams {
121120

122121
export const findSimilarEmbeddings = async ({
123122
ownerUserId,
124-
requesterUserId,
125123
embedding,
126124
postId,
127125
categoryId,
128126
limit = 3,
129127
}: SimilarSearchParams): Promise<SimilarMessage[]> => {
130-
const filters = ['owner_user_id = $2', 'requester_user_id = $3'];
131-
const values: unknown[] = [pgvector.toSql(embedding), ownerUserId, requesterUserId];
128+
const filters = ['owner_user_id = $2'];
129+
const values: unknown[] = [pgvector.toSql(embedding), ownerUserId];
132130

133131
if (postId != null) {
134132
values.push(postId);

β€Žsrc/repositories/post.repository.tsβ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,8 +419,8 @@ export const findSimilarChunksGlobalANN = async (params: {
419419
values.push(topK);
420420

421421
let orderBy = 'similarity_score DESC';
422-
if (params.sort === 'created_at_desc') orderBy = 'similarity_score DESC, bp.created_at DESC';
423-
if (params.sort === 'created_at_asc') orderBy = 'similarity_score DESC, bp.created_at ASC';
422+
if (params.sort === 'created_at_desc') orderBy = 'similarity_score DESC, created_at DESC';
423+
if (params.sort === 'created_at_asc') orderBy = 'similarity_score DESC, created_at ASC';
424424

425425
const sql = `
426426
WITH nn AS (

β€Žsrc/services/qa.service.tsβ€Ž

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,6 @@ export const answerStream = async ({
182182
const cachedAnswerList = duplicateQuestionEmbedding
183183
? await sessionHistoryService.findCachedAnswer({
184184
ownerUserId,
185-
requesterUserId,
186185
embedding: duplicateQuestionEmbedding,
187186
postId: postId ?? undefined,
188187
categoryId: categoryId ?? undefined,

β€Žsrc/services/qa.v2.service.tsβ€Ž

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ export const answerStreamV2 = async ({
165165
const cachedAnswerList = duplicateQuestionEmbedding
166166
? await sessionHistoryService.findCachedAnswer({
167167
ownerUserId,
168-
requesterUserId,
169168
embedding: duplicateQuestionEmbedding,
170169
postId: postId ?? undefined,
171170
categoryId: categoryId ?? undefined,

β€Žsrc/services/session-history.service.tsβ€Ž

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ export interface CachedAnswerResult {
136136

137137
export interface FindCachedAnswerParams {
138138
ownerUserId: string;
139-
requesterUserId: string;
140139
embedding: number[];
141140
postId?: number;
142141
categoryId?: number;
@@ -145,15 +144,13 @@ export interface FindCachedAnswerParams {
145144

146145
export const findCachedAnswer = async ({
147146
ownerUserId,
148-
requesterUserId,
149147
embedding,
150148
postId,
151149
categoryId,
152150
threshold = DUPLICATE_SIMILARITY_THRESHOLD,
153151
}: FindCachedAnswerParams): Promise<CachedAnswerResult[]> => {
154152
const candidates = await questionCacheRepository.findSimilarEmbeddings({
155153
ownerUserId,
156-
requesterUserId,
157154
embedding,
158155
postId: postId ?? null,
159156
categoryId: categoryId ?? null,

0 commit comments

Comments
Β (0)