[Feat] 유사 채용공고 RAG 컨텍스트와 fingerprint 연동 - #230
Conversation
## 변경 사항 - JobPosting Similarity Retrieval 결과를 Python 비동기 분석 worker context에 전달 - 유사 공고의 주요업무, 자격요건, 우대사항을 보조 RAG Context로 사용 - 현재 공고를 최우선으로 사용하는 Prompt 규칙 추가 - 유사 공고 Context를 Analysis fingerprint에 포함 - Retrieval 실패 시 빈 Context로 분석을 계속하는 fail-open 적용 ## 호환성 - 외부 API 응답 변경 없음 - RabbitMQ 메시지 구조 변경 없음 - DB 및 migration 변경 없음 - 분석 Structured Output 변경 없음 - 기존 worker context 요청은 `similarJobPostings=[]`로 하위 호환 ## 테스트 - BackEnd 전체 테스트 성공 - analysis-server 전체 테스트 71/71 성공 - Java compile 성공 - Python compileall 성공 - 양쪽 git diff --check 성공
|
Warning Review limit reached
Next review available in: 41 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (8)
📝 WalkthroughWalkthrough유사 공고 컨텍스트 DTO와 분석 payload가 확장되었습니다. RAG 조립기가 유사 공고를 최대 3건까지 정규화·축약하고, 분석 서비스·fingerprint·worker 응답으로 전달합니다. 유사도 점수는 0~1 범위로 제한되며 관련 테스트가 추가되었습니다. Changes유사 공고 분석 컨텍스트
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant AnalysisService
participant JobPostingRagContextAssembler
participant JobPostingRetrievalService
participant JobPostingRepository
participant AnalysisExecutionPayload
participant AnalysisInputFingerprintProvider
participant AnalysisWorkerBridgeService
AnalysisService->>JobPostingRagContextAssembler: assemble(jobPostingId)
JobPostingRagContextAssembler->>JobPostingRetrievalService: 유사 공고 조회
JobPostingRagContextAssembler->>JobPostingRepository: 상세 공고 조회
JobPostingRagContextAssembler-->>AnalysisService: SimilarJobPostingContext 목록
AnalysisService->>AnalysisExecutionPayload: 컨텍스트 포함 payload 생성
AnalysisInputFingerprintProvider->>AnalysisExecutionPayload: 컨텍스트 포함 fingerprint 생성
AnalysisWorkerBridgeService->>AnalysisExecutionPayload: 컨텍스트 조회
AnalysisWorkerBridgeService-->>AnalysisWorkerBridgeService: 컨텍스트 포함 응답 생성
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java (1)
162-171: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick winRAG 조립은 readOnly 트랜잭션 밖으로 분리하세요.
prepareAnalysisExecution은@Transactional(readOnly = true)안에서corpusRetrievalService호출에 이어jobPostingRagContextAssembler.assemble(...)도 거칩니다. 여기서는JobPostingRetrievalService.findSimilarJobPostings(...)가 Spring의 기본 전파(REQUIRED)로 같은 readOnly 트랜잭션에 합류하고, Cohere Embedding API 호출 이후dataSource.getConnection()으로 PGvector 검색을 수행합니다. 외부 호출 실패는 fail-open으로 처리하지만, timeout과 재시도로 인해 트랜잭션 유지 시간이 늘고 커넥션 풀이 두 번 잡히는 구조라analyze()/hasReusableAnalysis()경로에서 지연이 쉽게 영향을 줍니다. 임베딩 벡터와 유사 공고 목록만 먼저 비동기/별도 트랜잭션으로 읽어payload에 담고, 기존 엔티티 필드 참조만 트랜잭션 안에서 유지하도록 변경하면 더 안전합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java` around lines 162 - 171, 분석 실행 준비 흐름에서 jobPostingRagContextAssembler.assemble 호출을 `@Transactional`(readOnly = true) 트랜잭션 밖으로 분리하세요. prepareAnalysisExecution에서 임베딩 벡터와 유사 공고 목록을 비동기 또는 별도 트랜잭션으로 먼저 조회해 payload에 전달하고, 트랜잭션 내부에는 기존 엔티티 필드 참조만 남기도록 analyze 및 hasReusableAnalysis 경로의 호출 구조를 조정하세요.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@src/main/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeService.java`:
- Around line 126-127: Update AnalysisWorkerBridgeService so the initial
getContext/prepareAnalysisExecution result is stored as an immutable per-task
server-side payload/RAG snapshot and reused by completeTask, ensuring the worker
input and persisted fingerprint remain identical across changing or fail-open
retrieval results. In
src/main/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeService.java
lines 126-127, use that task snapshot instead of performing a fresh context
lookup. Add a regression test in
src/test/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeServiceTest.java
lines 138-168 covering an initially empty retrieval followed by a non-empty
completion-time retrieval and asserting the initial worker fingerprint is
preserved.
In
`@src/test/java/com/jobdri/jobdri_api/domain/analysis/service/retrieval/JobPostingRagContextAssemblerTest.java`:
- Around line 1-105: Extend JobPostingRagContextAssemblerTest with two
boundary-case tests: verify assemble excludes similarity results whose IDs are
absent from the partial findAllById response while preserving the remaining
contexts’ correct similarity ranks, and verify an empty findSimilarJobPostings
response returns an empty list without calling jobPostingRepository.findAllById.
Reuse the existing assembler, result, posting, and Mockito setup.
---
Outside diff comments:
In
`@src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java`:
- Around line 162-171: 분석 실행 준비 흐름에서 jobPostingRagContextAssembler.assemble 호출을
`@Transactional`(readOnly = true) 트랜잭션 밖으로 분리하세요. prepareAnalysisExecution에서 임베딩
벡터와 유사 공고 목록을 비동기 또는 별도 트랜잭션으로 먼저 조회해 payload에 전달하고, 트랜잭션 내부에는 기존 엔티티 필드 참조만
남기도록 analyze 및 hasReusableAnalysis 경로의 호출 구조를 조정하세요.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 764654c3-a68e-4e0e-a0f6-4b26ed919c1d
📒 Files selected for processing (14)
src/main/java/com/jobdri/jobdri_api/domain/analysis/dto/worker/AnalysisWorkerContextResponse.javasrc/main/java/com/jobdri/jobdri_api/domain/analysis/dto/worker/SimilarJobPostingContext.javasrc/main/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeService.javasrc/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisExecutionPayload.javasrc/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisInputFingerprintProvider.javasrc/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.javasrc/main/java/com/jobdri/jobdri_api/domain/analysis/service/retrieval/JobPostingRagContextAssembler.javasrc/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingRetrievalService.javasrc/test/java/com/jobdri/jobdri_api/domain/analysis/dto/worker/AnalysisWorkerContextResponseTest.javasrc/test/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeServiceTest.javasrc/test/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisInputFingerprintProviderTest.javasrc/test/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisServiceTest.javasrc/test/java/com/jobdri/jobdri_api/domain/analysis/service/retrieval/JobPostingRagContextAssemblerTest.javasrc/test/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingRetrievalServiceTest.java
✨ 어떤 이유로 PR를 하셨나요?
📋 세부 내용 - 왜 해당 PR이 필요한지 작업 내용을 자세하게 설명해주세요
변경 사항
호환성
similarJobPostings=[]로 하위 호환테스트
📸 작업 화면 스크린샷
🚨 관련 이슈 번호 [ ]
Summary by CodeRabbit
새로운 기능
개선 사항