【口袋专家AI公开课】从0到1智能体开发(八):法律专家Agent原理与实战

一、引言

口袋专家AI是什么?

口袋专家AI,是一款为超级个体打造的云端个人智能体 App。 愿景是:"让每个普通人,都能拥有一支 AI 专家团队,成为超级个体" 。

使用口袋专家AI像使用微信一样简单:通过专家对话、专家广场、专家群、专家圈4大功能,让一支200人的AI专家团队随时听候您的调遣。

|-----------------------------------------------------------------------------|-----------------------------------------------------------------------------|
| | |
| | |
| ||

口袋专家AI预置了100多个面向企业工作的专家智能体,细分为运营部、产品部、技术部、设计部等15个公司部门;

口袋专家AI预置了100多个生活专家智能体,覆盖衣(购物比价)、食(团购订外卖)、住(民宿酒店找优惠)、行(订票打车)等各个方面。

口袋专家AI还是一款社交型AI,将你与AI专家共创的短剧、图片、视频等优质作品分享到专家圈,其他AI专家会来给你鼓励,且用户将会看到并为你点赞。

本篇:法律专家原理与实战

本篇以法律专家为例,先通过"被裁员,公司只给 N,合法吗"看它如何完成任务,再结合"calculate:算式题为什么不进沙箱"一节,拆解人设提示词与执行流程,讲清这类智能体从使用到开发的过程。

二、应用篇:法律专家能帮你做什么

2.1 在哪儿找到它

法律专家在「专家广场」的「企业专家 · 法务部」下,也可以在「对话」页右上角直接搜。它的开场页:

它给自己定的能力是条款解读、风险标注、维权指引、联网搜索。开场建议的三个问题都是打工人的日常:

• 公司让我签竞业协议但没有补偿金,合理吗?

• 试用期六个月工资打八折,这合法吗?

• 被裁员了,N+1 怎么算?帮我算一下:工作 3 年 2 个月,月薪 1.5 万

2.2 示例:被裁员,公司只给 N,合法吗

我们给了一个比第三条开场示例更完整的版本------把城市、工龄、工资口径、手上的材料、签没签协议都交代清楚:

我在杭州一家互联网公司, 入职 3 年 2 个月, 上周被通知裁员, 公司说只给 N。我月薪 1.5 万 (税前, 近 12 个月平均), 手里有劳动合同和工资流水, 目前还没签任何协议。N+1 该怎么算? 公司只给 N 合法吗? 我下一步该怎么做?

100 秒出答案。几个值得注意的地方:

先纠正问法。 第一句结论:"公司只给 N,在绝大多数裁员情形下是不合法的。你的合理预期不是 N+1,而是 2N = 10.5 万元。"接着一张表把三个概念分开:N 对应第 46、47 条,N+1 对应第 40 条且"仅限"三种情形加"未提前 30 日书面通知",2N 对应第 87 条违法解除。表下两句最有用:"「+1」不是裁员的标配","N+1 和 2N 不能兼得"。

算式给全,基数说清。 年限按第 47 条:满 3 年算 3 个月,剩下 2 个月"不满六个月"按半个月,N = 3.5;基数是解除前 12 个月平均应发工资。封顶线也查了:浙江 2023 年度加权平均工资 8310 元/月 × 3 = 24930 元/月,15000 元没超,全额按实际工资算。三行表:

方案 算式 金额
公司给的 N 15000 × 3.5 52,500 元
N+1 15000 × 4.5 67,500 元
2N(违法解除) 15000 × 3.5 × 2 105,000 元

讲清公司为什么站不住。 裁员通常走两条路:第 36 条协商解除------"你有权不还价地拒绝";第 40 条第 3 项"客观情况发生重大变化"------公司要举证真有重大变化(部门整体撤销,而不是"这个岗位优化掉了"),且已就变更合同跟你充分协商过。它引了杭州余杭的一个同类案子:法院认定公司没举证充分协商,构成违法解除,维持 398,880 元赔偿金(该案月薪超三倍,按 24930 元封顶计算)。

行动建议按顺序排,每步有时限和材料。 第 1 步"不签、不闹、留证":带"双方再无争议""自愿""已结清"字样的一律不签,趁权限没收回备份合同、工资条、考勤和谈话录音,还特意提醒别拷贝公司代码和客户数据------"那会给公司反诉你泄密的把柄"。第 2 步书面回函,争取 2N、底线 N+1;第 3 步打 12333 投诉年假、加班费这些"独立的钱";第 4 步仲裁,写明 1 年时效、不收费、45 日审限,连请求事项怎么写都给了。

最后三个容易踩空的细节:补偿在当地上年平均工资 3 倍以内免个税(它算的是 8310 × 12 × 3 ≈ 29.9 万元,10.5 万全额免税);年终奖要单独主张;竞业条款要么让公司书面放弃,要么启动后按月拿竞业补偿。

结尾是那句固定提示,后面按个案补了一句:涉及 10 万元以上的争议,签署任何文件前咨询杭州执业劳动法律师(可先打 12348 免费法律咨询)。

拿去谈之前,建议再确认一件事:答案重点讲了协商解除和第 40 条两条路,如果公司是按第 41 条经济性裁员走完了法定程序(提前 30 日向工会或全体职工说明情况、听取意见、向劳动行政部门报告),法律上只需支付 N。先问清公司依据的是哪一条,再决定按 2N 还是 N+1 去谈------这也正是答案第 1 步里让你书面索要"解除依据"的用处。

2.3 过程:两次搜索、一次读页、三次计算

点开「过程 · 4 步」:

• 第 1 步 :思考里它先犹豫了一下------技能库里有一份「用人单位劳动合规」,说明里写着"算离职补偿";但它注意到"那个技能是站在用人单位角度的。用户是劳动者",这一轮最终也没有调用它。然后说"我先核实一下浙江 / 杭州 2025 年度经济补偿的计算基数(社平工资口径)和代通知金的适用条件,再给你算",同一步里接连调了「联网搜索」(杭州补偿基数、浙江平均工资封顶、N+1 与 2N 的适用情形三个角度)和「计算器」(15000 * 3.5)。

• 第 2 步:思考把三种解除路径理清------第 40 条才有"+1",第 41 条合法裁员只付 N,违法解除 2N。然后「读取网页」一次并行打开两页:浙江省人社厅网站 2025 年 9 月 18 日的一页、一篇杭州律师谈封顶口径的问答;同一步还发了一次「联网搜索」,专查浙江加权平均工资和杭州的封顶口径。

• 第 3 步 :记下核实结果------2023 年度加权平均工资 99722 元(8310 元/月)、三倍上限 24930 元、余杭的同类案例,以及用户 1.5 万远低于封顶线,"不用纠结封顶基数到底用哪个口径"。然后两次「计算器」:15000*3.5、15000*4.5。

• 第 4 步:确认 2N = 105000,判断 2024 年度的数字虽然没查到但不影响结论,开始写答案。

三、技术篇:法律专家是怎么构建出来的

3.1 一位专家 = 一份配置

整体架构在第二篇(旅行专家)3.1 节讲过:客户端 → 准备阶段(装配人设、记忆、工具、技能)→ 思考模式的回合驱动器 → 交付层。法律专家的预置配置:

复制代码
{
  "id": "preset-labor-law",
  "name": "法律专家",
  "department": "法务部",
  "description": "合同条款逐条解读, 试用期/加班/离职补偿等问题给出依据与行动建议",
  "capabilities": ["条款解读", "风险标注", "维权指引", "联网搜索"],
  "tools": {"web_search": true},
  "legacy_names": ["劳动合同避坑助手"],
  "system_prompt": "你是熟悉中国劳动法实务的法律助手, 帮打工人看懂合同、算清补偿、避开常见坑。..."
}

两处值得一提:

• legacy_names:它以前叫「劳动合同避坑助手」,和人设开头的"帮打工人"是一个意思------立场写在出身里,3.4 节讲为什么这很重要。

• tools 只声明了 web_search。领用时展开成这位专家的工具配置:

复制代码
def preset_agent_config(preset: dict) -> dict:
    """预置 → agent_config (与 agent_builder.make_agent_config 同形)。
    tools 基线: 常规工具恒开, web_search/open_url 与 python_execute 由预置声明。"""
    ...
        "tools": {
            "web_search": web,
            "open_url": web,
            "calculate": True,
            "image_understand": True,
            "api_call": True,
            "python_execute": bool(tools.get("python_execute")),
        },
        ...

联网搜索和读网页一起打开;计算器恒开;Python 沙箱没有声明。不过要注意,这份配置是"声明"而不是"闸门":运行时的工具开关以平台统一配置为准(第二篇讲过"工具是平台级的"),法律专家这一轮手上其实也有 Python 沙箱。它三次算补偿都选了 calculate------3.3 节从这里说起。

3.2 人设提示词:先定立场,再谈法条

法律专家的人设,线上原文:

复制代码
你是熟悉中国劳动法实务的法律助手, 帮打工人看懂合同、算清补偿、避开常见坑。
开工前先定两件事: (1) 你现在是什么身份与阶段 (在职 / 已离职 / 已发生争议); (2) 手上有什么材料 (合同、工资流水、考勤、聊天记录)。对抗性问题还要先确认本方立场, 立场搞反建议会完全相反 ------ 不确认不往下走。规则:
1. 解读合同条款时逐条标注: 正常条款 / 需注意 / 明显违法或高风险, 并解释对用户的实际影响。
2. 涉及具体法条与标准 (试用期上限/加班费倍数/经济补偿计算) 时给出依据名称与条文要点; 拿不准或可能有新规时先联网核实, 绝不编造法条编号。
3. 补偿计算给出完整算式与结果, 列明假设条件; 用户没提供的数字 (工龄、月均工资、当地社平工资) 标注「待确认」并说明它会怎样改变结果, 绝不替用户填。
4. 给行动建议按升级顺序: 留证 → 协商 → 劳动监察投诉 → 仲裁, 说明每步的时限与所需材料。
5. 结尾固定提示: 本回答是一般性法律信息, 不构成正式法律意见, 重大争议建议咨询执业律师。

对照实跑:

• "开工前先定两件事 + 确认立场":用户一句话里全交代了------在职、刚被通知裁员、没签协议(身份与阶段),有合同和工资流水(材料),自己是被裁的一方(立场),所以它没有追问。第 1 步思考里专门点出那份技能"是站在用人单位角度的。用户是劳动者",就是立场意识。

• 第 1 条"逐条标注":这次没给合同原文,没触发。

• 第 2 条"依据名称与条文要点":第 36、40、46、47、87 条都和"适用情形"一起出现,不是光秃秃一个条号;封顶线和平均工资是先联网查的。

• 第 3 条"完整算式 + 假设条件":每个金额都配算式;注明基数是 12 个月平均应发工资、含奖金津贴加班费,就是在列假设。唯一用户没给的当地平均工资,它去查了,并判断出用哪个年度的数字都不影响结论。

• 第 4 条"升级顺序":答案第四节就是"留证 → 协商 → 投诉 → 仲裁",仲裁那步有时效、审限和材料清单。

• 第 5 条"结尾固定提示":有,还按个案补了一句:10 万元以上的争议,签署任何文件前先咨询执业律师。

写高风险领域人设的经验:写清楚什么时候该停。 这份人设里有三个"停"------立场不清不往下走、法条拿不准先去查、数字没有就标"待确认"------外加一个固定出口(结尾提示)。模型最容易犯的错不是不会答,而是在不该答满的地方答满了;把"停"的条件写成规则,比写"请谨慎"有用得多。

3.3 calculate:算式题为什么不进沙箱

经济补偿是典型的"算式题":公式法定、输入就几个数,难点在判断用哪条公式,不在算术。平台给这类题的工具是 calculate,说明只有一行:

复制代码
if tools_cfg.get("calculate", True):
    specs.append({"name": "calculate", "desc": "计算数学表达式 (加减乘除/幂/取余)",
                  "args": '{"expression": "(120-80)/80*100"}'})

第三篇讲过,提示词第 5 层工具段里,只要 python_execute 或 calculate 在场就会拼进这一句:

复制代码
(103, ("python_execute", "calculate"),
 "数据类结论 (统计、汇总、换算、财务算式) 必须算出来, 不心算不估算: 用 python_execute 跑 pandas / numpy 并 print 结果, "
 "单个算式用 calculate; 算不出来就说算不出来。数字数、字数这种不用工具。"),

分工写得很清楚:统计、表格、批量换算走 Python 沙箱;单个算式用 calculate 。拼接规则是"列出的工具有一个在场就整段拼进去",所以法律专家看到的也是这一整句;经济补偿这种"一个算式出一个数"的题,它按后半句选了 calculate。

为什么单个算式不进沙箱? 看实现就明白了。calculate 不起容器,就在 API 进程里用 AST 白名单求值:

复制代码
def _safe_calc(expr: str) -> str:
    """AST 白名单四则/幂/取余计算器 --- 不用 eval 裸跑用户/LLM 给的表达式。"""
    expr = (expr or "").strip()
    if not expr or len(expr) > 200:
        raise ValueError("表达式为空或过长")
    node = ast.parse(expr, mode="eval")
    allowed = (ast.Expression, ast.BinOp, ast.UnaryOp, ast.Constant,
               ast.Add, ast.Sub, ast.Mult, ast.Div, ast.FloorDiv, ast.Mod,
               ast.Pow, ast.USub, ast.UAdd, ast.Tuple)
    for n in ast.walk(node):
        if not isinstance(n, allowed):
            raise ValueError(f"不支持的语法: {type(n).__name__}")
        if isinstance(n, ast.Constant) and not isinstance(n.value, (int, float)):
            raise ValueError("仅支持数字")
        # 防大整数撑爆 CPU: 幂的指数必须是 ≤64 的字面量常量。9**9**9 右结合 →
        # 外层指数是 BinOp(9**9), 若只拦"常量>64"会漏过并真的去算天文数字 (实测
        # 单核 100% 假死), 所以非常量指数一律拒绝。
        if isinstance(n, ast.BinOp) and isinstance(n.op, ast.Pow):
            if not (isinstance(n.right, ast.Constant) and abs(n.right.value) <= 64):
                raise ValueError("指数必须是不超过 64 的数字")
    val = eval(compile(node, "<calc>", "eval"), {"__builtins__": {}}, {})  # noqa: S307
    return f"{expr} = {val}"

安全靠三层:

  1. 先解析、再白名单。 语法树上只允许数字常量、四则、整除、取余、幂、正负号;函数调用、属性访问、变量名一律拒绝,__import__('os') 这类东西过不了白名单。

  2. 防"合法但算不完"的表达式。 9**9**9 全是数字和幂,白名单拦不住。注释里写着实测:外层指数是一个 BinOp,只拦"常量大于 64"会漏过去,结果单核 100% 假死。所以幂的指数必须是不超过 64 的字面量。

  3. eval 时清空内置函数,表达式限长 200 字符。

求值失败抛的 ValueError 由工具执行器统一接住,变成"工具 calculate 执行失败: 不支持的语法: ..."加一段重试须知回给模型,不会打断整轮。

反观 Python 沙箱:每次调用都起一个全新的断网容器(第三篇 3.3 节),默认超时 20 秒、并发有上限,而且 python_execute 在按次计费的工具名单(_BILLABLE_TOOLS)里,calculate 不在。为了一个 15000 * 3.5 起一个容器,是用大炮打蚊子。

和法律场景很合拍的一点:返回值是"表达式 = 结果"(如 15000*4.5 = 67500.0),原样出现在过程区里,用户能对一遍------正是人设第 3 条"给出完整算式与结果"要的。

这一轮的三次调用是:第 1 步 15000 * 3.5(拿到初步的 N),第 3 步核实完封顶线后再算 15000*3.5 和 15000*4.5。答案三行表里 N 和 N+1 两个金额,都能在过程区里找到对应的那一行。因为 calculate 不计次收费、也不起容器,模型边查边算、查完再复核一遍,几乎没有额外成本------工具越便宜,"数字必须算出来"这条规则就越容易被守住。

3.4 边界怎么写:人设管领域,平台管底线

人设里有四条"边界"规则:立场确认、不替用户填数字、绝不编造法条编号、结尾固定提示。它们和平台层是什么关系?先看平台层。思考模式下,每位专家的系统提示里都有一段共同规则,第一条是:

复制代码
"- **结论只来自查到的事实和拿到的材料**。没查到就说没查到; 数字、来源、法条、事件, 一个都不许编。"
"**网址也不许猜**: 要看某个网站, 先搜到它的真实地址再打开 / 截图, 别按名字拼域名; 搜到的页面是不是对方的官网, 看页面内容, 不看域名像不像。\n"

"法条"两个字是写在平台层的------旅行专家、会计专家、医疗专家都受这句约束。加上两段工具段(3.3、3.5 节)和澄清用的 ask_user 工具,把这几层摊开:

约束 写在哪
数字、来源、法条、事件不许编;网址不许猜 平台共同规则(所有专家)
搜索摘要不算读过,引用时给链接 平台工具段(open_url 在场时)
数据类结论必须算出来 平台工具段(计算工具在场时)
答案会改变做法时先问一句 平台工具 ask_user(有人在看的对话)
先确认立场,不确认不往下走 法律专家人设
没给的数字标「待确认」,不替用户填 法律专家人设
拿不准或可能有新规时先联网核实法条 法律专家人设
结尾固定提示"不构成正式法律意见" 法律专家人设

分工的原则是:平台层只放"对所有领域都成立"的底线,人设放这个领域特有的"怎么才算做对"。 逐条看人设里那四条为什么要单独写:

① 立场确认。 劳动争议是对抗性的:同一句"裁员怎么给补偿",HR 问和员工问,正确答案的方向相反。技能库里就同时存在两种视角------第 1 步思考里差点加载的那份「用人单位劳动合规」技能,自己的"何时用 / 不用"里写着:"不用: 劳动者个人维权诉讼策略(视角相反)"。

人设那句"不确认不往下走",在平台上对应的动作是 ask_user:

复制代码
"desc": ("向用户提一个澄清问题并等待回答 (最多 60 秒)。只在**答案会改变"
         "你接下来的做法**时用: 关键口径二选一、缺少必要信息、方案分叉需要"
         "用户拍板。不要用它确认无关紧要的细节, 不要连续多问, 全程最多 2 次。"
         "options 给 2-4 个供点选的候选 (用户也可自由输入)。"),

"立场二选一"正是"答案会改变做法"的典型:平台层管"什么时候值得问、最多问几次",人设管"在这个领域,立场就是值得问的那件事"。

② 不替用户填数字。 补偿公式是确定的,输入却很敏感:工龄差几个月,N 可能从 3.5 变成 4;工资按应发还是实发,基数就不一样。模型替用户"合理假设"一个数,得到的是精确但错误的金额,而用户会拿着它去谈判。标"待确认"并说明它怎样改变结果,等于把缺失信息变成一句敏感性说明。

③ 绝不编造法条编号。 平台层已经写了"法条不许编",人设再写一遍,是补上平台层给不了的范围 (试用期上限、加班费倍数、经济补偿这些地方性、年度性强的标准)和动作(拿不准先联网核实)。编出来的条号比不写更糟------用户会拿去和 HR 对质。

④ 结尾固定提示。 平台的共同规则里没有免责声明:它是领域性的,放进共同规则,旅行专家排行程也得挂一句"不构成法律意见"。写成"固定提示"而不是"适当提醒",是为了让它每次都在;这一轮模型在固定那句之后按个案补了一句(10 万元以上的争议、签字前先咨询律师)------固定的部分保底,补充的部分贴近个案。

3.5 open_url:搜索摘要不算读过

法律问题对"原文"的依赖比大多数领域都重:一个地方口径、一个判例的裁判理由,搜索摘要里往往只有半句。open_url 的工具说明把这件事说得很重:

复制代码
specs.append({"name": "open_url",
              "desc": "打开网页读取正文。**url 可以是一个链接, 也可以是最多 5 个链接的数组 --- "
                      ...
                      "⚠️ 搜索结果只给标题和几百字摘要, **不足以支撑事实陈述、数字引用或判断结论** --- "
                      "要写进产出的关键事实 (金额/时间/当事方/因果), 必须打开原文核实过再写; "
                      ...
                      "多搜少读 = 罗列一堆标题却没有洞察, 是最差的产出形态。"

提示词第 5 层的工具段再补一句做法:

复制代码
(101, ("open_url",),
 "搜索摘要不算读过。open_url 一次并行打开 3-5 个最相关的页, 作者、日期、规格、原文都在正文里。页面空 (只剩导航) 就换下一条命中接着读; "
 "相关命中没读完不许下「查不到」的结论。引用时给链接。"),

为什么摘要不够:搜索结果交给模型时,每条命中只带标题、链接和前 400 字(r['content'][:400])。400 字够判断"这页值不值得读",不够支撑"金额 / 时间 / 当事方 / 因果"。

几个上限(以代码为准):

项 值 出处
一次并行打开 最多 5 个链接 MAX_PARALLEL_URLS = 5
单页一次读 6 万字 PAGE_WINDOW_CHARS = 60_000
并行时每页 总预算 24000 字按页数均分,每页不少于 3000 字 per = max(3000, (OBSERVATION_LONG_CHARS - 1000) // len(urls))
续读缓存 15 分钟、最多 12 页 _PAGE_CACHE_TTL = 900.0

这一轮第 2 步并行开了 2 页,每页的额度就是 (24000 − 1000) ÷ 2 = 11500 字。

长页续读。 单页读不完时,观察末尾会明说"这页还有 N 字没读",并写好带 offset 的下一次调用。这是事故逼出来的:原先超出上限的部分被静默砍掉,模型就当读全了。续读从缓存里切,不算调研次数("那是同一次阅读的下半截, 不是又查了一次"),也不重复计费。

读页管线。 一个链接从打开到交给模型,走的是 page_reader.read_url:

复制代码
async def read_url(url: str, http, cap: int) -> dict:
    """完整读页管线: (飞书文档走专门读法) → 直抓 → 体检 → (被拦/失败时) 住宅代理重试 → 体检。
    ...

• 直抓:浏览器同款请求头,手动跟随重定向,每一跳都过 SSRF 检查(原先只查第一跳,公网链接 302 到内网会被照抓)。

• 抽正文:bs4 + lxml 做 readability 式主内容定位,剔除导航、页脚、侧栏,输出带小节、列表、表格行的结构化文本。

• 体检 :diagnose 识别 404、被拦(403 / 429 / 503 或"安全检测""拖动滑块"这类验证页)、JS 渲染空壳、无正文。绝不把验证页当正文喂给模型。

• 重试与兜底:失败时换出口重试一次(JS 渲染页除外),再不行走第三方读页兜底,都失败就回一句类型化的失败说明。

反爬、验证页、前端渲染,网页读不到并不罕见。这条管线的取舍是:能救就自动救(换出口、换读页服务),救不回来就让模型拿到一句明确的"未取到正文"和原因,由它决定换哪一页或换个角度再搜------而不是拿一页验证码当原文去写答案。

调研次数也有预算:单专家一轮里搜索和读页每调一次记一次,到 12 次提醒"资料一般够写了",到 20 次不再执行(开了「深度调研」翻倍)。这一轮只用了 3 次。

3.6 参考文献:只挂正文真引用了的

答案末尾那个折叠的「参考文献 · 5」不是模型写的,是交付层 _deliver_references 追加的,注释写得很直白:"用真实链接程序化追加 (不靠 LLM 复述 URL, 保证准确)"。模型复述 URL 容易抄错字符,甚至编一个看起来合理的链接;平台另一条"单独成文"路径的提示词里也写着"不要自己写「参考文献」小节 (系统会用真实链接自动附在末尾)"。

来源从哪来。 _collect_sources 从工具记录里抽:真读到正文的页排最前,然后是和搜索词有足够重叠的命中("与查询八竿子打不着 (歌词站 / 同名偶像页)"的跳过),上限 25 条。打开失败的页不算"读过"。

挂哪几条。 关键在 _cited_refs:

复制代码
def _cited_refs(answer: str, sources: list, fallback: int = 5) -> list:
    """参考文献只挂正文真引用了的 ([n]), 保留原编号 (2026-09-24 验收「资料链接太多」: 小红书一篇笔记底下挂 17 条,
    近一半是歌词站)。正文一个编号都没引时: 正文自带来源行 (技能版式「📎资料参考:...」) 就不再挂第二份清单 ------
    否则「复制全文」连清单一起带走, 可复制的笔记里多出一截链接; 没带就挂前 fallback 条 (_collect_sources 已把读过的排在前面)。
    返回 [(编号, 来源), ...], 可能为空。"""
    nums = sorted({int(n) for grp in _CITE_RE.findall(answer or "") for n in re.split(r"\s*[,,、]\s*", grp)
                   if 1 <= int(n) <= len(sources)})
    if nums:
        return [(n, sources[n - 1]) for n in nums]
    if _OWN_SOURCES_RE.search(answer or ""):
        return []
    return list(enumerate(sources[:fallback], 1))

三档:

  1. 正文有 [n] 编号 ([3]、[1][3]、[1, 3]、[1、3] 都认):只挂这几条,保留原编号,和正文对得上。

  2. 没有编号,但正文自带来源行(如小红书技能的"📎资料参考:..."):不再挂第二份。

  3. 都没有:挂前 5 条,读过的排在前面。

最后由 _refs_block 按回复语言出标题(中文、日文是"参考文献",其余是 References;幻灯片则是 deck 最后一页"参考来源")。各端客户端认这两个标题、把整节折叠,所以长图底部只是一行「参考文献 · 5」。

这一轮的答案是模型直接写成的,正文没有用编号标注,走的是第 3 档:排第 1 的是这一轮真正读过正文的那页律师问答,后面是和查询词对得上的搜索命中(经济补偿基数、应发工资口径之类)。如果你自己建一位法律类专家、希望每条依据都精确对号,可以在人设里加一句"关键法条与判例后用 编号 标注来源",参考文献就会只列正文用到的那几条。

3.7 这一轮花了多少

项 数值
耗时 100 秒
模型调用 6 次
工具调用 6 次(2 次联网搜索、1 次读取网页、3 次计算器)
tokens 65,176,其中 25,088 命中缓存
计费 约 8.3 积分

六次工具里三次是计算器,不按次计费;花销主要在搜索和读页带进上下文的资料,以及思考模式下每步重发的上下文(三成多命中了前缀缓存)。和第九篇销售专家(约 1.1 积分)比贵在"查",和第三篇数据专家(约 10.5 积分)比省在"算"------单个算式不用起沙箱。

四、你也可以:在 App 里一句话创建自己的专家

口袋专家AI正在筹备专家合伙人计划,支持用户贡献自己精调过的专家,产生收益后,用户将获得分成。让我们一起将口袋中的专家越做越好。

法律专家管的是劳动法。如果你常碰的是别的纠纷,比如租房,可以建一位专属的:

  1. 打开「专家广场」,点顶部的「新建专家」卡片

  2. 用一句话描述,比如"专门处理租房纠纷:押金不退、提前退租、中介费,站在租客一方给依据和行动步骤"

  3. 服务端一次生成名字、人设提示词、能力标签、开场示例和头像

  4. 预览没问题就「开始对话」

"站在租客一方"这半句值得写上------对抗性的领域,立场是人设里最要紧的一句。生成的人设可以随时在设置页改,比如照着法律专家补上"没给的数字标待确认"和结尾提示;它和官方专家跑同一条流水线,联网搜索、读网页、计算器一样不少。

五、总结

本篇以法律专家为例,拆了一位"高风险领域"智能体是怎么构建的:

• 应用上,它把通用助手"顺着问法算、标准可能过时、不分立场"的毛病反过来:用户问 N+1,它先说"+1 不是裁员的标配",再把 N / N+1 / 2N 连同条文和算式列成表;封顶线先查再用;行动建议从"什么都别签"开始,按留证、协商、投诉、仲裁排好顺序。用之前记得先问清公司依据的是哪一条解除路径。

• 技术上 ,一位法律类专家 = 一份写清"什么时候该停"的人设 + 平台层"法条、数字、来源不许编"的底线 + 两个工具和一道交付规则:calculate 用 AST 白名单在进程内求值,返回"表达式 = 结果",算式可核对;open_url 并行最多 5 页、单页 6 万字、长页带 offset 续读,识别验证页和空壳页,读不到就如实说;参考文献由交付层用真实链接追加,正文标了 [n] 只挂引用过的,没标就挂"读过的在前"的前 5 条。

相关推荐
逐步走向自律1 小时前
运维手机应急 + 电脑多终端并行:2026 远程终端选型指南
人工智能·深度学习·机器学习·自然语言处理·数据科学
海带紫菜菠萝汤1 小时前
本周 AI 观察:算力、路由、账本——护城河正搬出模型层
人工智能·ai·程序员·架构·大模型
Wild API1 小时前
蒸馏小模型:独立答题和给大模型打草稿,差在哪里?
人工智能·大模型·知识蒸馏
zt_vicky1 小时前
策略产品视角下的机器学习与知识图谱:从业务需求到模型落地
人工智能·机器学习·知识图谱
AI码上来1 小时前
我把“打电话“和“对讲机“做进了同一个页面
人工智能·实时音视频
镜象科技1 小时前
职业院校AI心理健康解决方案是什么?从一台设备到全周期守护
android·人工智能
愤怒的代码1 小时前
模型量化为什么几乎不损失精度:误差的四道防线
人工智能
YoLo♪1 小时前
PicGo OpenHarmony PC 适配说明
人工智能·机器人·交互
Web3&Basketball1 小时前
决策模型vs GPT-5实测:便宜400倍
人工智能·python·gpt·大模型·ai落地·推理优化·决策模型