以下是我尝试分别用 langchain, langgraph,以及 ReAct 的三次实验,请大家帮忙看看有没有更好的解决方案,多谢。整体排版让 ai 给我优化了一下
用户提出一个报价问题,例如:
iphone16pro max, 128g, 黑色 多少钱?
实际 SKU 要复杂得多,但不影响核心流程:
我在 prompt 中指定了多个 function call:
实际效果: 不理想,属于 demo 偶尔能跑通,但经常出问题:
尝试用流程图方式替代 prompt 中的 if-else 指令:
实际效果: 依然不稳定,部分场景下流程刚性,模型无法灵活应对用户输入的变化。
在 prompt 中使用 ReAct 框架( Thought → Action → Observation ):
实际效果:
无论是 prompt + function call 、LangGraph 流程图,还是 ReAct 框架,核心问题始终是:
大模型行为的不可控性,尤其是在多步骤流程中容易出错或跳步,目前仍未找到完全可靠的解决方案。
![]() |
1
geebos PRO ![]() 固定流程可以不依赖 AI 调用,直接指定第一步的 AI 提取产品名称,拿到输出调接口查数据再给第二步的 AI
|
![]() |
2
lanweizhujiao 52 天前 ![]() 1 楼说的对,
|
3
NoDataNoBB 52 天前 ![]() 可以试试 json mode
|
4
Mzs 52 天前
固定流程用 dify 或者扣子
|
5
maolon 52 天前 via Android ![]() 你这最关键的用了哪个模型驱动都不说
每个 agent 对各种 prompt 的效果也不一致, 你怎么设计的 prompt 也要描述清楚, 最后才是这些框架 workflow 的问题 |
![]() |
6
huangrong 52 天前 ![]() 我目前是通过将最小化大模型的流程,但也只能减少出错概率
|
8
dongcxcx OP |
9
maolon 52 天前
@dongcxcx prompt 看着没啥问题,那一般这种问题解决方法就是
1. langgraph 做一个前置检查 node (在这个 node 里判断用户信息是否完整,不完整就直接去 respond node 向用户要信息) 2. 如果保险起见就再做一个后置检查,去读你的 messages 记录里的 function call 是否有成功调用 sku 查询 3. prompt 里加入详细的流程例子做引导 4. 如果效果还是不好,在前置 node 里做用户 query 标准化转写 5. 最后不要用 4o-mini ,性能太弱,不要用 dsv3 ,指令遵循不行,虽然以我的经验来看 4o 实际不适合 react 的场景,如果可能可以酌情使用更好的模型(带 thinking/混合 thinking 模式),不行就算了 |
![]() |
10
litchinn 52 天前
可以试试一楼的,分阶段做
|
![]() |
11
huangrong 52 天前
@dongcxcx 首先你可以让 AI 帮你改改 prompt ,看看有没有可改进的地方,主要是给他提使用现有 prompt 可能恢复发生的问题,让他尽量完善 prompt 。
我目前没在流程中让 AI 调用工具。我现在的流程主要还是通过代码来约束。 比如按照你的流程,我会先让 AI 进行产品识别,通过分类等维度使用代码确认产品类别是否存在,如果不存在则重复。此时 AI 的能力仅仅是提供产品类别或者是在商品列表中选出最有可能的商品,出错的概率会稍微小一些。 |
12
dongcxcx OP 1.我当时用 langgraph 去做,确实是这样的。最前面是一个意图识别节点。判断用户是初次报价,继续报价,还是乱七八糟的问题,也不是 100% 正确。加上太多的 if-else 判断,让我感觉是全靠我在控制流程,ai 起到的作用仅仅是识别自然语言,提取字段的作用。就被我放弃了。
@maolon 我再试试其他模型试试 |
13
dongcxcx OP 另外,有没有推荐的模型。谢谢🙏@maolon
|
14
maolon 52 天前
@dongcxcx #12 kimi k2 试下?
我的意思不是用前置 node 判断用户意图(意图识别在模型性能不够强的情况下非常容易出错),而是简单判断信息是否完整,相当于做一次前置过滤,将用户问题按标准化格式转写也是一种方法 |
![]() |
15
Clannad0708 52 天前
你的 function 里面的 description 要写的清楚,建议构建一个购物的流程体系,比如给 function 打上标签,前期中期后期,通过标签调用控制试试
|
![]() |
16
iyaozhen 52 天前
感觉你的思路有点问题
你的工具也很很奇怪,而且工具带有流程 “如果无法判断,请返回 "未知",并使用 askUser 工具向用户提问” “调用后必须结束本轮回复” 没见过这么写的 “ 每次调用工具前,你都必须先输出 Thought 、Action 和 Action Input ” 这些框架都做了吧,不需要你自己写。“ [重要规则] ”里面的每一条都很奇怪 “用于计算最终报价。仅当用户已补全所有字段时调用” 这样写也不对,你哪些字段必填,function call 声明好就行。 而且你不要想一步解决,当然不是说模型做不到,而是你的思路要清晰。 就像 1 楼说的分步骤。 第一步就是需求澄清:基本上是个 ReAct 过程,只给一个函数,query sku ,连通数据库做确定性的查询,让大模型不断解析用户语义,做查询,比如用户说的是 iphone16 pm ,让大模型能转换 query 变成 iphone16 pro max 去查 sku 差不出来,你自己流程控制,再去让用户说清楚点 查询出来后可能多个 sku ,给用户总结说明下就差不多了吧 |
![]() |
17
raydied 52 天前
如果是固定流程的话,为什么不是有多个选择器呢?
你的场景属于高固定场景,类似我之前的一个场景,AI+系统——主打语音助手。 个人感觉还用不到 lang-graph 、以及 moe+too-luse 的模式。 我们当时的做法是 slot+固定 function 调用。 - 通过 chatgpt4o-mini 的微调,按照模板,大概列一下目标场景和预期的 slot 模板, - 调用固定 function --- 如果是多 function ,才需要用到模型的 function-call 功能。此时,也需要尽量高度抽象你的 function 。 如果是 tool-use ,则需要更加复杂的场景。 |
18
Scarb 52 天前 ![]() 我感觉你这个用不着这么复杂的流程。
直接把所有产品名作为上下文给大模型,然后问他:用户问的是产品库里的哪个产品 |
19
dongcxcx OP @iyaozhen askUser 工具 “调用后必须结束本轮回复” ,之所以加上这条奇怪的规则,是因为在测试中发现,大模型经常会脑补,比如,我故意写一个不支持的产品类型,按理说,askUser 此时应该调用,提示用户补充信息。但是此时 function call 并没有结束,仍然在调用后面的 function call, 它脑补了一个类型,然后调用 parseSku.
|