Commit 9ad889860cab870d1373f6e451162352e3829f48
1 parent
46f8dd12
up`
Showing
6 changed files
with
471 additions
and
9 deletions
Show diff stats
README_prompts.md
| ... | ... | @@ -13,3 +13,23 @@ graphRAG在商品搜索中如何使用?我想将他用于,对商品的模糊 |
| 13 | 13 | |
| 14 | 14 | |
| 15 | 15 | 2. 我希望参考analyze_image_style加上一个动态的图片分析,调用两轮大模型,第一轮的目的是让大模型根据对话历史分析要提取哪些信息,加载背景(时尚购物),加载对话历史,调用语言大模型,要求根据对话意图了解需要从图片中了解哪些信息,注意,图片中的具体内容、具体的产品、颜色、分隔、主要特性等等时尚领域的描述都要加上,根据对话上下文在这些通用的提取内容上加上特别要关注的内容,第二轮则是根据这些提取的需求调用多模态大模型。可以配置化,对于图片内容的分析调用analyze_image_style还是动态的分析,暂时使用analyze_image_style。 |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | +系统提示词,要指导,根据搜索结果判断可以直接引用搜索结果呈现给用户还是需要修改query重新规划搜索。搜索也应该是一整套方案,可以发起多个query。 | |
| 28 | +搜索工具层面,对于搜索结果要调用LLM判断,分析top20条结果,为每条结果打标签,分三种层级:完美匹配、部分匹配、不相关,最后给出top20的一个总体的判断。 | |
| 29 | +彻底替代 extract_products_from_response,引入结果仓库(Result Registry),用于存储SearchResult,为可呈现的“引用包/搜索结果块”。 | |
| 30 | +引用应该是嵌套在文本中,比如:我为你挑选了xxx(引用的搜索结果块 页面上将呈现query和结果列表),考虑到xxx,也挑选了(引用的搜索结果块2),接下来你可以:xxx | |
| 31 | + | |
| 32 | +以上纯属示例,表示搜索结果块是可以在输出文本中被引用的。并且,提示词也要通用,不要为我的个例所影响,要考虑如何做到通用,适合各种电商品类。 | |
| 33 | + | |
| 34 | +请深度思考如何让 最终 AI 消息 可以引用某次搜索的结果,而不是重新复述,并且废除extract_products_from_response这种方法。要规划一套健全的商品搜索结果的管理、和引用的方法。 | |
| 35 | + | ... | ... |
| ... | ... | @@ -33,10 +33,8 @@ st.set_page_config( |
| 33 | 33 | st.markdown( |
| 34 | 34 | """ |
| 35 | 35 | <style> |
| 36 | - /* Hide default Streamlit elements */ | |
| 37 | - #MainMenu {visibility: hidden;} | |
| 38 | - footer {visibility: hidden;} | |
| 39 | - header {visibility: hidden;} | |
| 36 | + /* Show default Streamlit elements (sidebar toggle, etc.) */ | |
| 37 | + /* #MainMenu, footer, header no longer hidden */ | |
| 40 | 38 | |
| 41 | 39 | /* Body and root container */ |
| 42 | 40 | .main .block-container { |
| ... | ... | @@ -505,7 +503,7 @@ def display_message(message: dict): |
| 505 | 503 | |
| 506 | 504 | # Create exactly 3 columns with equal width |
| 507 | 505 | cols = st.columns(3) |
| 508 | - for j, product in enumerate(products[:3]): # Ensure max 3 | |
| 506 | + for j, product in enumerate(products[:9]): # Ensure max 3 | |
| 509 | 507 | with cols[j]: |
| 510 | 508 | display_product_card(product) |
| 511 | 509 | else: | ... | ... |
app/tools/search_tools.py
| ... | ... | @@ -166,15 +166,12 @@ def search_products(query: str, limit: int = 5) -> str: |
| 166 | 166 | specs = product.get("specifications", []) |
| 167 | 167 | if specs: |
| 168 | 168 | color_spec = next( |
| 169 | - (s for s in specs if s.get("name") == "color"), | |
| 169 | + (s for s in specs if s.get("name").lower() == "color"), | |
| 170 | 170 | None, |
| 171 | 171 | ) |
| 172 | 172 | if color_spec: |
| 173 | 173 | output += f" Color: {color_spec.get('value', 'N/A')}\n" |
| 174 | 174 | |
| 175 | - if product.get("relevance_score") is not None: | |
| 176 | - output += f" Relevance: {product['relevance_score']:.2f}\n" | |
| 177 | - | |
| 178 | 175 | output += "\n" |
| 179 | 176 | |
| 180 | 177 | return output.strip() | ... | ... |
| ... | ... | @@ -0,0 +1,196 @@ |
| 1 | +# OpenClaw 源码技术方案解读 | |
| 2 | + | |
| 3 | +> 面向源码阅读者的技术剖析:从 CLI 入口、Gateway 控制面、渠道插件、路由与会话、Agent 执行到媒体与安全。 | |
| 4 | + | |
| 5 | +## 1. 总体架构(控制面 + 执行面) | |
| 6 | + | |
| 7 | +OpenClaw 把系统拆成两层: | |
| 8 | + | |
| 9 | +- **Gateway 控制面**:统一承载 WebSocket/HTTP、方法分发、客户端连接、鉴权、配置热重载、渠道生命周期。 | |
| 10 | +- **Agent/Channel 执行面**:负责模型调用、会话持久化、消息路由、跨渠道发送、媒体处理、插件扩展。 | |
| 11 | + | |
| 12 | +这种设计把“系统连接与治理”与“具体业务执行”分离,便于在不改动主干的前提下持续增加新渠道和新能力。 | |
| 13 | + | |
| 14 | +## 2. CLI 启动链:轻入口 + 按需加载命令 | |
| 15 | + | |
| 16 | +`src/index.ts` 作为统一入口,先做运行时守护(环境变量归一化、运行时版本检查、全局异常处理),再交给 Commander 程序对象解析命令。核心思路是:**先把运行环境稳定,再执行命令逻辑**。 | |
| 17 | + | |
| 18 | +CLI 命令注册使用“延迟加载”策略:`registerCoreCliCommands` 会先挂占位命令,在真正执行时动态 `import` 对应模块并二次解析参数。这显著降低了冷启动成本,也能避免一次性加载全部命令依赖。 | |
| 19 | + | |
| 20 | +## 3. Gateway 服务器:集中式编排器 | |
| 21 | + | |
| 22 | +`startGatewayServer` 是系统级编排入口,启动前会串行处理: | |
| 23 | + | |
| 24 | +1. 读取并迁移历史配置; | |
| 25 | +2. 校验配置合法性并补齐启动鉴权; | |
| 26 | +3. 自动启用满足条件的插件; | |
| 27 | +4. 组装基础能力 + 渠道插件能力形成完整方法集; | |
| 28 | +5. 构建运行时状态(鉴权、限流、心跳、节点、插件、通道、发现服务等); | |
| 29 | +6. 挂载 WS 处理器并对外广播统一事件。 | |
| 30 | + | |
| 31 | +这让 Gateway 成为“单一控制平面”:无论来自 CLI、WebChat、桌面端还是移动端,最终都走同一套 RPC/Event 协议。 | |
| 32 | + | |
| 33 | +## 4. 方法协议:基础方法 + 插件方法拼接 | |
| 34 | + | |
| 35 | +`server-methods-list.ts` 维护内置方法集合(如 `agent`、`send`、`channels.status`、`node.invoke`、`chat.send`),再合并渠道插件额外暴露的方法,形成完整 capability 列表。 | |
| 36 | + | |
| 37 | +这相当于“内核 API + 扩展 API”模型:内核保持稳定,插件在边界内扩展。 | |
| 38 | + | |
| 39 | +## 5. 渠道插件体系:注册表驱动 | |
| 40 | + | |
| 41 | +渠道并不是硬编码在主流程中,而是通过插件注册表统一管理。`listChannelPlugins` 从活动插件注册表读取渠道定义并排序输出;Gateway 在启动时基于这些定义动态创建日志上下文、运行时环境与方法集合。 | |
| 42 | + | |
| 43 | +这意味着新增渠道的关键不是修改核心 switch-case,而是实现符合接口的插件并注册,整体可维护性更好。 | |
| 44 | + | |
| 45 | +## 6. 渠道生命周期管理:可观测 + 自恢复 | |
| 46 | + | |
| 47 | +`createChannelManager` 负责渠道账户的启动/停止/状态维护,具备: | |
| 48 | + | |
| 49 | +- 多账户粒度运行时快照; | |
| 50 | +- 启动前配置完整性检查; | |
| 51 | +- 崩溃后指数退避重启; | |
| 52 | +- 手动停用后禁止自动拉起; | |
| 53 | +- 统一暴露运行状态给上层 health/status。 | |
| 54 | + | |
| 55 | +这套机制让各渠道实现从“业务代码”中抽离,收敛到统一的运维语义。 | |
| 56 | + | |
| 57 | +## 7. 路由与会话键:多维绑定解析 | |
| 58 | + | |
| 59 | +`resolve-route.ts` 把输入上下文(channel/account/peer/guild/team/roles)映射到目标 agent 与 sessionKey。其本质是一套优先级匹配规则: | |
| 60 | + | |
| 61 | +- peer 精确匹配; | |
| 62 | +- parent peer 继承; | |
| 63 | +- guild + roles; | |
| 64 | +- guild/team/account/channel; | |
| 65 | +- 默认 agent 回退。 | |
| 66 | + | |
| 67 | +并且它带有按 `channel+account` 的评估缓存,避免在高频消息场景重复解析绑定规则。 | |
| 68 | + | |
| 69 | +## 8. Agent 执行:Gateway 方法到模型调用 | |
| 70 | + | |
| 71 | +Gateway 侧 `agent` 方法会完成请求校验、幂等处理、附件规范化、会话键解析与重置语义,然后调用 `agentCommand` 执行一次 Agent turn。 | |
| 72 | + | |
| 73 | +`agentCommand` 再根据模型/Provider/思考等级/会话状态选择执行路径: | |
| 74 | + | |
| 75 | +- CLI Provider 走 `runCliAgent`; | |
| 76 | +- 内嵌执行走 `runEmbeddedPiAgent`; | |
| 77 | +- 并支持模型回退、会话更新、事件发射、结果投递。 | |
| 78 | + | |
| 79 | +因此 OpenClaw 的 Agent 调用并不是“直接请求模型”,而是带有会话与路由语义的受控执行流水线。 | |
| 80 | + | |
| 81 | +## 9. Outbound 抽象:优先插件动作,回退核心发送 | |
| 82 | + | |
| 83 | +`outbound-send-service.ts` 体现了一个关键策略: | |
| 84 | + | |
| 85 | +1. 先尝试调用渠道插件动作(send/poll); | |
| 86 | +2. 插件未处理时回退到核心 `sendMessage/sendPoll`; | |
| 87 | +3. 在发送链路中支持中断信号、镜像写回会话、网关上下文。 | |
| 88 | + | |
| 89 | +这保证了不同渠道可做差异化实现,同时保留统一兜底路径。 | |
| 90 | + | |
| 91 | +## 10. 媒体管线:安全优先 | |
| 92 | + | |
| 93 | +`media/store.ts` 中可见明显的“安全默认”策略: | |
| 94 | + | |
| 95 | +- 限制协议仅 HTTP/HTTPS; | |
| 96 | +- 使用 SSRF 防护与主机名解析钉扎; | |
| 97 | +- 限制文件大小(默认 5MB); | |
| 98 | +- 临时目录权限收紧(700/600); | |
| 99 | +- 文件名净化与过期清理; | |
| 100 | +- 安全读取本地文件并映射错误类型。 | |
| 101 | + | |
| 102 | +这使媒体能力在可用性与安全性间取得平衡。 | |
| 103 | + | |
| 104 | +## 11. 配置系统:JSON5 + 兼容迁移 + 环境变量注入 | |
| 105 | + | |
| 106 | +`config/io.ts` 不是简单读写配置文件,而是完整的配置编排层: | |
| 107 | + | |
| 108 | +- 支持 JSON5; | |
| 109 | +- include/merge patch/env 引用替换; | |
| 110 | +- 默认值补全、路径归一化、版本迁移; | |
| 111 | +- 写入审计与备份轮转; | |
| 112 | +- 与插件 schema 联合校验。 | |
| 113 | + | |
| 114 | +这套机制让 OpenClaw 能在长期迭代中保持配置向后兼容。 | |
| 115 | + | |
| 116 | +## 12. 具体案例:从用户一句话到系统动作链 | |
| 117 | + | |
| 118 | +下面用两个典型请求,说明 OpenClaw 在真实场景里会触发什么动作。 | |
| 119 | + | |
| 120 | +### 案例 A:"帮我在 GitHub 搜索 xx 相关项目,筛选能迁移到 xx 的方案,仔细阅读并讲技术方案和关键代码" | |
| 121 | + | |
| 122 | +这个需求不是一次普通问答,而是一条“检索 -> 过滤 -> 深读 -> 结构化输出”的多阶段流水线。典型动作链如下: | |
| 123 | + | |
| 124 | +1. **消息入站** | |
| 125 | + 用户消息通过 Telegram/Discord/WebChat 等渠道进入 Gateway;渠道插件先归一化消息、账户信息、线程信息,再转为统一 `agent` 请求。 | |
| 126 | +2. **会话与目标 agent 解析** | |
| 127 | + 路由层用 channel/account/peer/thread 上下文解析 `agentId + sessionKey`,把任务绑定到既有会话(避免每轮丢上下文)。 | |
| 128 | +3. **请求校验与幂等** | |
| 129 | + Gateway `agent` handler 校验参数、附件、渠道合法性和幂等键,然后把任务交给 `agentCommand`。 | |
| 130 | +4. **任务规划(Agent 内部)** | |
| 131 | + Agent 将原句拆成可执行子任务,例如: | |
| 132 | + - 关键词扩展(xx 的同义词、上下游术语); | |
| 133 | + - 候选项目召回(stars/更新时间/语言/许可证); | |
| 134 | + - 迁移可行性筛选维度(架构耦合度、依赖复杂度、部署形态、数据模型兼容性); | |
| 135 | + - 深读清单(README、docs、核心目录、关键 entrypoint)。 | |
| 136 | +5. **候选项目检索** | |
| 137 | + Agent 通过浏览器或 HTTP 工具抓取 GitHub 搜索页/项目页,得到候选仓库列表与基础元信息。 | |
| 138 | +6. **第一轮筛选(可迁移性粗筛)** | |
| 139 | + 基于显性信号先过滤: | |
| 140 | + - 是否活跃维护; | |
| 141 | + - 是否与目标技术栈接近; | |
| 142 | + - 是否有可运行示例与清晰模块边界; | |
| 143 | + - 许可证是否满足使用场景。 | |
| 144 | +7. **第二轮深读(代码级)** | |
| 145 | + 对入围项目进行“关键代码阅读”: | |
| 146 | + - 定位入口文件与启动链; | |
| 147 | + - 识别核心模块边界与数据流; | |
| 148 | + - 抽取关键实现片段(例如路由层、调度层、插件层、存储抽象层); | |
| 149 | + - 记录迁移风险(强绑定云服务、隐式全局状态、非标准构建流程)。 | |
| 150 | +8. **输出构建** | |
| 151 | + Agent 生成结构化结论: | |
| 152 | + - 项目对比表(适配度/迁移成本/风险); | |
| 153 | + - 每个项目的技术方案摘要; | |
| 154 | + - 关键代码位置与原因说明(为什么这段代码关键); | |
| 155 | + - 推荐优先级与迁移路径建议(PoC -> 灰度 -> 全量)。 | |
| 156 | +9. **结果发送与会话沉淀** | |
| 157 | + 结果经 outbound 发送到原渠道(插件优先、核心兜底),并写入会话 transcript。后续用户说“把第 2 个项目展开到模块级改造方案”时,可直接沿用当前上下文继续执行。 | |
| 158 | + | |
| 159 | +#### 这个案例在系统内触发的关键机制 | |
| 160 | + | |
| 161 | +- **Gateway 控制面**:统一承接请求、鉴权、方法分发。 | |
| 162 | +- **路由层**:保证请求进入正确 agent/session。 | |
| 163 | +- **Agent 执行层**:负责任务分解与工具编排。 | |
| 164 | +- **Outbound 层**:统一回传,不同渠道差异由插件吸收。 | |
| 165 | +- **会话存储层**:沉淀中间结论与最终报告,支撑多轮深挖。 | |
| 166 | + | |
| 167 | +### 案例 B:"在 Twitter 上搜集 xx 相关信息,写一篇调查报告" | |
| 168 | + | |
| 169 | +一个典型执行链如下: | |
| 170 | + | |
| 171 | +1. **请求入站与鉴权** | |
| 172 | + 用户请求到达 Gateway 后,先经过鉴权与方法白名单控制。 | |
| 173 | +2. **任务分解** | |
| 174 | + Agent 将任务拆成“检索关键词集合、时间窗口、可信账号优先级、去重规则、证据归档格式”。 | |
| 175 | +3. **数据采集** | |
| 176 | + 通过浏览器/HTTP 等工具抓取公开推文、线程、外链文章与引用关系,必要时抓页面快照做证据留存。 | |
| 177 | +4. **清洗与聚类** | |
| 178 | + 依据主题、立场、时间线、传播强度进行聚类,过滤明显噪声与重复转发。 | |
| 179 | +5. **报告生成** | |
| 180 | + 输出“事实层(发生了什么)+ 观点层(各方怎么说)+ 风险层(哪些结论证据不足)+ 建议层(下一步怎么验证)”。 | |
| 181 | +6. **多渠道投递** | |
| 182 | + 按当前会话策略发送到用户指定渠道;如果是群聊线程,还会带上 thread 信息以保持上下文连续。 | |
| 183 | + | |
| 184 | +### 两个案例背后的共性机制 | |
| 185 | + | |
| 186 | +- **同一控制面**:不管是 GitHub 调研还是 Twitter 调研,都是同一条 Gateway RPC/Event 主干。 | |
| 187 | +- **同一路由语义**:都通过 sessionKey/agentId 保证上下文连续,而不是每次“无状态回答”。 | |
| 188 | +- **同一执行模式**:都属于“规划 -> 工具调用 -> 归纳输出”的 agentic 工作流。 | |
| 189 | +- **同一发送抽象**:都走 outbound 统一接口,渠道差异由插件吸收。 | |
| 190 | +- **同一安全基线**:媒体下载、外链抓取、文件读写都受限于安全策略(协议、大小、路径、SSRF)。 | |
| 191 | + | |
| 192 | +## 13. 一句话总结 | |
| 193 | + | |
| 194 | +OpenClaw 的核心技术方案可以概括为: | |
| 195 | + | |
| 196 | +**“以 Gateway 为统一控制面,以插件与路由为扩展骨架,以 Agent 会话语义为执行核心,并在媒体/配置层默认内建安全与可运维能力。”** | ... | ... |
| ... | ... | @@ -0,0 +1,93 @@ |
| 1 | +# 一、基础层(商品基础标识信息) | |
| 2 | + | |
| 3 | +用于唯一标识商品及其基础分类信息,是所有结构化与检索能力的基础。 | |
| 4 | + | |
| 5 | +| English Field | 中文字段名 | 字段说明 | | |
| 6 | +| ------------- | ----- | ------------------------------------ | | |
| 7 | +| id | 商品ID | 商品的唯一标识符,用于系统索引、关联与去重 | | |
| 8 | +| title | 商品标题 | 商品原始标题文本,用于全文检索与语义理解 | | |
| 9 | +| title_cn | 中文标题 | 商品中文标题,用于中文搜索与展示 | | |
| 10 | +| category_path | 类目路径 | 商品所属标准类目层级,如“女装>连衣裙>碎花裙”,用于基础筛选与结构组织 | | |
| 11 | + | |
| 12 | +--- | |
| 13 | + | |
| 14 | +# 二、风格层(风格表达与审美定位) | |
| 15 | + | |
| 16 | +用于表达商品整体审美倾向与风格标签,是构建风格社区与模糊风格搜索的核心层。 | |
| 17 | + | |
| 18 | +| English Field | 中文字段名 | 字段说明 | | |
| 19 | +| --------------- | ----- | ------------------------------------ | | |
| 20 | +| style_primary | 主风格 | 商品最核心的风格类型,如清新、法式、极简、甜美等,用于风格聚合与概览生成 | | |
| 21 | +| style_secondary | 次风格 | 商品的补充风格标签,用于细分风格组合与多维交叉 | | |
| 22 | +| tags | 标签 | 运营或营销类标签,包含趋势词或活动词,不作为核心结构依据 | | |
| 23 | + | |
| 24 | +--- | |
| 25 | + | |
| 26 | +# 三、结构层(服装版型与剪裁结构) | |
| 27 | + | |
| 28 | +用于描述服装的物理结构与轮廓形态,是影响穿着效果与身材适配的核心维度。 | |
| 29 | + | |
| 30 | +| English Field | 中文字段名 | 字段说明 | | |
| 31 | +| ------------- | ------- | ------------------------------------- | | |
| 32 | +| silhouette | 版型 / 廓形 | 服装整体轮廓结构,如A字、H型、伞裙、直筒、修身等,决定整体线条与风格表达 | | |
| 33 | +| length | 长度 | 服装长度分类,如短款、中长款、长款、拖地等,影响视觉比例与适用场景 | | |
| 34 | +| neckline | 领型 | 领口形态,如圆领、V领、方领、一字肩等,影响风格与脸型修饰效果 | | |
| 35 | +| sleeve_type | 袖型 | 袖子结构类型,如无袖、短袖、泡泡袖、灯笼袖等,影响风格表达与季节属性 | | |
| 36 | + | |
| 37 | +--- | |
| 38 | + | |
| 39 | +# 四、材质层(面料成分与质感特征) | |
| 40 | + | |
| 41 | +用于描述服装的材质构成与触感视觉质感,是风格表达与穿着体验的重要来源。 | |
| 42 | + | |
| 43 | +| English Field | 中文字段名 | 字段说明 | | |
| 44 | +| -------------- | ----- | ---------------------------- | | |
| 45 | +| material | 材质 | 面料成分,如棉、麻、雪纺、聚酯等,体现服装基本材料属性 | | |
| 46 | +| fabric_texture | 面料质感 | 面料触感或视觉质感特征,如轻薄、垂坠、挺括、柔软、透气等 | | |
| 47 | + | |
| 48 | +--- | |
| 49 | + | |
| 50 | +# 五、视觉层(颜色与图案表现) | |
| 51 | + | |
| 52 | +用于描述商品的视觉呈现特征,是风格判断与模糊审美搜索的重要依据。 | |
| 53 | + | |
| 54 | +| English Field | 中文字段名 | 字段说明 | | |
| 55 | +| ------------- | ----- | ------------------------------- | | |
| 56 | +| main_color | 主色系 | 商品主要颜色类别,如白色、浅蓝、粉色等,用于基础视觉筛选 | | |
| 57 | +| color_tone | 色调风格 | 颜色整体倾向,如低饱和、莫兰迪、马卡龙、亮色系、深色系等 | | |
| 58 | +| pattern | 图案 | 图案类型,如纯色、碎花、条纹、格纹、波点等,影响风格与视觉层级 | | |
| 59 | + | |
| 60 | +--- | |
| 61 | + | |
| 62 | +# 六、功能层(穿着功能与修饰效果) | |
| 63 | + | |
| 64 | +用于表达服装的功能属性与身材修饰能力,是推荐解释与个性化匹配的重要依据。 | |
| 65 | + | |
| 66 | +| English Field | 中文字段名 | 字段说明 | | |
| 67 | +| ---------------------- | ----- | --------------------------- | | |
| 68 | +| features | 功能特性 | 功能性描述,如透气、抗皱、有弹力、防走光等 | | |
| 69 | +| body_flattering_points | 修饰效果 | 对身材的修饰优势,如遮胯、显腰线、拉长比例、显腿长等 | | |
| 70 | +| suitable_body_type | 适合体型 | 适合的体型类型,如梨形、苹果型、小个子、高个子、微胖等 | | |
| 71 | + | |
| 72 | +--- | |
| 73 | + | |
| 74 | +# 七、场景层(使用环境与人群定位) | |
| 75 | + | |
| 76 | +用于描述商品适用的使用情境与目标人群,是场景化推荐与风格细分的重要维度。 | |
| 77 | + | |
| 78 | +| English Field | 中文字段名 | 字段说明 | | |
| 79 | +| --------------- | ----- | --------------------- | | |
| 80 | +| usage_scene | 使用场景 | 适用场景,如通勤、约会、度假、校园、日常等 | | |
| 81 | +| season | 适用季节 | 适合穿着的季节,如春、夏、秋、冬 | | |
| 82 | +| target_audience | 目标人群 | 主要面向人群,如女性、学生、通勤人群等 | | |
| 83 | + | |
| 84 | +--- | |
| 85 | + | |
| 86 | +# 八、补充层(扩展与营销信息) | |
| 87 | + | |
| 88 | +用于承载未归类属性与营销性表达,不作为核心结构依据。 | |
| 89 | + | |
| 90 | +| English Field | 中文字段名 | 字段说明 | | |
| 91 | +| -------------- | ----- | --------------------- | | |
| 92 | +| key_attributes | 关键属性 | 未归类的补充结构特征,用于承载长尾属性信息 | | |
| 93 | +| selling_points | 卖点描述 | 商品营销性文案,用于增强展示与转化表达 | | ... | ... |
| ... | ... | @@ -0,0 +1,158 @@ |
| 1 | + | |
| 2 | +## 需求 | |
| 3 | +graphRAG在商品搜索中如何使用?我想将他用于,对商品的模糊查询。 | |
| 4 | +离线输出处理端: | |
| 5 | +我们的商品没有格式化的类别标签等字段,可以用大模型进行提取 风格 类别 标签 材质 功能特性 等,但是问题是:他们表达形式各异,如果要做成一个体系、做归一化,成本较高。 | |
| 6 | +在线端:用户的搜索可能是模糊搜索,比如,给我找找清新风格的裙子,那么通过关键词搜索是比较差的,基于graphrag的思想如果能够得到“清新”分隔的商品集合的一个概览,就很好,直到当前店铺的“清新”风格有哪些可供选择,有哪些重要的考虑点,再进一步匹配看有哪些适合我的。 | |
| 7 | +请帮我广泛的搜索有哪些相关的技术资料或者开源项目 | |
| 8 | + | |
| 9 | + | |
| 10 | +## GraphRAG 能解决什么(对齐你的痛点) | |
| 11 | + | |
| 12 | +你描述的关键不是“找到某条商品信息”,而是两类更难的需求: | |
| 13 | + | |
| 14 | +1. **概览型/全局型问题(Global query)** | |
| 15 | + “清新风格在这个店铺里大概有哪些类型?有哪些重要考虑点?有哪些代表款?” | |
| 16 | + 这类问题用纯向量检索/关键词检索很容易“只给一堆相似商品”,但缺少“总结 + 结构化概览”。GraphRAG 的强项就是把语料(这里是商品文本/卖点/详情)组织成**图 + 社区(community)+ 社区摘要**,用摘要回答概览型问题。([arXiv][1]) | |
| 17 | + | |
| 18 | +2. **弱结构/弱标签的数据组织** | |
| 19 | + 你们没现成的类目/风格/材质等字段,且表达形式各异;要强行做完整归一化成本高。 | |
| 20 | + GraphRAG 的一个现实落点是:**不追求先把全量字段“统一成完美本体”**,而是先用 LLM 做抽取→把“相近概念/表述”通过 embedding 聚合成图上的节点群/社区→对社区做摘要,形成“可解释的风格集合概览”。([microsoft.github.io][2]) | |
| 21 | + | |
| 22 | +--- | |
| 23 | + | |
| 24 | +## 2) 一套“低归一化成本”的 GraphRAG 商品搜索架构(建议落地路径) | |
| 25 | + | |
| 26 | +### 离线:从商品文本构建“风格/要素图谱 + 社区摘要” | |
| 27 | + | |
| 28 | +**输入**:商品标题、卖点、详情、评价要点、图文描述(可选)、店铺活动文案等。 | |
| 29 | +**目标**:让“清新”这种概念能对应到一组社区摘要(概览),再能落到代表商品(实例)。 | |
| 30 | + | |
| 31 | +**步骤建议:** | |
| 32 | + | |
| 33 | +1. **抽取候选要素(不强求统一)** | |
| 34 | + 用 LLM 从每个商品里抽取:风格、版型、场景、材质、颜色倾向、功能特性等(先允许多样表达)。 | |
| 35 | + 如果你担心一致性,可以先用“属性-值对”的范式抽取(attribute-value),后面再聚类。相关研究专门讨论了“抽取 + 归一化”的提示模板和基准数据集(WDC-PAVE)。([arXiv][3]) | |
| 36 | + | |
| 37 | +2. **轻量归一化:embedding 聚类 / 同义聚合(比手工本体便宜很多)** | |
| 38 | + 把候选要素值(如“清新/清爽/小清新/森系清新/干净感”)做向量化→聚类→形成“概念簇节点”。 | |
| 39 | + 你不需要一次性定标准名,可以先给每个簇一个“LLM 生成的簇摘要+别名列表”,逐步迭代。 | |
| 40 | + | |
| 41 | +3. **建图(Product ↔ 概念簇 ↔ 属性类型)** | |
| 42 | + | |
| 43 | +* 商品节点(SKU/SPU) | |
| 44 | +* 概念簇节点(如“清新感-风格簇”“棉麻-材质簇”) | |
| 45 | +* 属性类型节点(风格/材质/场景…) | |
| 46 | + 边:商品—(has_style)—风格簇;商品—(has_material)—材质簇… | |
| 47 | + | |
| 48 | +4. **社区发现 + 社区摘要(GraphRAG 核心)** | |
| 49 | + 在图上做 community detection,把高度相关的概念簇 + 商品群组织起来,并为每个社区预生成摘要(“这个社区代表的清新风格通常有哪些元素、适合什么人群/场景、避坑点、代表商品类型…”)。这就是你想要的“清新商品集合概览”。([arXiv][1]) | |
| 50 | + | |
| 51 | +> 这套流程,Microsoft GraphRAG 的 indexing pipeline 就是面向“从非结构化文本抽结构化信息并形成可检索结构”的。([microsoft.github.io][2]) | |
| 52 | + | |
| 53 | +--- | |
| 54 | + | |
| 55 | +### 在线:模糊查询“清新风格的裙子”怎么答得又准又像导购 | |
| 56 | + | |
| 57 | +可以把在线请求拆成“两段式”: | |
| 58 | + | |
| 59 | +1. **先做全局概览(global)** | |
| 60 | + 识别用户意图:想看“清新”在店里有哪些主要分支(比如:棉麻清新、法式清新、学院清新、通勤清新…) | |
| 61 | + → 在图上找到与“清新”最相关的社区(支持动态选择社区/层级的思路也有官方文章介绍) | |
| 62 | + → 返回:概览摘要 + 关键考虑点(材质、场景、版型、透/不透、打理成本…)+ 每个分支 3–5 个代表商品。([微软][4]) | |
| 63 | + | |
| 64 | +2. **再做个性化检索(local)** | |
| 65 | + 根据用户补充条件(预算/身高/场景/偏好) | |
| 66 | + → 在对应社区内做“局部检索”:hybrid(BM25+向量)+ 结构化过滤(材质簇/场景簇) | |
| 67 | + → 输出更精准的候选列表,并解释“为什么这些更像你要的清新”。 | |
| 68 | + | |
| 69 | +--- | |
| 70 | + | |
| 71 | +## 3) 你要的:相关技术资料 & 开源项目(按用途分组) | |
| 72 | + | |
| 73 | +### A. GraphRAG 体系与实现(核心必看) | |
| 74 | + | |
| 75 | +* **microsoft/graphrag(官方开源)**:GraphRAG 的模块化实现与 pipeline 思路(indexing + querying)。([GitHub][5]) | |
| 76 | +* **Microsoft Research Blog 系列(原理 + 全局搜索/社区选择等)**:理解“global query 为何需要社区摘要、动态社区选择”等。([microsoft.github.io][6]) | |
| 77 | +* **论文:From Local to Global: A Graph RAG Approach…(GraphRAG 经典论文)**:两阶段建图 + 社区摘要的原型描述,非常贴你“先概览再细搜”的需求。([arXiv][1]) | |
| 78 | +* **GraphRAG Survey(综述)**:想系统盘点组件(query processor / retriever / organizer / generator)可以看这个。([arXiv][7]) | |
| 79 | + | |
| 80 | +### B. 工程化工具链:用现成框架快速搭原型 | |
| 81 | + | |
| 82 | +* **LlamaIndex GraphRAG(PropertyGraph cookbook)**:有一套可跑的 GraphRAG pipeline 示例,适合你快速 PoC。([developers.llamaindex.ai][8]) | |
| 83 | +* **LangChain Graph RAG retriever**:把“向量相似检索 + 结构化遍历”组合成 retriever 的集成入口。([docs.langchain.com][9]) | |
| 84 | +* **Neo4j GraphRAG Python 包(+ GitHub)**:偏“图数据库落地”的路线,提供 KG 构建管道、向量检索器、Cypher 检索器等。([neo4j.ac.cn][10]) | |
| 85 | +* **一个资源汇总仓库 Graph-RAG/GraphRAG**:把 GraphRAG 相关论文/工具做了分类整理,找资料很省时间。([GitHub][11]) | |
| 86 | + | |
| 87 | +### C. “商品要素抽取/归一化”相关(你离线端的关键难题) | |
| 88 | + | |
| 89 | +* **Using LLMs for the Extraction and Normalization of Product Attribute Values(+ WDC-PAVE)**:专门研究“从商品文本抽取属性值并做归一化”,非常对症。([arXiv][3]) | |
| 90 | +* **Explicit Attribute Extraction in e-Commerce Search(ECNLP@LREC-COLING 2024)**:更偏“从搜索 query 抽属性值”,对在线端 query understanding 很有帮助。([ACL Anthology][12]) | |
| 91 | + | |
| 92 | +### D. 线上检索底座(GraphRAG 之外,你一定会搭配的“混合检索/排序”) | |
| 93 | + | |
| 94 | +因为你最终仍要落到“给一组商品候选”,强烈建议 GraphRAG 的“概览/组织”层下面,接一个成熟的 hybrid 检索引擎: | |
| 95 | + | |
| 96 | +* **Vespa(开源,电商 sample apps + hybrid tutorial)**:电商搜索/排序是它的强项,有示例应用与 LTR 思路。([GitHub][13]) | |
| 97 | +* **Weaviate Hybrid Search(BM25 + vector)**:混合检索文档齐全,也有 OpenAI cookbook 示例。([Weaviate 文档][14]) | |
| 98 | +* **Hybrid Search 评测工具(GitHub)**:如果你要比较不同 embedding / 融合策略,这类基准框架能省很多时间。([GitHub][15]) | |
| 99 | + | |
| 100 | +--- | |
| 101 | + | |
| 102 | +## 4) 一个“最小可行 PoC”建议(能最快验证价值) | |
| 103 | + | |
| 104 | +如果你只想先证明“清新概览”这件事能跑通: | |
| 105 | + | |
| 106 | +1. 选一个类目(裙子)+ 1–3 万商品文本 | |
| 107 | +2. LLM 抽取:风格/材质/场景/版型(先不做强归一化) | |
| 108 | +3. embedding 聚类:把风格值聚成 50–200 个簇 | |
| 109 | +4. 建图 + 社区摘要(直接用 microsoft/graphrag 或 LlamaIndex cookbook 跑通)([GitHub][5]) | |
| 110 | +5. 在线输入:“清新风格的裙子” | |
| 111 | + 输出: | |
| 112 | + | |
| 113 | +* 清新在店铺内的 3–6 个分支(社区摘要) | |
| 114 | +* 每个分支的 3–5 个代表商品 | |
| 115 | +* 2–4 条“挑选考虑点/避坑点”(来自社区摘要) | |
| 116 | + | |
| 117 | +只要这一步用户觉得“像导购一样把清新讲清楚了”,再去补“更精细的过滤/排序/个性化”。 | |
| 118 | + | |
| 119 | + | |
| 120 | +## 服装领域字段选择 | |
| 121 | + | |
| 122 | + | |
| 123 | +基础层: | |
| 124 | +- id | |
| 125 | +- title | |
| 126 | +- category_path | |
| 127 | + | |
| 128 | +风格层: | |
| 129 | +- style_primary | |
| 130 | +- style_secondary | |
| 131 | + | |
| 132 | +结构层: | |
| 133 | +- silhouette | |
| 134 | +- length | |
| 135 | +- neckline | |
| 136 | +- sleeve_type | |
| 137 | + | |
| 138 | +材质层: | |
| 139 | +- material | |
| 140 | +- fabric_texture (棉麻感 / 轻薄 / 垂坠) | |
| 141 | + | |
| 142 | +视觉层: | |
| 143 | +- main_color | |
| 144 | +- color_tone | |
| 145 | +- pattern | |
| 146 | + | |
| 147 | +功能层: | |
| 148 | +- features | |
| 149 | +- body_flattering_points | |
| 150 | + | |
| 151 | +场景层: | |
| 152 | +- usage_scene | |
| 153 | +- season | |
| 154 | +- target_audience | |
| 155 | + | |
| 156 | +补充层: | |
| 157 | +- selling_points | |
| 158 | +- key_attributes | ... | ... |