Merge pull request #508 from ggozad/fix/cite-partial-feedback
cite reports unresolvable chunk ids on partial success
This commit is contained in:
commit
82693f7974
3 changed files with 42 additions and 0 deletions
|
|
@ -5,6 +5,10 @@
|
||||||
|
|
||||||
- `hotpotqa` evaluation dataset.
|
- `hotpotqa` evaluation dataset.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- `cite` skill tool names unresolvable chunk ids in its response when at least one id resolves.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Document deletion no longer raises `ConfigMismatchError` on embedding config drift.
|
- Document deletion no longer raises `ConfigMismatchError` on embedding config drift.
|
||||||
|
|
|
||||||
|
|
@ -382,6 +382,15 @@ def create_skill_tools(
|
||||||
|
|
||||||
if citations:
|
if citations:
|
||||||
_register_citations(state, citations)
|
_register_citations(state, citations)
|
||||||
|
resolved_ids = {c.chunk_id for c in citations}
|
||||||
|
unresolved = [cid for cid in missing if cid not in resolved_ids]
|
||||||
|
if unresolved:
|
||||||
|
return (
|
||||||
|
f"Registered {len(citations)} citation(s); "
|
||||||
|
f"ignored {len(unresolved)} unresolvable id(s): "
|
||||||
|
f"{unresolved}. Copy chunk_ids verbatim from `search` "
|
||||||
|
"results or items.jsonl / toc.json rows and cite again."
|
||||||
|
)
|
||||||
return f"Registered {len(citations)} citation(s)."
|
return f"Registered {len(citations)} citation(s)."
|
||||||
|
|
||||||
raise ModelRetry(
|
raise ModelRetry(
|
||||||
|
|
|
||||||
|
|
@ -355,6 +355,35 @@ class TestCiteTool:
|
||||||
assert "verbatim" in message
|
assert "verbatim" in message
|
||||||
assert "nonexistent-chunk-id" in message
|
assert "nonexistent-chunk-id" in message
|
||||||
|
|
||||||
|
async def test_cite_reports_unresolved_ids_on_partial_success(
|
||||||
|
self, rag_db, rag_client
|
||||||
|
):
|
||||||
|
"""A cite call mixing valid and bogus ids registers the valid ones
|
||||||
|
and names the rejected ids so the model can re-cite the rest."""
|
||||||
|
from haiku.rag.skills.rag import RAGState, create_skill
|
||||||
|
|
||||||
|
skill = create_skill(db_path=rag_db)
|
||||||
|
search = _get_tool(skill, "search")
|
||||||
|
cite = _get_tool(skill, "cite")
|
||||||
|
state = RAGState()
|
||||||
|
ctx = _make_ctx(state, rag=rag_client)
|
||||||
|
|
||||||
|
await search(ctx, query="artificial intelligence")
|
||||||
|
valid_id = next(
|
||||||
|
sr.chunk_id
|
||||||
|
for results in state.searches.values()
|
||||||
|
for sr in results
|
||||||
|
if sr.chunk_id
|
||||||
|
)
|
||||||
|
|
||||||
|
result = await cite(ctx, chunk_ids=[valid_id, "6.43", "6.51.2"])
|
||||||
|
assert "Registered 1 citation(s)" in result
|
||||||
|
assert "6.43" in result
|
||||||
|
assert "6.51.2" in result
|
||||||
|
assert "verbatim" in result
|
||||||
|
assert len(state.citations) == 1
|
||||||
|
assert valid_id in state.citations
|
||||||
|
|
||||||
async def test_cite_returns_message_when_chunk_ids_empty(self, rag_db):
|
async def test_cite_returns_message_when_chunk_ids_empty(self, rag_db):
|
||||||
"""An empty chunk_ids list is a no-op, not a retry trigger."""
|
"""An empty chunk_ids list is a no-op, not a retry trigger."""
|
||||||
from haiku.rag.skills.rag import RAGState, create_skill
|
from haiku.rag.skills.rag import RAGState, create_skill
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue