# CLAUDE.md ## 项目概述 这是一个基于LLM的智能搜索系统,用于小红书内容搜索场景。系统通过多阶段处理流程(7个步骤),从原始特征出发,自动生成、评估和执行搜索任务。核心功能包括特征匹配、关联分析、智能搜索词生成、并发搜索执行、LLM评估、深度解构和相似度分析。 ## 概念定义 ### 核心术语 - **选题点**:帖子中灵感点列表下的名称、目的点列表下的名称、关键点列表下的名称 - **人设特征/分类**:作者多个帖子的聚合结果,在输入文件"匹配人设结果"结构下,命名是"人设特征名称",相似度得分是指这些选题点和人设各个特征点的匹配度 - **候选词**:相似度 ≥ 0.8 的��设特征名称,或符合条件的帖子点名称 - **Base Word**:中心词,用于组织和生成搜索词的基础词汇 - **完全匹配**:LLM评估得分 ≥ 0.8 的搜索结果 ### 维度分类 - **灵感点**:全新内容、共性差异、共性内容(实质/形式/意图) - **目的点**:用户目的和意图 - **关键点**:关键特征和要素 ## 数据流程与结构 ### 流程概览 ``` 输入: how.json ↓ 步骤1: 特征筛选 → filtered_features.json ↓ 步骤2: 候选词提取 → candidate_words.json ↓ 步骤3: 搜索词生成(LLM) → search_queries_evaluated.json ↓ 步骤4: 执行搜索(小红书API) → search_results.json ↓ 步骤5: 结果评估(LLM两层过滤) → evaluated_results.json ↓ 步骤6: 深度解构(可选) → deep_analysis_results.json ↓ 步骤7: 相似度分析(可选) → similarity_analysis_results.json ↓ 可视化: HTML交互式界面 ``` ### 输入数据结构: how.json **位置**: `input/posts/{post_id}_how.json` **核心字段**: ```json { "帖子id": "690d977d0000000007036331", "帖子详情": { "link": "https://www.xiaohongshu.com/explore/...", "title": "帖子标题", "body_text": "帖子正文", "images": ["图片URL1", "图片URL2"], "like_count": 7428, "collect_count": 368, "channel_account_name": "作者名称" }, "解构结果": { "灵感点列表": [ { "ID": "inspiration_1", "名称": "猫咪考试祝福", "类型": "实质", "描述": "详细描述...", "置信度": 0.95, "匹配人设结果": [ { "人设特征名称": "鼓励式猫咪表情包", "人设特征层级": "灵感点", "特征类型": "标签", // 或 "分类" "特征分类": ["表情包素材", "日常生活演绎", "实质"], "相似度": 0.5339, "说明": "相似度计算说明..." } ] } ], "目的点列表": [...], "关键点列表": [...] } } ``` ### 步骤1输出: filtered_features.json **筛选条件**: 0.5 ≤ 最高相似度 < 0.8 ```json [ { "原始特征名称": "猫咪考试祝福", "来源层级": "灵感点列表", "权重": 1.0, "所属点名称": "猫咪考试祝福", "最高匹配信息": { "人设特征名称": "鼓励式猫咪表情包", "人设特征层级": "灵感点", "特征类型": "标签", "相似度": 0.5339, "是分类": false, "所属分类路径": "表情包素材/日常生活演绎/实质" }, "top3匹配信息": [...] } ] ``` ### 步骤2输出: candidate_words.json **候选词来源**: 1. 人设候选词: 相似度 ≥ 0.8 的人设特征 2. 帖子候选词: 点名称(该点最高相似度 ≥ 0.8) ```json [ { "原始特征名称": "猫咪考试祝福", "来源层级": "灵感点列表", "高相似度候选_按base_word": { "鼓励式猫咪表情包": [ { "候选词": "鼓励式猫咪表情包", "候选词类型": "persona", // 或 "post" "相似度": 0.85, "特征类型": "标签", "人设特征层级": "灵感点", "来源层级": "persona", "来源路径": "表情包素材/日常生活演绎/实质", "来源原始特征": "猫咪考试祝福" } ] } } ] ``` ### 步骤3输出: search_queries_evaluated.json **生成方式**: LLM基于中心词(base_word)和候选词生成搜索词 ```json [ { "原始特征名称": "猫咪考试祝福", "组合评估结果_分组": [ { "base_word": "鼓励式猫咪表情包", "base_word_similarity": 0.5339, "base_word_info": {...}, "top10_searches": [ { "search_word": "鼓励式猫咪表情包 考试祝福", "score": 0.92, "reasoning": "组合词很好地结合了中心词和候选词...", "source_word": "鼓励式猫咪表情包", "original_feature": "猫咪考试祝福" } ], "available_words": ["鼓励式猫咪表情包", "考试祝福", ...] } ] } ] ``` ### 步骤4输出: search_results.json **数据来源**: 小红书搜索API ```json [ { "原始特征名称": "猫咪考试祝福", "组合评估结果_分组": [ { "base_word": "鼓励式猫咪表情包", "top10_searches": [ { "search_word": "鼓励式猫咪表情包 考试祝福", "search_result": { "data": { "data": [ { "id": "note_id_123", "note_card": { "display_title": "考试祝福表情包", "type": "normal", // 或 "video" "image_list": ["http://..."], "user": { "nickname": "用户昵称", "user_id": "..." }, "interact_info": { "liked_count": "1234", "collected_count": "56" } } } ] } }, "search_metadata": { "searched_at": "2025-01-01T12:00:00", "status": "success", "note_count": 20 } } ] } ] } ] ``` ### 步骤5输出: evaluated_results.json **评估机制**: LLM两层过滤 1. 第一层: 过滤与Query无关的结果 2. 第二层: 评估与目标特征的匹配度 ```json [ { "原始特征名称": "猫咪考试祝福", "组合评估结果_分组": [ { "base_word": "鼓励式猫咪表情包", "top10_searches": [ { "search_word": "鼓励式猫咪表情包 考试祝福", "search_result": {...}, "evaluation_with_filter": { "total_notes": 20, "filtered_count": 5, // 第一层过滤: 与Query无关 "evaluated_count": 15, // 第二层评估数量 "statistics": { "完全匹配(0.8-1.0)": 8, "相似匹配(0.6-0.79)": 4, "弱相似(0.5-0.59)": 2, "无匹配(≤0.4)": 1 }, "notes_evaluation": [ { "note_index": 0, "note_id": "note_id_123", "Query相关性": "相关", // 或 "不相关" "Query相关性说明": "...", "综合得分": 0.85, "评分说明": "...", "关键匹配点": ["考试祝福", "猫咪表情包"] } ] } } ] } ] } ] ``` ### 步骤6输出: deep_analysis_results.json (可选) **触发条件**: 评估得分 ≥ min_score (默认0.8) 且评估类型为"完全匹配" ```json { "metadata": { "stage": "deconstruction", "post_id": "690d977d0000000007036331", "total_matched_notes": 50, "processed_notes": 45, "success_count": 40, "min_score_threshold": 0.8, "created_at": "2025-01-01T12:00:00" }, "results": [ { "note_id": "note_id_123", "search_word": "鼓励式猫咪表情包 考试祝福", "original_feature": "猫咪考试祝福", "evaluation_score": 0.85, "evaluation_type": "完全匹配", "key_matching_points": ["考试祝福", "猫咪表情包"], "inspiration_features": [ { "feature_name": "考试祝福主题", "dimension": "灵感点-全新内容", "dimension_detail": "实质", "weight": 0.8, "source_index": 0, "source_candidate_number": 1 } ], "purpose_features": [...], "key_point_features": [...], "api_response": { "result": { "data": { "三点解构": { "灵感点": { "全新内容": [...], "共性差异": [...], "共性内容": [...] }, "目的点": {...}, "关键点": {...} } } } } } ] } ``` ### 步骤7输出: similarity_analysis_results.json (可选) **计算公式**: - 混合相似度 = weight_embedding × embedding_score + weight_semantic × semantic_score - 综合得分P = Σ(评估分 × 最高相似度) / 总帖子数 ```json { "metadata": { "stage": "similarity_analysis", "weight_embedding": 0.5, "weight_semantic": 0.5, "min_similarity": 0.0, "created_at": "2025-01-01T12:00:00" }, "results": [ { "note_id": "note_id_123", "original_feature": "猫咪考试祝福", "features_similarity": [ { "feature_name": "考试祝福主题", "dimension": "灵感点-全新内容", "dimension_detail": "实质", "weight": 0.8, "similarity_score": 0.75, "similarity_breakdown": { "embedding_score": 0.80, // 向量模型 "semantic_score": 0.70, // LLM模型 "weighted_score": 0.75 // 加权平均 }, "original_feature": "猫咪考试祝福" } ], "statistics": { "total_features": 5, "avg_similarity": 0.72, "max_similarity": 0.85, "min_similarity": 0.60 } } ], "综合得分P": 0.78 // 可选,需要启用 calculate_comprehensive_score } ``` ## 项目架构 ### 目录结构 ``` optimization/ ├── lib/ # 核心功能库 │ ├── client.py # API客户端 │ ├── data_loader.py # 数据加载 │ ├── match_analyzer.py # 匹配分析 │ ├── relation_analyzer.py # 关联分析 │ ├── semantic_similarity.py # 语义相似度 │ ├── hybrid_similarity.py # 混合相似度(向量+LLM) │ └── utils.py # 工具函数 ├── src/ # 主要源代码 │ ├── pipeline/ # 流程控制 │ ├── analyzers/ # 分析器(解构/相似度) │ ├── evaluators/ # 评估器(LLM) │ ├── clients/ # API客户端 │ └── visualizers/ # 可视化生成器 ├── input/posts/ # 输入数据 (*_how.json) ├── output_v2/ # 输出结果 ├── visualization/ # 可视化HTML文件 ├── cache/search/ # 搜索缓存 └── logs/ # 日志文件 ``` ### 核心模块职责 **数据处理流程**: 1. `EnhancedSearchV2` (src/pipeline/feature_search_pipeline.py) - 主流程控制器 2. `LLMEvaluator` (src/evaluators/llm_evaluator.py) - 搜索词生成和结果评估 3. `PostDeconstructionAnalyzer` (src/analyzers/) - 深度解构分析 4. `SimilarityAnalyzer` (src/analyzers/) - 相似度分析 5. `XiaohongshuSearch` (src/clients/) - 小红书搜索API客户端 6. `OpenRouterClient` (src/clients/) - LLM API客户端 **可视化模块**: 1. `deconstruction_visualizer.py` - 整合可视化(搜索+评估+解构+相似度) ## 运行模式 ### 基础模式 (步骤1-4) ```bash python3 main.py --mode basic ``` ### 标准模式 (步骤1-5,默认) ```bash python3 main.py --mode standard ``` ### 完整模式 (步骤1-7) ```bash python3 main.py --mode full ``` ### 自定义控制 ```bash python3 main.py \ --enable-evaluation \ --enable-deep-analysis \ --deep-analysis-min-score 0.9 \ --enable-similarity \ --similarity-weight-embedding 0.6 ``` ## 关键配置参数 ### 搜索相关 - `top_n`: 每个特征取评分最高的N个搜索词 (默认10) - `max_total_searches`: 全局最大搜索次数 - `max_searches_per_feature`: 每个特征的最大搜索次数 - `search_max_workers`: 搜索并发数 (默认3) ### 评估相关 - `enable_evaluation`: 是否启用结果评估 - `evaluation_max_workers`: 评估并发数 (默认10) - `evaluation_max_notes_per_query`: 每个搜索最多评估的帖子数 (默认20) ### 解构相关 - `enable_deep_analysis`: 是否启用深度解构 - `deep_analysis_min_score`: 最低分数阈值 (默认0.8) - `deep_analysis_max_workers`: 解构并发数 (默认5) - `deep_analysis_api_url`: 解构API地址 ### 相似度相关 - `enable_similarity`: 是否启用相似度分析 - `similarity_weight_embedding`: 向量模型权重 (默认0.5) - `similarity_weight_semantic`: LLM模型权重 (默认0.5) - `similarity_min_similarity`: 最小相似度阈值 (默认0.0) - `calculate_comprehensive_score`: 是否计算综合得分P ## 严格约束 ### 代码修改规范 1. **Prompt保护**: 重构或修改功能代码过程中不要修改任何的原始prompt,如需修改,必须确认授权 2. **可视化更新**: 如果涉及可视化的修改,修改完后直接open打开验证效果 3. **数据结构保持**: 修改代码时必须保持各环节的数据结构兼容性,避免破坏数据流转 4. **并发控制**: 注意并发数限制,避免API限流 ### 调试指南 - 应用日志: `logs/app.log` - 中间结果: `output_v2/*.json` (各步骤的输出文件) - 缓存位置: `cache/search/*.json` (搜索结果缓存) - 可视化输出: `visualization/*.html` ### 常见问题 1. **API超时**: 检查网络和API配置,调整重试策略 2. **相似度计算异常**: 检查embedding模型可用性 3. **LLM评估失败**: 检查OpenRouter API密钥和模型可用性 4. **搜索结果为空**: 检查搜索词是否合理,API是否正常 5. **解构失败**: 检查解构API地址和帖子ID有效性 ## 数据访问模式 ### 可视化数据访问路径 **搜索结果可视化**: - 统计数据: 遍历所有 `组合评估结果_分组` → `top10_searches` → `evaluation_with_filter` - 左侧导航: `data[featureIdx]['组合评估结果_分组'][groupIdx]['top10_searches']` - 右侧结果: `search_result.data.data[noteIdx]` - 评估详情: `noteEvaluations["featureIdx-groupIdx-swIdx-noteIdx"]` **解构结果可视化**: - 评估数据: `evaluated_data[featureIdx]['组合评估结果_分组'][groupIdx]['top10_searches'][swIdx]` - 解构数据: `deconstruction_mapping[note_id]` (通过note_id关联) - 相似度数据: `similarity_mapping[note_id]` (通过note_id关联) - 特征信息: `all_features[feature_name]` (从how.json提取) ### 数据关联关系 - 主键标识符: `note_id` (帖子唯一ID) - 评估结果 → 解构结果: 通过 `note_id` 匹配 - 评估结果 → 相似度结果: 通过 `note_id` 匹配 - How文件 → 评估结果: 通过 `原始特征名称` 匹配