[LLMD]中文开发:庖丁解牛-爬虫解剖,AI搜索引用的过程拆解 📅 发布时间:2026/8/27 15:38:31 👁 浏览次数: # [LLMD] [AI搜索引用系统 · 八步链路 v2.0] # [文件名]: [ai_search_pipeline_v2.md] # [版本]: [2.0] # [作者]: [熵增就是商的余数] # [描述]: [本文档将“AI搜索和引用”的完整过程定义为八个依次执行的筛选模块。] # [语言]: [中文语义代码 (Chinese Semantic Code)] # [核心理念]: [每一步都是筛选每一步都有通过条件。] # # [模块]: 系统配置与常量声明 # [系统配置] [系统名称]: [AI搜索引用筛选系统] [系统版本]: [2.0] [核心常量]: [八步链路] [抓取判定, 渲染解析, 分词提取, 向量映射, 候选索引, 语义检索, 概率重排, 生成输出] [筛选阶段划分]: - [阶段一]: [物理层筛选] → [抓取判定, 渲染解析] # 决定内容是否能被系统“看到” - [阶段二]: [语义层筛选] → [分词提取, 向量映射, 候选索引] # 决定内容是否能被系统“理解”和“存储” - [阶段三]: [决策层筛选] → [语义检索, 概率重排, 生成输出] # 决定内容是否能被系统“输出” [常量: 阈值定义] [SEMANTIC_SCORE_THRESHOLD]: [60] # 语义化评分低于此值触发结构警告 [VECTOR_QUALITY_THRESHOLD]: [0.03] # 语义密度低于此值触发内容稀疏警告 [RERANK_SCORE_THRESHOLD]: [0.7] # 重排得分低于此值不会被引用 [MAX_CHUNK_SIZE]: [512] # 分块最大字符数 [MAX_RETRIEVAL_CANDIDATES]: [50] # 检索阶段最大召回数 # # [模块]: 类型定义 # [类型: 文章对象 (Article)] [字段]: - [url]: [string] - [raw_html]: [string] - [title]: [string] - [author]: [string] - [publish_date]: [date] - [html_structure]: { has_h1: bool, has_h2: bool, has_article: bool, has_table: bool } - [content]: [string] - [chunks]: [list[string]] - [vectors]: [list[vector]] - [is_indexed]: [bool] [状态]: - [待处理] - [已抓取] - [已渲染] - [已分块] - [已向量] - [已索引] [类型: 引用决策 (CitationDecision)] [字段]: - [article]: [Article] - [candidate_blocks]: [list[Block]] - [final_score]: [float] - [is_cited]: [bool] - [decision_reason]: [string] - [execution_log]: [list[LogEntry]] # # [模块一]: 抓取判定 # [函数: 抓取判定] [四字标识]: [抓取判定] [输入]: [(目标URL, 目标平台)] [输出]: [(抓取结果, 状态码)] [前置条件]: 文章已发布URL可公开访问 [执行逻辑]: // 核心问题: 爬虫能找到这篇文章吗 [尝试]: 发送HTTP请求获取状态码 [如果] [状态码 200]: [如果] [目标平台 今日头条]: // 头条使用SPA内容在RENDER_DATA中 [系统日志]: [警告目标平台为SPA架构后续渲染可能失败] [返回]: { 结果: 成功, 状态码: 200, raw_html: response.body } [否则]: [返回]: { 结果: 失败, 状态码: status_code, 原因: URL不可达或robots.txt限制 } [判断依据]: HTTP状态码、平台架构类型 [决策分支]: - [如果] [结果 成功] → [进入模块二渲染解析] - [如果] [结果 失败] → [终止流程 → [输出诊断]][文章未被AI爬虫发现] [系统日志]: [抓取判定完成[状态][成功/失败][耗时][N]ms] # # [模块二]: 渲染解析 # [函数: 渲染解析] [四字标识]: [渲染解析] [输入]: [(raw_html: string, 平台: string)] [输出]: [(解析结果, 语义结构报告)] [前置条件]: 模块一已成功获取raw_html [执行逻辑]: // 核心问题: 爬虫能读取这篇文章的内容吗 [如果] [平台 CSDN]: // CSDN使用SSR内容直接在HTML中 [执行]: [提取 article 内的所有文本] [执行]: [检测 h1, h2, h3 层级] [返回]: { 结果: 可读, content: extracted_text, structure: h_tags } [如果] [平台 今日头条]: // 头条使用SPA内容在RENDER_DATA的JSON中 [如果] [爬虫 无JS执行能力]: [返回]: { 结果: 失败, 原因: SPA架构无JS执行能力 } [否则]: [执行]: [解析RENDER_DATA中的JSON] [返回]: { 结果: 可读, content: json_content, structure: 无标签 } [判断依据]: 平台渲染方式、爬虫JS执行能力 [决策分支]: - [如果] [结果 可读] → [进入模块三分词提取] - [如果] [结果 失败] → [终止流程 → 输出诊断]文章内容无法被爬虫读取 [系统日志]: [渲染解析完成[可读性][是/否][标题层级][有/无]] # # [模块三]: 分词提取 # [函数: 分词提取] [四字标识]: [分词提取] [输入]: [(content: string)] [输出]: [(分块列表, 块数, 语义结构评分)] [前置条件]: 模块二已成功提取可读内容 [执行逻辑]: // 核心问题: 内容能被拆分为语义块吗 [如果] [content长度 0]: [返回]: { 结果: 失败, 原因: 内容为空 } [执行]: [按段落边界切分 → 获得段落列表] [对于] [每个段落 在 段落列表]: [如果] [段落长度 MAX_CHUNK_SIZE]: [执行]: [按句子边界二次切分 → 获得子句列表] [将子句列表合并入分块列表] // 语义结构评分 [计算]: [semantic_score 0] [如果] [检测到H1: semantic_score 20] [如果] [检测到H2: semantic_score 15] [如果] [检测到H3: semantic_score 10] [如果] [检测到表格: semantic_score 10] [如果] [检测到列表: semantic_score 5] [返回]: { [结果]: [成功], [chunks]: [分块列表], [chunk_count]: [len(分块列表)], [semantic_score]: semantic_score, [诊断]: [语义清晰度][高/中/低] } [判断依据]: 内容长度、段落边界、标题层级 [决策分支]: - [如果] [semantic_score SEMANTIC_SCORE_THRESHOLD → 触发警告][内容结构可读性低向量化可能失真] - [如果] [chunk_count 0 → 终止流程 → 输出诊断][无法切分有效语义块] - [否则] → [进入模块四向量映射] [系统日志]: [分词提取完成生成 [N] 个语义块[语义评分][N]/100] # # [模块四]: 向量映射 # [函数: 向量映射] [四字标识]: [向量映射] [输入]: [(chunks: list[string])] [输出]: [(向量列表, 向量质量报告)] [前置条件]: 模块三已成功生成分块列表 [执行逻辑]: // 核心问题: 语义被保留为向量了吗 [对于] [每个chunk 在 chunks]: [执行]: [调用Embedding模型 → 生成vector] [存储]: [(chunk, vector) 对] // 向量质量评估 [对于] [每个chunk 在 chunks]: [计算]: [语义密度 核心术语数 / 总字数] [计算]: [金句系数 可独立引用句子数 / 总句子数] [记录]: [质量得分 语义密度 * 0.5 金句系数 * 0.5] [返回]: { [结果]: [成功], [vectors]: [向量列表], [quality_report]: { [平均语义密度]: [avg_semantic_density], [平均金句系数]: [avg_quote_factor], [警告列表]: [质量低于阈值的chunk索引] } } [判断依据]: Embedding模型响应、语义密度、金句系数 [决策分支]: - [如果] [向量列表为空 → 终止流程 → 输出诊断]向量映射失败] - [如果] [平均语义密度 VECTOR_QUALITY_THRESHOLD → 触发警告]内容语义稀疏检索时可能难以匹配] - [否则] → [进入模块五候选索引] [系统日志]: [向量映射完成生成 [N] 个向量[平均语义密度][N]] # # [模块五]: 候选索引 # [函数: 候选索引] [四字标识]: [候选索引] [输入]: [(向量列表, 元数据: {url, title, author, publish_date})] [输出]: [(索引状态, 候选ID)] [前置条件]: 模块四已成功生成向量列表 [执行逻辑]: // 核心问题: 向量被存入索引库了吗 [执行]: [连接向量数据库] [对于] [每个向量 在 向量列表]: [执行]: [写入索引库关联元数据] [记录]: [候选ID 写入返回的ID] [如果] [所有写入成功]: [返回]: { [结果]: [成功], [candidate_id]: [candidate_id], [indexed_count]: [len(向量列表)], [状态]: [已纳入候选库可被检索召回] } [否则]: [返回]: { [结果]: [部分失败], [failed_count]: [失败数], [原因]: [[网络超时/存储空间不足/权限错误]] } [判断依据]: 数据库写入状态、元数据完整性 [决策分支]: - [如果] [写入失败率 30% → 终止流程 → 输出诊断][索引建立失败内容无法被检索] - [如果] [元数据不完整 → 触发警告][元数据缺失将影响后续重排权重] - [否则] → [进入模块六语义检索] [系统日志]: [候选索引完成已写入 [N] 个向量[候选ID][N]] # # [模块六]: 语义检索 # [函数: 语义检索] [四字标识]: [语义检索] [输入]: [(用户查询文本, 候选索引库)] [输出]: [(召回候选块列表, 召回数量)] [前置条件]: 模块五已成功建立候选索引 [执行逻辑]: // 核心问题: 用户提问时能召回到吗 [执行]: [将用户查询文本向量化] → [query_vector] [执行]: [在索引库中执行相似度搜索] → [返回][Top K] [(KMAX_RETRIEVAL_CANDIDATES)] [对于] [每个召回结果]: [记录]: [相似度得分] [如果] [召回数量 0]: [返回]: { 结果: 失败, 召回数: 0, 原因: 无语义匹配内容 } [返回]: { [结果]: [成功], [candidates]: [召回结果列表], [recall_count]: [len(召回结果)], [平均相似度]: [avg_similarity] } [判断依据]: 向量相似度计算、索引库查询响应 [决策分支]: - [如果] [召回数量 0 → 终止流程 → 输出诊断][文章未被检索召回未进入AI的候选视野] - [如果] [平均相似度 0.5 → 触发警告][召回质量偏低可能不相关] - [否则] → [进入模块七概率重排] [系统日志]: [语义检索完成召回 [N] 个候选块平均相似度[N]] # # [模块七]: 概率重排 # [函数: 概率重排] [四字标识]: [概率重排] [输入]: [(召回候选块列表, 用户查询)] [输出]: [(重排结果列表, 重排得分)] [前置条件]: 模块六已成功召回候选块 [执行逻辑]: // 核心问题: 候选块排在第几位 [对于] [每个候选块 在 召回候选块列表]: [计算]: [语义匹配分 向量相似度 * 0.5] [计算]: [来源权重分 来源域名权重 * 0.3] - [CSDN/知乎/技术社区]: [0.9] - [普通个人博客]: [0.5] - [未知来源]: [0.2] [计算]: [新鲜度分] [发布时间因子 * 0.1] - [最近30天]: [0.9] - [最近90天]: [0.6] - [超过1年]: [0.2] [计算]: [权威性分] [作者权威性 * 0.1] - [有认证/有简介]: [0.8] - [匿名]: [0.2] [最终得分] [语义匹配分] [来源权重分] [新鲜度分] [权威性分] [排序]: [按最终得分 降序排列] [截断]: [取前3名] [返回]: { [结果]: [成功], [ranked_list]: [排序后列表], [top_score]: [最高得分], [诊断]: [排名第 [N] 位得分 [N]] } [判断依据]: 重排算法、权重分配 [决策分支]: - [如果] [最高得分 RERANK_SCORE_THRESHOLD → 触发警告][得分低于阈值可能不会被引用] - [如果] [排名 3 → 即使召回了也不在最终输出范围内] - [否则] → [进入模块八生成输出] [系统日志]: [概率重排完成最高得分[N]排名第 [N] 位] # # [模块八]: 生成输出 # [函数: 生成输出] [四字标识]: [生成输出] [输入]: [(重排结果列表, 用户查询)] [输出]: [(引用决策, 最终答案)] [前置条件]: 模块七已成功生成重排结果 [执行逻辑]: // 核心问题: AI会用你吗 [选择]: [top_1 重排结果列表[0]] [如果] [top_1.最终得分 RERANK_SCORE_THRESHOLD]: [执行]: [将top_1的内容块作为参考材料输入LLM] [执行]: [LLM生成最终回答并附上引用来源] [返回]: { [结果]: [已引用], [is_cited]: [True], [citation_source]: [top_1.文章标题], [citation_url]: [top_1.URL], [final_answer]: [generated_text], [引用理由]: [语义匹配度高来源可信权重达标] } [否则]: [返回]: { [结果]: [未引用], [is_cited]: [False], [原因]: [重排得分低于阈值], [诊断摘要]: [[可能原因][语义密度不足/来源权重低/发布时间过旧]] } [判断依据]: 重排得分、LLM生成响应 [决策分支]: - [如果] [is_cited True → 输出][文章已被AI引用] - [如果] [is_cited False → 输出][文章未被AI引用] [系统日志]: [[生成输出完成][引用决策][已引用/未引用]] # # [模块]: 主执行流程 # [执行: 主流程] [输入]: [(URL, 用户查询)] [输出]: [(完整决策报告)] [状态变量]: [pipeline_status] [运行中] [执行记录]: [log []] [步骤一]: [抓取判定] → [记录状态到log] [步骤二]: [渲染解析] → [记录状态到log] [步骤三]: [分词提取] → [记录状态到log] [步骤四]: [向量映射] → [记录状态到log] [步骤五]: [候选索引] → [记录状态到log] [步骤六]: [语义检索] → [记录状态到log] [步骤七]: [概率重排] → [记录状态到log] [步骤八]: [生成输出] → [记录状态到log] 如果 [任一模块返回失败]: [终止流程] [输出]: [诊断报告(含失败模块、失败原因、修复建议)] [否则]: [输出]: [完整[引用决策报告]] # # [模块]: 诊断报告输出 # [输出: 诊断报告] [输入]: [(执行记录, 最终决策)] [输出]: [(结构化报告)] [模板]: ## AI搜索引用诊断报告 [**目标URL**]: [{url}] [**查询文本**]: [{query}] --- ### [模块一]抓取判定 - [状态][{成功/失败}] - [诊断][{爬虫是否找到}] - [依据][{状态码}] ### [模块二]渲染解析 - [状态][{成功/失败}] - [诊断][{内容是否可读}] - [依据][{平台架构/JS依赖}] ### [模块三]分词提取 - [状态][{成功/失败}] - [分块数量][{N}] - [语义评分][{N}/100] - [诊断][{结构清晰度}] - [依据][{H1/H2检测}] ### [模块四]向量映射 - [状态][{成功/失败}] - [向量数量][{N}] - [语义密度][{N}] - [金句系数][{N}] - [诊断][{内容稠密度}] ### [模块五]候选索引 - [状态][{成功/失败}] - [候选ID][{N}] - [索引数][{N}] - [诊断][{是否进入候选库}] ### [模块六]语义检索 - [状态][{成功/失败}] - [召回数量][{N}] - [平均相似度][{N}] - [诊断][{是否被召回}] ### [模块七]概率重排 - [状态][{成功/失败}] - [排名][{N}] - [最终得分][{N}] - [诊断][{是否达到阈值}] ### [模块八]生成输出 - [状态][{已引用/未引用}] - [引用来源][{url}] - [诊断摘要][{原因分析}] --- [**卡点诊断**] 本文章在[第N模块]被拦截。[拦截原因][原因]。 [**修复建议**] - [具体建议1] - [具体建议2] [**生成时间**][{timestamp}] [**报告版本**][v2.0] # # [模块]: 执行示例 # [执行示例: 场景一] [输入]: { [URL]: [https://blog.csdn.net/example/article/details/12345], [平台]: [CSDN], [HTML]: [含H1/H2无JS依赖], [内容]: [技术文章含3个核心观点金句密度低], [查询]: [为什么我的文章AI看不见] } [模块一(抓取判定)]: [{ 状态: 成功, 状态码: 200 }] [模块二(渲染解析)]: [{ 状态: 可读, 结构: 有H1/H2 }] [模块三(分词提取)]: [{ 分块数: 6, 语义评分: 75 }] [模块四(向量映射)]: [{ 语义密度: 0.025, 金句系数: 0.02 }] [模块五(候选索引)]:[ { 状态: 成功, 候选ID: cand_12345 }] [模块六(语义检索)]: [{ 召回数: 12, 平均相似度: 0.62 }] [模块七(概率重排)]: [{ 排名: 4, 得分: 0.65 }] [模块八(生成输出)]: [{ 结果: 未引用, 原因: 排名4低于前3阈值 }] [卡点诊断]: [第7模块概率重排被拦截]。[得分0.65 阈值0.7]。 [修复建议]: [增加金句密度当前0.02 → 目标0.05]、[完善作者简介提升权威性分] # # [编译检查] # [编译检查] - [所有八个模块已定义][是] - [所有模块函数名为四字][是] - [每个模块含状态/判断/依据/决策][是] - [主执行流程已配置][是] - [诊断报告输出已配置][是] - [错误处理已配置][是] [编译状态]: [成功] [系统就绪]: [True] [版本]: [v2.0] # # [文件结束 (EOF)] #