我把AI接进了自己做的产品——踩了四个坑
从技术小白到产品思考者,一次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协议
- 目前还没评论,等你发挥!

起点课堂会员权益




