【S1W3 交叉评测】港链智企 Agent(智策通)— 评测意见 #1

Open
opened 2026-05-19 21:42:50 +08:00 by smartresearch2026 · 0 comments

交叉评测意见

评测项目: Eason/ganglian-zhixuan-agent-v3 — 港链智企 Agent(智策通)
评测日期: 2026-05-19
评测对象路径: /tmp/synnovator-review/ganglian-zhixuan-agent-v3/extracted


1. 项目理解

项目方向

「港链智企 Agent」(对外品牌名"智策通 / PolicyMatch")是一个面向临港新片区中小企业与 OPC 创业者的政策智能匹配与申报材料生成平台。其核心价值主张是:企业录入基本画像(行业、规模、研发投入、资质等),系统通过 AI 规则引擎自动匹配可申报的扶持政策,输出匹配度评分与可解释的匹配理由,并一键生成申报书初稿与材料清单。

技术架构上,本项目是一个 TanStack Start(React 19 SSR) + shadcn/ui + Cloudflare Workers 的前端应用,后端通过 HTTP API 对接一个独立的 Python 分析服务(VITE_GANGLIAN_API_BASE 指向 http://127.0.0.1:8000),并在后端不可用时自动降级为本地规则引擎 + 硬编码政策库兜底。

目标用户

  • 临港新片区的 OPC(一人公司)创业者和中小微企业主
  • 缺乏政策申报专业背景、需要快速判断"我能申请什么补贴"的企业管理者
  • 运营人员(通过 /admin 后台管理政策库与企业申报记录)

核心问题

解决传统企业政策申报中的三个痛点:

  1. 信息不对称:大量政策分散在各级政府网站,企业不知道哪些适合自己
  2. 匹配门槛高:政策条款专业性强,企业难以自行判断申报资格
  3. 材料准备繁琐:申报书撰写耗时且需专业知识

2. 项目亮点

2.1 完整的前端产品闭环,6 个路由覆盖全流程

项目从首页营销落地页 → 登录 → 企业画像录入 → 政策匹配结果 → 申报材料生成 → 后台管理,构成一个完整的用户旅程。每个页面都有独立的 SEO meta 标签、响应式布局和清晰的信息架构。

证据:router.tsx 第 1-16 行使用 TanStack Router code-based routing;路由树包含 /index.tsx)、/loginlogin.tsx)、/onboardingonboarding.tsx)、/policiespolicies.tsx)、/materialsmaterials.tsx)、/adminadmin.tsx),每条路由都设置了 head: () => ({ meta: [...] }) 用于 SSR SEO。

2.2 精美的设计系统,达到商业产品视觉水准

项目使用了完整的设计令牌(design tokens)体系:Libre Baskerville 衬线字体用于标题(营造权威感)、IBM Plex Sans 无衬线字体用于正文(保证可读性)。OKLCH 色彩空间定义了 light/dark 双主题、自定义阴影层级(shadow-card / shadow-elevated)、渐变(bg-gradient-primary)、以及 success/warning/destructive 语义色。UI 质感远超比赛原型平均水平。

证据:styles.css 第 1-150 行完整定义了 @theme inline 令牌、:root / .dark 双主题变量、@layer base@layer utilities__root.tsx 第 1-6 行导入了字体的 5 个 weight 变体。index.tsx 第 21 行使用 radial-gradient 叠加背景光晕效果。

2.3 前后端分离架构 + 优雅降级策略

api.ts 中的 analyzeEnterprise() 函数(第 136-164 行)实现了清晰的降级逻辑:先尝试 POST /api/analyze 调用 Python 后端,若失败则 catch 异常并回退到 localFallback() 使用本地规则引擎 + 硬编码政策库。同时通过 sessionStorage 缓存分析结果(第 150-152 行),避免重复请求。这种设计使得项目即使在没有后端的环境中也能完整演示。

证据:api.ts 第 3 行 API_BASE 使用 import.meta.env.VITE_GANGLIAN_API_BASE 可配置;第 136-164 行 analyzeEnterprise() 实现 try/catch 降级;第 124-134 行 localFallback() 基于企业画像生成本地演示数据。

2.4 企业画像录入采用分步向导,降低信息收集门槛

onboarding.tsx(第 25-203 行)将企业信息收集拆分为 3 步:基础信息 → 经营情况 → 研发与资质,配合进度条(Progress 组件,第 91 行)和步骤指示器(step indicator),信息架构清晰。关键字段使用 Select 下拉(行业/地区/规模从 store.ts 第 215-217 行的预定义常量中读取),减少用户输入负担。

证据:onboarding.tsx 第 25 行定义 const STEPS = ["基础信息", "经营情况", "研发与资质"];第 96-178 行三段式表单;第 215-217 行 INDUSTRIES / SCALES / REGIONS 常量驱动下拉选项。

2.5 服务端错误处理完善,生产就绪度高

server.ts 实现了一个精巧的错误处理链路:error-capture.ts(第 1-27 行)通过 globalThis.addEventListener 捕获未处理的 error 和 unhandledrejection 事件并存入带 TTL(5 秒)的环形缓冲区;server.tsnormalizeCatastrophicSsrResponse()(第 55-67 行)检测 h3 框架吞掉的 SSR 异常(特征:响应 body 为 {"unhandled":true,"message":"HTTPError"}),并替换为品牌化的错误页面。同时 start.ts(第 5-18 行)的中间件级兜底确保任何未捕获异常都返回格式化的 500 页面而非裸错误。

证据:error-capture.ts 第 4-5 行 lastCapturedError + TTL_MS = 5_000;第 11-16 行全局事件监听;server.ts 第 29-51 行 isCatastrophicSsrErrorBody() 的特征检测逻辑;error-page.ts 第 1-30 行品牌化 HTML 错误页面。

2.6 后端 API 契约设计规范,TypeScript 类型完整

api.ts 为后端返回的 JSON 定义了完整的 TypeScript 类型:BackendAnalyzeResponse(第 34-43 行)、ImportPolicyResponse(第 51-57 行)、ImportedPoliciesResponse(第 45-49 行),并通过 normalizeBackendPolicy()(第 97-118 行)将后端字段映射到前端统一的 RecommendedPolicy 类型。这种类型安全的 API 层降低了前后端协作的出错概率。

证据:api.ts 第 6-17 行定义 RecommendedPolicyAnalysisResult;第 19-57 行定义 4 个后端响应类型;第 84-95 行 postJson<T>() 泛型请求函数。


3. 当前不足

3.1 登录系统完全为演示态,零安全防护

login.tsx 中的三种登录方式(邮箱、短信、OAuth)均为假登录:

  • 邮箱登录(第 96 行):submit(email.split("@")[0] || "演示用户") — 不验证密码,不调用后端
  • 短信登录(第 113 行):点击"获取"按钮直接 toast "演示验证码:123456",不验证 code
  • OAuth 登录(第 122 行):Google 按钮直接 submit("Google 用户"),无实际 OAuth 流程

store.tssaveUser()(第 35-38 行)仅将 {email, name} 写入 localStorage,无 token、无 session、无任何安全机制。这在比赛演示中可接受,但项目文档中未明确标注"演示环境/非生产就绪",可能误导评审对其完成度的判断。

证据:login.tsx 第 28-31 行 submit() 函数直接保存并导航,无任何校验;第 96 行动态取用户名;store.ts 第 35-38 行 saveUser() 仅写 localStorage。

3.2 Python 后端代码未包含在本仓库中

api.ts 调用了三个后端 API 端点:

  • POST /api/analyze — 企业分析(第 138 行)
  • GET /api/imported-policies — 获取已采集政策(第 173 行)
  • POST /api/import-policy — 采集新政策(第 186 行)

但整个代码仓库中没有任何后端代码(Python/Node/其他)。后端被假定为一个独立运行在 http://127.0.0.1:8000 的服务。这意味着本仓库仅交付了前端部分,完整的"AI 智能匹配"能力依赖于一个未交付的外部服务。评审者无法完整评估项目的核心 AI 能力。

证据:api.ts 第 3 行 API_BASE 指向外部地址;package.json 中无任何后端相关依赖(如 fastapi、flask 等);文件列表中无 .py 文件。

3.3 本地规则引擎过于简化,匹配逻辑存在明显缺陷

store.ts 中的 recommendPolicies() 函数(第 182-213 行)实现了一个基础规则引擎,存在以下问题:

  1. 行业匹配仅做 includes 判断(第 187 行):p.industries.includes(e.techField || e.industry) — 如果企业的 techField 为 "人工智能" 但政策行业的列表中只有 "信息技术",则会匹配失败。没有行业分类的层级映射或语义相似度计算。

  2. 硬编码特殊规则(第 201-207 行):针对 p001(高企认定)和 p002(专精特新)写了死代码规则,这些规则无法泛化到新增政策。政策库每增加一条政策,都需要修改规则引擎代码。

  3. 基础分值为 40(第 185 行 let score = 40)且无解释 — 为什么不是 30 或 50?

  4. 评分上限 99(第 209 行 Math.min(99, score))— 这意味着永远没有"100% 匹配",可能让用户困惑。

证据:store.ts 第 182-213 行完整规则引擎逻辑;第 201 行 if (parseInt(e.patents || "0") >= 6 && p.id === "p001");第 205 行 if ((e.certifications || []).includes("专精特新") && p.id === "p002")

3.4 Admin 后台数据全为硬编码,无法反映真实运营状态

admin.tsx 中的企业列表(第 23-30 行 ENTERPRISES 常量)、申报记录(第 32-39 行 APPS 常量)、统计数据(第 41-46 行 stats 常量)全部为硬编码数组,数据与用户在前端录入的企业信息、在 /materials 页面生成的申报毫无关联。后台的"政策采集"功能(importPolicyFromUrl(),第 65-82 行)依赖一个不存在于仓库中的后端 API,在无后端环境中始终失败并静默降级为空数组(第 60-61 行 .catch(() => { setImportedPolicies([]); }))。

证据:admin.tsx 第 23-30 行 6 条硬编码企业数据;第 32-39 行 6 条硬编码申报记录;第 41-46 行 4 项硬编码统计;第 57-63 行 useEffect 调用 listImportedPolicies() 但 catch 后静默降级为空。

3.5 申报材料生成为纯模板引擎,非 AI 生成

materials.tsx 中的 generateDraft() 函数(第 184-239 行)是一个纯字符串模板引擎:将企业信息填入预设的申报书模板段落中,通过字符串拼接生成。当后端返回 applicationDraft 时(第 64 行),直接使用后端版本;否则使用前端模板。真正的 AI 材料生成能力完全依赖未交付的 Python 后端。

而且 generateDraft() 中有硬编码的数学假设:预计带动新增就业人数固定为 员工数 * 0.15(第 229 行),预计新增营收固定为 营收 * 0.18(第 230 行),这些数字没有行业差异或政策相关性依据。

证据:materials.tsx 第 184-239 行 generateDraft() 函数;第 229-230 行 Math.round((parseInt(employees || "20") || 20) * 0.15)Math.round((parseInt(revenue || "1000") || 1000) * 0.18)

3.6 缺少自动化测试、CI/CD 配置与可观测性

整个代码仓库中:

  • *.test.ts / *.spec.ts 测试文件
  • vitest / jest 等测试依赖(package.json 中无测试相关 devDependencies)
  • 无 CI/CD 配置文件(无 .github/workflows
  • 无日志体系、无错误上报(Sentry/DataDog 等),仅 console.error(如 api.ts 第 155 行、server.ts 第 76 行)

对于一个声称"面向企业生产环境"的项目,缺少测试是可接受的技术债务,但完全为零则表明项目仍处于原型阶段。

证据:package.json 第 9-16 行 scripts 中无 test 命令;第 75-92 行 devDependencies 中无测试框架;文件列表中无任何 test 文件。


4. 下一步建议

4.1 [高优先] 将 Python 后端代码纳入仓库,或提供 Docker Compose 一键启动

当前评测者无法运行完整的"AI 匹配"流程。建议:

  • 将 Python 后端代码纳入同一仓库的 /backend 目录
  • 提供 docker-compose.yml 实现前端 + 后端一键启动
  • 或至少在 README.md 中明确说明后端的 API 契约(请求/响应格式),并提供 mock server 数据以便离线评测

4.2 [高优先] 标注演示环境边界,或在登录页增加「演示模式」标识

当前登录流程从 UI 上看与真实产品无异,但实际上无任何安全机制。建议:

  • 在登录页显著位置标注"演示环境 · 无需真实认证"
  • 或在 /login 路由增加 skipAuth 参数支持匿名体验(目前首页"开始匹配"按钮直接跳 /onboarding,不强制登录,这其实是好的 UX,但登录页的存在容易误导)
  • store.ts 中补充注释说明 localStorage 仅用于演示数据持久化

4.3 [高优先] 将 recommendPolicies() 规则引擎升级为数据驱动

当前的硬编码特殊规则(p.id === "p001" / p.id === "p002")无法扩展。建议:

  • Policy 类型中增加 matchRules: MatchRule[] 字段,将匹配条件定义为数据而非代码
  • 或直接将匹配逻辑交由后端 Python 服务处理,前端仅负责展示
  • 案例:LinkedIn 的项目 link-aimatchmaker 将评分公式参数化(见 matchmaker-review.md 第 57 行),可以借鉴其维度加权设计

4.4 [中优先] 将 Admin 后台数据源接入真实状态

当前 Admin 后台的 ENTERPRISES / APPS 数组与前端用户行为完全脱钩。建议:

  • 企业列表从 localStorage 中的 KEY_ENT 读取(至少能做本地一致性)
  • 申报记录在 /materials 页面的"下载"操作时写入 localStorage 并回显
  • 统计数据从 POLICIES 数组和 localStorage 动态计算

4.5 [中优先] 增加单元测试与 E2E 测试

建议补充:

  • 单元测试:recommendPolicies() 各种企业画像输入下的评分输出(验证评分逻辑正确性)
  • 单元测试:normalizeBackendPolicy() 对各种后端响应格式的映射正确性
  • 组件测试:PolicyCard / MaterialsPage 的空状态、加载状态、错误状态
  • E2E:onboarding → policies → materials 完整用户旅程

参考 package.json 添加 vitest@testing-library/react 依赖。

4.6 [低优先] 增强申报材料生成的个性化

当前 generateDraft() 的模板中预计新增就业和营收使用固定百分比。建议:

  • 根据企业规模(小型/中型/大型)调整增长预期系数
  • 根据政策类型(现金补贴/税收优惠/资质认定)调整申报理由段落
  • 利用后端 applicationDraft 字段由 AI 生成更个性化的材料(这需要后端就绪)

5. 综合评价

总体评价:前端工程完成度高,全栈能力待验证

「港链智企 Agent」展现了 扎实的前端工程能力与出色的 UI 设计水准。TanStack Start SSR + shadcn/ui 的技术选型合理,设计系统精致,用户旅程完整,错误处理考虑周详。如果仅从"前端产品原型"角度来评估,这是一个质量很高的交付。

然而,该项目的核心定位是"AI Agent",其 AI 能力(智能匹配、材料生成、政策采集)全部依赖于一个未交付的 Python 后端服务。当前仓库中的前端代码实际上是一个"AI 能力的精美展示壳"——展示 AI 生成结果的 UI、处理 AI 结果的类型定义、AI 服务不可用时的降级策略,但 AI 本身不在仓库中。这也解释了为什么 admin.tsx 中的数据全为硬编码、login.tsx 的认证全为模拟——这些都是前端独立演示所必需的 mock。

从 Eason 为我们 MedRoundTable 所做的详尽的跨维度评测来看(覆盖产品定位、文档完整性、Agent 通信协议、合规性等),Eason 本人对 AI Agent 项目的评审标准是较高的。按照同样的标准回看本项目:

维度 评分 说明
产品定位与 UX 用户旅程完整,UI 精致,但登录为假登录
前端工程质量 TypeScript 类型完善,错误处理好,SSR 就绪
AI/Agent 能力 核心 AI 在后端且未交付;前端规则引擎过于简化
可运行性 前端可独立运行,但完整流程依赖外部后端
文档完整性 无 README、无架构说明、无 API 文档
测试覆盖 零测试
代码可扩展性 前端架构清晰,但规则引擎硬编码难以扩展

核心建议:如果 Eason 能将 Python 后端代码补充进仓库并完善文档,这个项目有潜力成为一个优秀的全栈 AI Agent 应用。当前状态下,它更像一个"带着精美 UI 壳的前端半成品"——壳很亮,但核不在


本报告基于对项目中 20+ 个核心文件的完整阅读生成,所有结论均引用具体文件路径和行号作为证据。

# 交叉评测意见 **评测项目**: Eason/ganglian-zhixuan-agent-v3 — 港链智企 Agent(智策通) **评测日期**: 2026-05-19 **评测对象路径**: `/tmp/synnovator-review/ganglian-zhixuan-agent-v3/extracted` --- ## 1. 项目理解 ### 项目方向 「港链智企 Agent」(对外品牌名"智策通 / PolicyMatch")是一个面向临港新片区中小企业与 OPC 创业者的**政策智能匹配与申报材料生成平台**。其核心价值主张是:企业录入基本画像(行业、规模、研发投入、资质等),系统通过 AI 规则引擎自动匹配可申报的扶持政策,输出匹配度评分与可解释的匹配理由,并一键生成申报书初稿与材料清单。 技术架构上,本项目是一个 **TanStack Start(React 19 SSR) + shadcn/ui + Cloudflare Workers** 的前端应用,后端通过 HTTP API 对接一个独立的 Python 分析服务(`VITE_GANGLIAN_API_BASE` 指向 `http://127.0.0.1:8000`),并在后端不可用时自动降级为本地规则引擎 + 硬编码政策库兜底。 ### 目标用户 - 临港新片区的 OPC(一人公司)创业者和中小微企业主 - 缺乏政策申报专业背景、需要快速判断"我能申请什么补贴"的企业管理者 - 运营人员(通过 `/admin` 后台管理政策库与企业申报记录) ### 核心问题 解决传统企业政策申报中的三个痛点: 1. **信息不对称**:大量政策分散在各级政府网站,企业不知道哪些适合自己 2. **匹配门槛高**:政策条款专业性强,企业难以自行判断申报资格 3. **材料准备繁琐**:申报书撰写耗时且需专业知识 --- ## 2. 项目亮点 ### 2.1 完整的前端产品闭环,6 个路由覆盖全流程 项目从首页营销落地页 → 登录 → 企业画像录入 → 政策匹配结果 → 申报材料生成 → 后台管理,构成一个完整的用户旅程。每个页面都有独立的 SEO meta 标签、响应式布局和清晰的信息架构。 > 证据:`router.tsx` 第 1-16 行使用 TanStack Router code-based routing;路由树包含 `/`(`index.tsx`)、`/login`(`login.tsx`)、`/onboarding`(`onboarding.tsx`)、`/policies`(`policies.tsx`)、`/materials`(`materials.tsx`)、`/admin`(`admin.tsx`),每条路由都设置了 `head: () => ({ meta: [...] })` 用于 SSR SEO。 ### 2.2 精美的设计系统,达到商业产品视觉水准 项目使用了完整的设计令牌(design tokens)体系:Libre Baskerville 衬线字体用于标题(营造权威感)、IBM Plex Sans 无衬线字体用于正文(保证可读性)。OKLCH 色彩空间定义了 light/dark 双主题、自定义阴影层级(`shadow-card` / `shadow-elevated`)、渐变(`bg-gradient-primary`)、以及 success/warning/destructive 语义色。UI 质感远超比赛原型平均水平。 > 证据:`styles.css` 第 1-150 行完整定义了 `@theme inline` 令牌、`:root` / `.dark` 双主题变量、`@layer base` 和 `@layer utilities`。`__root.tsx` 第 1-6 行导入了字体的 5 个 weight 变体。`index.tsx` 第 21 行使用 `radial-gradient` 叠加背景光晕效果。 ### 2.3 前后端分离架构 + 优雅降级策略 `api.ts` 中的 `analyzeEnterprise()` 函数(第 136-164 行)实现了清晰的降级逻辑:先尝试 `POST /api/analyze` 调用 Python 后端,若失败则 catch 异常并回退到 `localFallback()` 使用本地规则引擎 + 硬编码政策库。同时通过 `sessionStorage` 缓存分析结果(第 150-152 行),避免重复请求。这种设计使得项目即使在没有后端的环境中也能完整演示。 > 证据:`api.ts` 第 3 行 `API_BASE` 使用 `import.meta.env.VITE_GANGLIAN_API_BASE` 可配置;第 136-164 行 `analyzeEnterprise()` 实现 try/catch 降级;第 124-134 行 `localFallback()` 基于企业画像生成本地演示数据。 ### 2.4 企业画像录入采用分步向导,降低信息收集门槛 `onboarding.tsx`(第 25-203 行)将企业信息收集拆分为 3 步:基础信息 → 经营情况 → 研发与资质,配合进度条(`Progress` 组件,第 91 行)和步骤指示器(step indicator),信息架构清晰。关键字段使用 Select 下拉(行业/地区/规模从 `store.ts` 第 215-217 行的预定义常量中读取),减少用户输入负担。 > 证据:`onboarding.tsx` 第 25 行定义 `const STEPS = ["基础信息", "经营情况", "研发与资质"]`;第 96-178 行三段式表单;第 215-217 行 `INDUSTRIES` / `SCALES` / `REGIONS` 常量驱动下拉选项。 ### 2.5 服务端错误处理完善,生产就绪度高 `server.ts` 实现了一个精巧的错误处理链路:`error-capture.ts`(第 1-27 行)通过 `globalThis.addEventListener` 捕获未处理的 error 和 unhandledrejection 事件并存入带 TTL(5 秒)的环形缓冲区;`server.ts` 的 `normalizeCatastrophicSsrResponse()`(第 55-67 行)检测 h3 框架吞掉的 SSR 异常(特征:响应 body 为 `{"unhandled":true,"message":"HTTPError"}`),并替换为品牌化的错误页面。同时 `start.ts`(第 5-18 行)的中间件级兜底确保任何未捕获异常都返回格式化的 500 页面而非裸错误。 > 证据:`error-capture.ts` 第 4-5 行 `lastCapturedError` + `TTL_MS = 5_000`;第 11-16 行全局事件监听;`server.ts` 第 29-51 行 `isCatastrophicSsrErrorBody()` 的特征检测逻辑;`error-page.ts` 第 1-30 行品牌化 HTML 错误页面。 ### 2.6 后端 API 契约设计规范,TypeScript 类型完整 `api.ts` 为后端返回的 JSON 定义了完整的 TypeScript 类型:`BackendAnalyzeResponse`(第 34-43 行)、`ImportPolicyResponse`(第 51-57 行)、`ImportedPoliciesResponse`(第 45-49 行),并通过 `normalizeBackendPolicy()`(第 97-118 行)将后端字段映射到前端统一的 `RecommendedPolicy` 类型。这种类型安全的 API 层降低了前后端协作的出错概率。 > 证据:`api.ts` 第 6-17 行定义 `RecommendedPolicy` 和 `AnalysisResult`;第 19-57 行定义 4 个后端响应类型;第 84-95 行 `postJson<T>()` 泛型请求函数。 --- ## 3. 当前不足 ### 3.1 登录系统完全为演示态,零安全防护 `login.tsx` 中的三种登录方式(邮箱、短信、OAuth)均为假登录: - 邮箱登录(第 96 行):`submit(email.split("@")[0] || "演示用户")` — 不验证密码,不调用后端 - 短信登录(第 113 行):点击"获取"按钮直接 toast "演示验证码:123456",不验证 code - OAuth 登录(第 122 行):Google 按钮直接 `submit("Google 用户")`,无实际 OAuth 流程 `store.ts` 的 `saveUser()`(第 35-38 行)仅将 `{email, name}` 写入 `localStorage`,无 token、无 session、无任何安全机制。这在比赛演示中可接受,但项目文档中未明确标注"演示环境/非生产就绪",可能误导评审对其完成度的判断。 > 证据:`login.tsx` 第 28-31 行 `submit()` 函数直接保存并导航,无任何校验;第 96 行动态取用户名;`store.ts` 第 35-38 行 `saveUser()` 仅写 localStorage。 ### 3.2 Python 后端代码未包含在本仓库中 `api.ts` 调用了三个后端 API 端点: - `POST /api/analyze` — 企业分析(第 138 行) - `GET /api/imported-policies` — 获取已采集政策(第 173 行) - `POST /api/import-policy` — 采集新政策(第 186 行) 但整个代码仓库中**没有任何后端代码**(Python/Node/其他)。后端被假定为一个独立运行在 `http://127.0.0.1:8000` 的服务。这意味着本仓库仅交付了前端部分,完整的"AI 智能匹配"能力依赖于一个未交付的外部服务。评审者无法完整评估项目的核心 AI 能力。 > 证据:`api.ts` 第 3 行 `API_BASE` 指向外部地址;`package.json` 中无任何后端相关依赖(如 fastapi、flask 等);文件列表中无 `.py` 文件。 ### 3.3 本地规则引擎过于简化,匹配逻辑存在明显缺陷 `store.ts` 中的 `recommendPolicies()` 函数(第 182-213 行)实现了一个基础规则引擎,存在以下问题: 1. **行业匹配仅做 `includes` 判断**(第 187 行):`p.industries.includes(e.techField || e.industry)` — 如果企业的 `techField` 为 "人工智能" 但政策行业的列表中只有 "信息技术",则会匹配失败。没有行业分类的层级映射或语义相似度计算。 2. **硬编码特殊规则**(第 201-207 行):针对 `p001`(高企认定)和 `p002`(专精特新)写了死代码规则,这些规则无法泛化到新增政策。政策库每增加一条政策,都需要修改规则引擎代码。 3. **基础分值为 40**(第 185 行 `let score = 40`)且无解释 — 为什么不是 30 或 50? 4. **评分上限 99**(第 209 行 `Math.min(99, score)`)— 这意味着永远没有"100% 匹配",可能让用户困惑。 > 证据:`store.ts` 第 182-213 行完整规则引擎逻辑;第 201 行 `if (parseInt(e.patents || "0") >= 6 && p.id === "p001")`;第 205 行 `if ((e.certifications || []).includes("专精特新") && p.id === "p002")`。 ### 3.4 Admin 后台数据全为硬编码,无法反映真实运营状态 `admin.tsx` 中的企业列表(第 23-30 行 `ENTERPRISES` 常量)、申报记录(第 32-39 行 `APPS` 常量)、统计数据(第 41-46 行 `stats` 常量)全部为硬编码数组,数据与用户在前端录入的企业信息、在 `/materials` 页面生成的申报毫无关联。后台的"政策采集"功能(`importPolicyFromUrl()`,第 65-82 行)依赖一个不存在于仓库中的后端 API,在无后端环境中始终失败并静默降级为空数组(第 60-61 行 `.catch(() => { setImportedPolicies([]); })`)。 > 证据:`admin.tsx` 第 23-30 行 6 条硬编码企业数据;第 32-39 行 6 条硬编码申报记录;第 41-46 行 4 项硬编码统计;第 57-63 行 `useEffect` 调用 `listImportedPolicies()` 但 catch 后静默降级为空。 ### 3.5 申报材料生成为纯模板引擎,非 AI 生成 `materials.tsx` 中的 `generateDraft()` 函数(第 184-239 行)是一个纯字符串模板引擎:将企业信息填入预设的申报书模板段落中,通过字符串拼接生成。当后端返回 `applicationDraft` 时(第 64 行),直接使用后端版本;否则使用前端模板。真正的 AI 材料生成能力完全依赖未交付的 Python 后端。 而且 `generateDraft()` 中有硬编码的数学假设:预计带动新增就业人数固定为 `员工数 * 0.15`(第 229 行),预计新增营收固定为 `营收 * 0.18`(第 230 行),这些数字没有行业差异或政策相关性依据。 > 证据:`materials.tsx` 第 184-239 行 `generateDraft()` 函数;第 229-230 行 `Math.round((parseInt(employees || "20") || 20) * 0.15)` 和 `Math.round((parseInt(revenue || "1000") || 1000) * 0.18)`。 ### 3.6 缺少自动化测试、CI/CD 配置与可观测性 整个代码仓库中: - 无 `*.test.ts` / `*.spec.ts` 测试文件 - 无 `vitest` / `jest` 等测试依赖(`package.json` 中无测试相关 devDependencies) - 无 CI/CD 配置文件(无 `.github/workflows`) - 无日志体系、无错误上报(Sentry/DataDog 等),仅 `console.error`(如 `api.ts` 第 155 行、`server.ts` 第 76 行) 对于一个声称"面向企业生产环境"的项目,缺少测试是可接受的技术债务,但完全为零则表明项目仍处于原型阶段。 > 证据:`package.json` 第 9-16 行 scripts 中无 `test` 命令;第 75-92 行 devDependencies 中无测试框架;文件列表中无任何 test 文件。 --- ## 4. 下一步建议 ### 4.1 [高优先] 将 Python 后端代码纳入仓库,或提供 Docker Compose 一键启动 当前评测者无法运行完整的"AI 匹配"流程。建议: - 将 Python 后端代码纳入同一仓库的 `/backend` 目录 - 提供 `docker-compose.yml` 实现前端 + 后端一键启动 - 或至少在 `README.md` 中明确说明后端的 API 契约(请求/响应格式),并提供 mock server 数据以便离线评测 ### 4.2 [高优先] 标注演示环境边界,或在登录页增加「演示模式」标识 当前登录流程从 UI 上看与真实产品无异,但实际上无任何安全机制。建议: - 在登录页显著位置标注"演示环境 · 无需真实认证" - 或在 `/login` 路由增加 `skipAuth` 参数支持匿名体验(目前首页"开始匹配"按钮直接跳 `/onboarding`,不强制登录,这其实是好的 UX,但登录页的存在容易误导) - 在 `store.ts` 中补充注释说明 localStorage 仅用于演示数据持久化 ### 4.3 [高优先] 将 `recommendPolicies()` 规则引擎升级为数据驱动 当前的硬编码特殊规则(`p.id === "p001"` / `p.id === "p002"`)无法扩展。建议: - 在 `Policy` 类型中增加 `matchRules: MatchRule[]` 字段,将匹配条件定义为数据而非代码 - 或直接将匹配逻辑交由后端 Python 服务处理,前端仅负责展示 - 案例:LinkedIn 的项目 `link-aimatchmaker` 将评分公式参数化(见 `matchmaker-review.md` 第 57 行),可以借鉴其维度加权设计 ### 4.4 [中优先] 将 Admin 后台数据源接入真实状态 当前 Admin 后台的 `ENTERPRISES` / `APPS` 数组与前端用户行为完全脱钩。建议: - 企业列表从 `localStorage` 中的 `KEY_ENT` 读取(至少能做本地一致性) - 申报记录在 `/materials` 页面的"下载"操作时写入 localStorage 并回显 - 统计数据从 `POLICIES` 数组和 localStorage 动态计算 ### 4.5 [中优先] 增加单元测试与 E2E 测试 建议补充: - 单元测试:`recommendPolicies()` 各种企业画像输入下的评分输出(验证评分逻辑正确性) - 单元测试:`normalizeBackendPolicy()` 对各种后端响应格式的映射正确性 - 组件测试:`PolicyCard` / `MaterialsPage` 的空状态、加载状态、错误状态 - E2E:`onboarding → policies → materials` 完整用户旅程 参考 `package.json` 添加 `vitest` 和 `@testing-library/react` 依赖。 ### 4.6 [低优先] 增强申报材料生成的个性化 当前 `generateDraft()` 的模板中预计新增就业和营收使用固定百分比。建议: - 根据企业规模(小型/中型/大型)调整增长预期系数 - 根据政策类型(现金补贴/税收优惠/资质认定)调整申报理由段落 - 利用后端 `applicationDraft` 字段由 AI 生成更个性化的材料(这需要后端就绪) --- ## 5. 综合评价 ### 总体评价:前端工程完成度高,全栈能力待验证 「港链智企 Agent」展现了 **扎实的前端工程能力与出色的 UI 设计水准**。TanStack Start SSR + shadcn/ui 的技术选型合理,设计系统精致,用户旅程完整,错误处理考虑周详。如果仅从"前端产品原型"角度来评估,这是一个质量很高的交付。 然而,该项目的核心定位是"AI Agent",其 AI 能力(智能匹配、材料生成、政策采集)**全部依赖于一个未交付的 Python 后端服务**。当前仓库中的前端代码实际上是一个"AI 能力的精美展示壳"——展示 AI 生成结果的 UI、处理 AI 结果的类型定义、AI 服务不可用时的降级策略,但 AI 本身不在仓库中。这也解释了为什么 `admin.tsx` 中的数据全为硬编码、`login.tsx` 的认证全为模拟——这些都是前端独立演示所必需的 mock。 从 Eason 为我们 MedRoundTable 所做的详尽的跨维度评测来看(覆盖产品定位、文档完整性、Agent 通信协议、合规性等),Eason 本人对 AI Agent 项目的评审标准是较高的。按照同样的标准回看本项目: | 维度 | 评分 | 说明 | |------|:---:|------| | 产品定位与 UX | ⭐⭐⭐⭐ | 用户旅程完整,UI 精致,但登录为假登录 | | 前端工程质量 | ⭐⭐⭐⭐ | TypeScript 类型完善,错误处理好,SSR 就绪 | | AI/Agent 能力 | ⭐⭐ | 核心 AI 在后端且未交付;前端规则引擎过于简化 | | 可运行性 | ⭐⭐ | 前端可独立运行,但完整流程依赖外部后端 | | 文档完整性 | ⭐⭐ | 无 README、无架构说明、无 API 文档 | | 测试覆盖 | ⭐ | 零测试 | | 代码可扩展性 | ⭐⭐⭐ | 前端架构清晰,但规则引擎硬编码难以扩展 | **核心建议**:如果 Eason 能将 Python 后端代码补充进仓库并完善文档,这个项目有潜力成为一个优秀的全栈 AI Agent 应用。当前状态下,它更像一个"带着精美 UI 壳的前端半成品"——**壳很亮,但核不在**。 --- > 本报告基于对项目中 20+ 个核心文件的完整阅读生成,所有结论均引用具体文件路径和行号作为证据。
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Eason/ganglian-zhixuan-agent-v3#1
No description provided.