e405ed3414
근본 원인: evidence 프롬프트가 "<0.5 = 탈락" 명시 → LLM 하향 편향 →
candidates 5개 중 4개 탈락 → synthesis 자체 거부.
Change 2: evidence_extract.txt
- relevance 스케일 재정의: "탈락" 라벨 제거
- 0.3~0.5 약한 부분 연관 / 0.5~0.7 명확한 부분 연관 구간 세분화
- "directly answer" → "no connection at all" 완화
Change 3: search_synthesis.txt
- refused 조건: "직접 답 아니면 거부" → "완전 무관일 때만 거부"
- "covered only" 제한: partial evidence로 missing part 추론 금지
- supplement evidence weight 지시 추가 (보조 취급)
Change 1: evidence_service.py
- sparse evidence supplement: kept 1~2 + candidates 3+ → rule-only 보충
- substring + critical token 필터 (recall+precision)
- critical token: 길이 3자+ OR 의미 기반 suffix (조건/기준/처벌 등)
- EvidenceItem.source 필드 ("llm"|"supplement"|"rule_fallback")
Change 4: search.py
- defense_log["evidence"] 추가 (skip_reason, kept_count)
synthesis_service.py
- supplement evidence [n] (보충) 마킹
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
78 lines
2.9 KiB
Plaintext
78 lines
2.9 KiB
Plaintext
You are an evidence span extractor. Respond ONLY in JSON. No markdown, no explanation.
|
|
|
|
## Task
|
|
|
|
For each numbered candidate, extract the most query-relevant span from the original text (copy verbatim, 50-200 chars) and rate relevance 0.0~1.0. If the candidate has no connection at all to the query topic, set span=null, relevance=0.0, skip_reason. Partial or indirect relevance should still get a span and relevance >= 0.3.
|
|
|
|
## Output Schema
|
|
{
|
|
"items": [
|
|
{
|
|
"n": 1,
|
|
"span": "...",
|
|
"relevance": 0.0,
|
|
"skip_reason": null
|
|
}
|
|
]
|
|
}
|
|
|
|
## Rules
|
|
- `n`: candidate 번호 (1-based, 입력 순서와 동일). **모든 n을 반환** (skip된 것도 포함).
|
|
- `span`: 원문에서 **그대로 복사한** 50~200자. 요약/변형 금지. 원문에 없는 단어는 절대 포함하지 말 것. 여러 문장이어도 무방.
|
|
- 관련 span이 없으면 `span: null`, `relevance: 0.0`, `skip_reason`에 한 줄 사유.
|
|
- `relevance`: 0.0~1.0 float
|
|
- 0.9+ query에 직접 답함
|
|
- 0.7~0.9 강한 연관
|
|
- 0.5~0.7 명확한 부분 연관 (query의 핵심 측면 일부를 커버)
|
|
- 0.3~0.5 약한 부분 연관 (query 주제에 관련되나 직접 답은 아님)
|
|
- <0.3 무관
|
|
- `skip_reason`: span=null 일 때만 필수. 예: "no_direct_relevance", "off_topic", "generic_boilerplate"
|
|
- **원문 그대로 복사 강제**: 번역/paraphrase/요약 모두 금지. evidence span은 citation 원문이 되어야 한다.
|
|
|
|
## Example 1 (hit)
|
|
query: `산업안전보건법 제6장 주요 내용`
|
|
candidates:
|
|
[1] title: 산업안전보건법 해설 / text: 제6장은 "안전보건관리체제"에 관한 장으로, 사업주의 안전보건관리책임자 선임 의무와 관리감독자 지정 등을 규정한다. 제15조부터 제19조까지 구성된다...
|
|
[2] title: 회사 복지 규정 / text: 직원의 연차휴가 사용 규정과 경조사 지원 내용을 담고 있다...
|
|
|
|
→
|
|
{
|
|
"items": [
|
|
{
|
|
"n": 1,
|
|
"span": "제6장은 \"안전보건관리체제\"에 관한 장으로, 사업주의 안전보건관리책임자 선임 의무와 관리감독자 지정 등을 규정한다. 제15조부터 제19조까지 구성된다",
|
|
"relevance": 0.95,
|
|
"skip_reason": null
|
|
},
|
|
{
|
|
"n": 2,
|
|
"span": null,
|
|
"relevance": 0.0,
|
|
"skip_reason": "off_topic"
|
|
}
|
|
]
|
|
}
|
|
|
|
## Example 2 (partial)
|
|
query: `Python async best practice`
|
|
candidates:
|
|
[1] title: FastAPI tutorial / text: FastAPI supports both async and sync endpoints. For I/O-bound operations, use async def with await for database and HTTP calls. Avoid blocking calls in async functions or use run_in_executor...
|
|
|
|
→
|
|
{
|
|
"items": [
|
|
{
|
|
"n": 1,
|
|
"span": "For I/O-bound operations, use async def with await for database and HTTP calls. Avoid blocking calls in async functions or use run_in_executor",
|
|
"relevance": 0.82,
|
|
"skip_reason": null
|
|
}
|
|
]
|
|
}
|
|
|
|
## Query
|
|
{query}
|
|
|
|
## Candidates
|
|
{numbered_candidates}
|