我把AI接进了自己做的产品——踩了四个坑

YM
0 评论 302 浏览 0 收藏 13 分钟

从技术小白到产品思考者,一次API对接的曲折历程揭示了产品开发的深层逻辑。本文通过四个真实踩坑案例,揭秘开发者面对API Key配置、前后端通信、CORS跨域和数据处理时遇到的技术障碍如何转化为产品设计洞察,展现从概念验证到MVP落地的关键跃迁。

我以为这很简单

大概半小时的事。

然后我花了一整天。

踩了四个坑,每一个坑在当时都觉得是末日,回头看每一个都是必修课。

第一个坑:API Key放哪里

调用AI的API,第一步是要有一个Key——相当于你的身份证,证明你有权限调用这个服务。

我拿到Key之后,第一个问题出现了:这个东西放哪里?

我问Copilot,它告诉我要放在.env文件里,不能直接写在代码里,因为代码可能会被别人看到,Key泄露了就麻烦了。

我听懂了这个逻辑。就像学生的考试答案不能写在黑板上一样,有些东西要放在只有你自己能看到的地方。

但我不知道.env文件是什么,也不知道怎么创建,也不知道创建了之后代码怎么读取它。

Copilot一步步告诉我:在项目根目录创建一个叫.env的文件,在里面写API_KEY=你的key,然后在代码里用process.env.API_KEY来读取它。

我照做了。

然后发现.env文件在VS Code里根本不显示——因为它是隐藏文件。

我以为自己创建失败了,又创建了一次,又找不到,又创建了一次。

最后Copilot告诉我:它存在,只是默认隐藏,你需要在VS Code设置里开启显示隐藏文件。

我打开设置,找到选项,勾上,三个.env文件同时出现了。

这件事让我意识到的第一个产品问题:

一个真实的用户,在部署这个系统的时候,会遇到同样的困惑。

API Key的配置方式,对我这样的非技术用户来说,是一个真实的使用门槛。如果这个系统将来要给其他老师用,这个步骤要么彻底自动化,要么要有一个傻瓜式的配置界面——让用户直接在页面上粘贴Key,而不是去创建隐藏文件。

这是我第一次用产品经理的眼睛看自己踩的坑。

第二个坑:请求发出去了,但没有返回

Key配好了,我在前端写了一个按钮,点击之后向后端发送请求,后端拿到学生输入,调用AI,返回诊断结果。

逻辑很清晰。

我点击了按钮。

页面没有任何反应。

不是报错,是什么都没有。那个诊断结果区域空白着,像一块没有擦干净的黑板。

我打开了浏览器的开发者工具(Copilot告诉我按F12),看到了网络请求的记录。请求确实发出去了,状态是pending——挂起,一直在等待,没有返回。

我把这个状态描述给Copilot,它问我:你的后端服务启动了吗?

我愣了一下。

我以为前端跑起来了,后端就自动跑起来了。

它没有。

前端和后端是两个独立的服务,需要分别启动。我一直只启动了前端,后端从来没有运行过。所以前端发出的请求,到了一个没有人接收的地址,就这样挂在那里等待,永远等不到回应。

我打开了另一个终端窗口,启动了后端服务。

再次点击按钮。

这次有反应了——但是报错了。

这件事让我意识到的第二个产品问题:

前后端分离的架构,对开发者来说是常识,对用户来说是负担。

如果这个系统要部署给真实的学校使用,”需要同时启动两个服务”这件事,是一个必须解决的工程问题,不能依赖用户自己去理解。要么合并成一个服务,要么做一个一键启动的脚本。

这不是技术问题,是产品决策。

第三个坑:跨域问题,CORS报错

后端启动了,请求发出去了,但报错了。

错误信息是:Access to fetch at ‘http://localhost:8000’ from origin ‘http://localhost:3000’ has been blocked by CORS policy。

我把这段话粘给Copilot,问它这是什么意思。

它解释说:浏览器有一个安全机制,默认不允许一个地址的页面去请求另一个地址的数据。我的前端跑在localhost:3000,后端跑在localhost:8000,浏览器认为这是两个不同的”源”,所以拦截了请求。

我理解这个逻辑:就像学校规定学生不能随便去其他班级拿东西,需要有授权。

解决方法是在后端加一个配置,告诉浏览器”我允许来自localhost:3000的请求”。

Copilot给了我具体的代码,我加进去,重启后端,再次点击按钮。

这次没有CORS报错了。

但返回的数据,没有正确显示在页面上。

这件事让我意识到的第三个产品问题:

CORS是一个纯粹的工程配置问题,但它暴露了一个更深层的产品问题:开发环境和生产环境的差异。

在本地开发时,前后端跑在不同端口,CORS是必须处理的。但部署到真实服务器上,如果前后端在同一个域名下,这个问题就消失了。

我在本地花了时间解决的问题,在真实部署时可能根本不存在。反过来,真实部署时会出现我在本地从来没遇到过的问题。

这让我开始理解,为什么产品从”能跑”到”能用”之间,有那么大的距离。

第四个坑:返回的格式和前端对不上

后端返回数据了。

但页面上显示的是一堆乱码——不是乱码,是原始的JSON字符串,直接被塞进了一个文本框里展示,没有任何格式。

{“mastery_assessment”:{“level”:”misconception”,”evidence”:”汽车开得越快,惯性就越大”},”cognitive_block”:{“type”:”quantitative_confusion”,”description”:”混淆惯性与动能”},”guided_questions”:[“一辆静止的大货车和一辆高速行驶的自行车,哪个惯性更大?”]}

这就是页面上显示的东西。

我设计的界面应该是:掌握等级用一个彩色标签显示,阻滞点描述在一个独立的区域,引导问题用列表展示。

但前端代码不知道怎么解析这个JSON,它只是把整个字符串扔进了一个div里。

这是前端代码的问题,不是后端的问题。AI返回的格式是对的,但前端不知道怎么读它。

Copilot帮我修改了前端的数据处理逻辑,把JSON解析出来,把每个字段映射到对应的界面元素。

改完之后,我重新点击了”开始诊断”。

它真的动了

输入框里是那句话:

“老师,汽车开得越快,惯性就越大,不然为啥高速行驶时刹车要滑那么远才停得下来?”

点击按钮。

页面右侧的结果区域开始加载,有一个转圈的动画——这次不是假的,是真的在等待AI返回。

大概三秒钟之后,结果出现了。

掌握等级标签显示”错误概念”,用红色背景。阻滞点描述:”将制动距离长归因于惯性变大,混淆了惯性与动能。”引导问题用列表排列,第一条是:”一辆静止的大货车和一辆高速行驶的自行车,哪个惯性更大?”

这不是模拟数据。

这是AI真正读取了学生的输入,调用了我写的诊断逻辑,返回的真实分析结果。

我在这个界面前坐了很久。

不是因为激动,是因为突然意识到一件事——

这个东西,现在是真的了。

从PM角度看,这一步意味着什么

跑通API对接,在技术上意味着前后端联通了,系统闭环了。

但从产品经理的角度看,这一步意味着的是完全不同的事情。

它意味着,这个产品从”概念”变成了”假设验证”。

在这之前,我有一个想法:AI可以分析学生的物理错误概念。我用Prompt验证了这个想法在逻辑上是可行的。但那是在对话框里,是我一个人知道的事。

现在,这个想法有了一个可以让别人体验的形态。

我可以把这个页面的地址发给另一个物理老师,让他输入自己课堂上听到的学生错误,看看系统能不能给出有价值的诊断。

这是一个质的变化。

从”我觉得这个想法可行”,到”我可以让别人来验证这个想法是否真的有用”。

这就是MVP和POC的区别。POC验证技术可行性,MVP验证用户价值。

我现在手里拿着的,是一个非常粗糙的MVP。

这四个坑,教会了我一件事:

每一个技术问题背后,都藏着一个产品问题。

API Key不知道放哪里 → 配置流程对非技术用户不友好,需要产品化。

请求没有返回 → 前后端分离的架构,部署复杂度是用户成本。

CORS报错 → 开发环境和生产环境的差异,是产品上线前必须提前考虑的。

返回格式对不上 → 前后端的数据契约,需要在开发开始之前就定义清楚,而不是等到联调的时候再发现。

这些东西,在任何一本产品经理的教材里都有讲。但我是踩进去、爬出来之后,才真正理解它们是什么意思的。

接下来,系统现在能跑了,但还很脆。

我测试了几条输入,发现有两个问题:

第一,网络慢的时候,等待时间超过五秒,页面没有任何提示,用户不知道系统是在处理还是卡死了。

第二,如果输入的内容不是物理相关的,系统会强行给出一个诊断,置信度虚高的问题还没有解决。

这两个问题,一个是体验问题,一个是准确性问题。

下一步要解决的,是把这个粗糙的MVP,变成一个真正可以给真实老师试用的东西。

这意味着我需要第一个真实用户。

不是我自己,是另一个物理老师。

本文由 @YM 原创发布于人人都是产品经理。未经作者许可,禁止转载

题图来自Unsplash,基于CC0协议

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 目前还没评论,等你发挥!