Skip to content

[Feat] 유사 채용공고 RAG 컨텍스트와 fingerprint 연동 - #230

Merged
whc9999 merged 3 commits into
devfrom
feat/analysis-similar-job-posting-rag
Jul 29, 2026
Merged

[Feat] 유사 채용공고 RAG 컨텍스트와 fingerprint 연동#230
whc9999 merged 3 commits into
devfrom
feat/analysis-similar-job-posting-rag

Conversation

@whc9999

@whc9999 whc9999 commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

✨ 어떤 이유로 PR를 하셨나요?

  • feature 병합
  • 버그 수정(아래에 issue #를 남겨주세요)
  • 코드 개선
  • 코드 수정
  • 배포
  • 기타(아래에 자세한 내용 기입해주세요)

📋 세부 내용 - 왜 해당 PR이 필요한지 작업 내용을 자세하게 설명해주세요

변경 사항

  • 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 성공

📸 작업 화면 스크린샷

⚠️ PR하기 전에 확인해주세요

  • 로컬테스트를 진행하셨나요?
  • 머지할 브랜치를 확인하셨나요?
  • 관련 label을 선택하셨나요?

🚨 관련 이슈 번호 [ ]

Summary by CodeRabbit

  • 새로운 기능

    • 분석 결과에 최대 3개의 유사 채용 공고 정보가 포함됩니다.
    • 유사 공고의 기업명, 직무 내용, 요구사항, 유사도 순위 및 점수를 확인할 수 있습니다.
  • 개선 사항

    • 유사 공고 정보가 없을 때도 안정적으로 빈 목록으로 제공됩니다.
    • 긴 공고 내용은 분석에 적합한 길이로 정리됩니다.
    • 유사도 점수가 항상 유효한 범위로 표시됩니다.

whc9999 added 2 commits July 30, 2026 04:35
## 변경 사항

- 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 성공
@whc9999 whc9999 self-assigned this Jul 29, 2026
@whc9999 whc9999 added the ✨ feat New feature or request label Jul 29, 2026
@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@whc9999, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 41 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3c27f0ad-59ac-4456-8ff2-e5a557fc32e5

📥 Commits

Reviewing files that changed from the base of the PR and between 8e5b35f and 34be26b.

📒 Files selected for processing (8)
  • ops/db/migrations/20260730_analysis_async_task_execution_snapshot.sql
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/entity/AnalysisAsyncTask.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeService.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/retrieval/JobPostingRagContextAssembler.java
  • src/main/resources/schema.sql
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeServiceTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/retrieval/JobPostingRagContextAssemblerTest.java
📝 Walkthrough

Walkthrough

유사 공고 컨텍스트 DTO와 분석 payload가 확장되었습니다. RAG 조립기가 유사 공고를 최대 3건까지 정규화·축약하고, 분석 서비스·fingerprint·worker 응답으로 전달합니다. 유사도 점수는 0~1 범위로 제한되며 관련 테스트가 추가되었습니다.

Changes

유사 공고 분석 컨텍스트

Layer / File(s) Summary
유사 공고 컨텍스트 계약 확장
src/main/java/com/jobdri/jobdri_api/domain/analysis/dto/worker/*, src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisExecutionPayload.java
SimilarJobPostingContext가 추가되고 분석 payload 및 worker 응답에 유사 공고 목록이 포함됩니다. 기존 생성자는 빈 목록을 사용하며 목록은 null 정규화와 불변 복사를 적용합니다.
유사 공고 RAG 컨텍스트 조립
src/main/java/com/jobdri/jobdri_api/domain/analysis/service/retrieval/JobPostingRagContextAssembler.java, src/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingRetrievalService.java, src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java, src/test/java/com/jobdri/jobdri_api/domain/analysis/service/retrieval/*, src/test/java/com/jobdri/jobdri_api/domain/jobposting/service/*
유사 공고 최대 3건을 상세 공고와 결합하고 문자열을 정규화·1,200자 이내로 축약합니다. 검색 실패 시 빈 목록을 반환하며 유사도 점수는 0~1 범위로 제한됩니다.
분석 전달 및 fingerprint 반영
src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisInputFingerprintProvider.java, src/main/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeService.java, src/test/java/com/jobdri/jobdri_api/domain/analysis/service/core/*, src/test/java/com/jobdri/jobdri_api/domain/analysis/service/async/*, src/test/java/com/jobdri/jobdri_api/domain/analysis/dto/worker/*
유사 공고 컨텍스트가 분석 입력 fingerprint와 worker 응답에 전달됩니다. fingerprint 및 prompt policy 버전이 v2로 변경되고, 응답 직렬화와 전달 결과를 검증하는 테스트가 추가되었습니다.

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: 컨텍스트 포함 응답 생성
Loading

Possibly related PRs

Suggested labels: ✨ feat

Suggested reviewers: shinae1023

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 주요 변경점인 유사 채용공고 RAG 컨텍스트와 fingerprint 연동을 간결하게 잘 요약했습니다.
Description check ✅ Passed 변경 이유, 세부 내용, 호환성, 테스트가 포함되어 있어 템플릿을 대부분 충족합니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/analysis-similar-job-posting-rag

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

RAG 조립은 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

📥 Commits

Reviewing files that changed from the base of the PR and between bb7df3b and 8e5b35f.

📒 Files selected for processing (14)
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/dto/worker/AnalysisWorkerContextResponse.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/dto/worker/SimilarJobPostingContext.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeService.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisExecutionPayload.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisInputFingerprintProvider.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java
  • src/main/java/com/jobdri/jobdri_api/domain/analysis/service/retrieval/JobPostingRagContextAssembler.java
  • src/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingRetrievalService.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/dto/worker/AnalysisWorkerContextResponseTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/async/AnalysisWorkerBridgeServiceTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisInputFingerprintProviderTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisServiceTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/analysis/service/retrieval/JobPostingRagContextAssemblerTest.java
  • src/test/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingRetrievalServiceTest.java

@whc9999
whc9999 merged commit 98e105c into dev Jul 29, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ feat New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant