Skip to content

网页、代码与不可信内容 ​

网页的导航栏、页脚、推荐文章重复出现,会污染检索。正文抽取应保留标题、列表、代码块和链接目标;JavaScript渲染页面可能需要浏览器宿主,简单HTTP响应并不包含最终正文。URL抓取同时涉及重定向、内容类型、体积限制和访问边界,不能让模型任意读取内网地址。

代码比自然语言更依赖结构。按行数切开函数会丢参数或异常分支;Python的AST提供函数节点位置,但并不执行代码。下面用标准库解析两个函数及行范围:

python
import ast
source = 'def add(a, b):\n    return a + b\n\ndef fail():\n    raise ValueError("bad")\n'
tree = ast.parse(source)
items = []
for node in tree.body:
    if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
        items.append({'name':node.name,'start':node.lineno,'end':node.end_lineno,
                      'text':ast.get_source_segment(source,node)})
assert [x['name'] for x in items] == ['add','fail']
assert items[1]['start'] == 4
assert 'raise ValueError' in items[1]['text']
print([(x['name'],x['start'],x['end']) for x in items])

这里仅收集顶层函数;类方法、装饰器、嵌套函数和跨文件调用需要继续解析并记录所属关系。即使AST能解析,运行仍可能缺依赖或存在恶意副作用,所以摄取时不导入陌生仓库来“检查函数”。保留提交SHA、相对路径和行号,确保引用在后续修改后仍可定位。

清理不是信任升级 ​

把网页转成纯文本只能移除部分表现层,文字中的伪系统提示仍存在;代码注释也可能夹带指令。内容标签能帮助模型区分来源,但真正的边界在服务端:抓取器只读白名单范围、工具重新鉴权、敏感信息不送入模型。安全过滤要处理重定向后的地址,不能只检查初始URL。

网页身份通常需要规范URL与内容版本同时存在:去掉所有query可能合并两个不同页面;不去追踪参数又会重复摄取。依据站点语义制定规则,并保存原URL。动态抓取设置超时、最大页面与链接深度,失败记录状态,不把登录页作为知识正文发布。

练习 ​

把一个异步顶层函数追加到source,要求仍被收集。若要包含类方法,为什么仅遍历tree.body不够?

完成后查看本章答案。

下一章:元数据、幂等更新与删除传播。

用心记录每一步成长