Span-level source attribution in Foundry IQ responses - map answer claims to retrieved chunks #450
Unanswered
Jubin Soni (jubins)
asked this question in
Product Feedback and Ideas
Replies: 1 comment
|
Until the platform emits it, the version that has held up for me inverts the workaround: make the generation carry provenance instead of reconstructing it afterwards.
Evaluation then falls out. Groundedness per response becomes verified claims over total claims, so an 80/20 answer reads as 80/20 and never as "mostly grounded". Compliance reads the same table. The cost is an extra generation step and a stricter prompt contract. I maintain a reference architecture that documents this exact pattern: https://github.com/jimy-r/agent-workspace-architecture/blob/main/PATTERNS.md#16-a-claim-carries-its-provenance-or-it-is-a-guess |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Technical Feedback
Foundry IQ returns a grounded answer and the sources it retrieved, but it does not link specific parts of the answer to specific sources or chunks.
This becomes a problem when an answer combines sources. A paragraph might use three documents, but there is no way to tell which sentence came from which document, or which claims have no supporting source.
This blocks three things:
Also, there is also no stable ID connecting an answer span to the document and chunk that support it, making attribution difficult to persist or replay after reindexing.
What is missing is span-level attribution from each claim to its supporting document and chunk, or an explicit indication that no source supports the claim.
Desired Outcome
An optional attribution field on the response, off by default, roughly like this:
{ "answer": "...", "attributions": [ { "span": { "start": 0, "end": 87 }, "supports": [ { "document_id": "doc_a1b2", "chunk_id": "chunk_0034", "source_span": { "start": 1204, "end": 1389 }, "score": 0.91 } ] }, { "span": { "start": 88, "end": 156 }, "supports": [] } ] }Current Workaround
Currently there are 3 not so perfect workarounds.
Check each sentence against each candidate chunk. More accurate, but it's N×M calls and roughly doubles latency and cost on the request path. Batching helps a bit but it doesn't fix the math.
Ask the model to emit
[1],[2], ... after each claim. It drops markers in longer answers, sometimes cites indices that don't exist, and gives you no character offsets, so you still have to parse and reconcile everything yourself. It also fights with structured output.All reactions