# Haystack SentenceWindowRetriever：命中一句后补回前后文，阻止跨文档串段

已运行真实Haystack SentenceWindowRetriever，返回A0/A1/A2并排除B来源，window_size=0被拒绝；未执行embedding或答案生成。

## 运行

在本目录使用独立虚拟环境并安装requirements.txt；脚本结果写入results。

```sh
python reference/audit.py
python reference/run_sdk.py
```

fixtures是原创输入与故意失败样本；作者真值、离线合成provider和实际SDK记录各自标明，不是模型正确率。需要真实模型/账号/GPU的步骤按正文另行授权运行。

## 1. 保留同句不同来源反例

A/B文档都有“Tighten the left screw.”，但相邻说明不同。命中句文本相同并不代表它们可以共享上下文。

## 2. 确认分句坐标从哪里来

input.json使用source_id与split_id，window_size=1表示前后各补一句。先跑audit.py复算A文档窗口应是第0到2句。

## 3. 为Haystack保留元数据

把句子作为Document写入DocumentStore，保留来源ID和分句顺序。若使用DocumentSplitter，核对安装版本实际生成的source_id/split_id字段。

## 4. 运行句窗Retriever

将A的命中句交给SentenceWindowRetriever，保存返回上下文和对应元数据。当前包作者窗口计算不冒称目标Retriever运行。

## 5. 单独验证开头与结尾

把命中移到第0句或末句，窗口应正常缩短而非补进另一文档。增加window_size时也不能跨source_id。

## 6. 追查引用是否仍对齐

答案引用应指向原命中或补回句子的真实来源位置。B文档封条说明不能出现在A的窗口里。

## 7. 交付窗口与原句对照

保留命中ID、窗口ID、内容和边界用例；不把扩充上下文说成重新训练embedding。未执行的SDK/模型部分在回执中单列。

## 官方依据

- Haystack 官方文档或源码：https://docs.haystack.deepset.ai/docs/sentencewindowretriever
