学术可视化与科研图表工具:数据呈现技巧全攻略

核心内容摘要

Bookget:连接全球古籍资源的数字导航系统
【STM32实战指南】SPI与8080双模式驱动OLED全解析

手机号地理信息查询工具:如何快速定位号码归属地与实现地图可视化

最近在使用大模型生成测试用例流程大概是先让模型输出结构化的JSON用例再把JSON转换成XMind文件。

但是在实践过程中发现模型输出的JSON经常不合法要么少了括号要么key值带中文符号要么多了一堆说明文字要么双引号嵌套双引号甚至回答半截就断掉的。

最终导致JSON解析失败影响后续导出流程整条链路被卡住。

那么问题来了为什么非要纠结JSON格式输出很多人可能觉得输出文字就行能看懂就好但其实这远远不够。

原因很简单在AI开发中大模型输出的最终结果往往需要被程序继续消费而不是停留在展示层。

比如你想要从模型回答中抽取一些关键信息这个时候怎么给你肯定是结构化的字段信息简洁明了而不是一段模糊的自然语言。

当然结构化的输出不止JSON一种还有很多但在众多结构化表达方式中JSON最常见、最轻量、最兼容前后端都好用生态丰富有很多成熟库天然支持嵌套能表达树形、列表、字典等复杂结构。

Anyway这不重要让我们回到问题的关键大家头疼的是为什么大模型有时候不遵循指令不按照你约定的格式输出即使你在prompt中明确说明了要按照JSON格式返回结果但是它就像一个犟种就是不听你能怎么办总不能不干吧。

本文就带大家把这件事捋清楚为什么大模型总是生成不完整或不合法的JSON常见的坑和错误类型工程上如何保证输出既合法又健壮含prompt模板、校验与自愈策略、实战代码片段为什么从根源上看大模型本质是预测下一个token的概率机器它对格式的理解更多来自训练语料而不是像编程语言解析器那样严格。

常见原因包括自然语言干扰模型会“贴心”地加上解析说明输出时会夹杂评论或解释性语言导致JSON解析失败。

长文本截断在流式或长输出时生成可能中途被截断缺少 } 或 ]。

符号混乱中文全角引号、逗号等混入key/value。

结构化推理错误模型在层级复杂时容易搞错括号匹配、丢字段尤其是嵌套数组里最常见。

不过话又说回来模型追求“像人一样写”而JSON需要“像机器一样严谨”这两者貌似天然矛盾。

怎么做要让大模型生成的JSON可用通常要从前端约束和后端兜底两方面入手。

不要觉得这种很容易这种结构化大模型输出目前已经成为了很多人的研究课题。

输入即输出通过JSON in / JSON out的方式把用户输入本身就设计成一个JSON直接丢给大模型按照模型的从众性模型自然会按照JSON语境来输出。

示例测试用例生成任务输入JSONtask定义目标任务restriction给出JSON限制text就是文本输入format是定义好的输出JSON字段。

{ task: 根据text生成多条测试用例title是用例标题steps是执行步骤expected是预期结果, restriction: 输出必须符合format的 JSON 结构不要添加多余说明, text: 登录功能, format: { case: { title: string, steps: [string], expected: string } } }模型输出JSONPrompt 约束在prompt里明确要求模型返回JSON并且给一个示例JSON作为参考。

还是生成测试用例的例子prompt你是一个测试用例生成器请根据下面的需求文本生成测试用例。

要求

仅输出合法 JSON不要添加任何多余说明文字或注释。

JSON 格式必须参考下面的示例 示例 JSON json { case: { title: 登录成功用例, steps: [ 输入正确的账号, 输入正确的密码, 点击登录按钮 ], expected: 成功进入系统首页 } } 需求文本 系统登录功能这种方式就是在提示词的基础之上别简单的写按照JSON格式返回结果鬼知道能返回什么JSON所以要按照你的需求给定对应返回的JSON案例。

模型参数设置

传入response_format参数如果你用的是OpenAI的API它提供了response_format参数可以设置为{type: json_object}使用模型内置的结构化输出能力。

import openai openai.api_key your-api-key response openai.Completion.create( model, prompt, response_format{type: json_object} ) print(response)但是这种方法也不一定有效最好同时在prompt中按照上面说的加一些输出的JSON格式案例。

调整temperature将 temperature 设为 0或极低以减少随机性。

调整max_tokens使用 max_tokens 合理上限避免无意义的长文本或者被截断注意避免过小导致输出被裁。

那么问题来了像上面的这些做法能100%解决格式化输出的问题吗那你可真的太小看模型了。

像大规模参数量的模型还好一些小规模参数量的模型不遵循指令的问题相对明显。

所以还需要有一些兜底的策略。

第三方库修复代码利用一些第三方库修复工具比如json-repair用于修复JSON字符串中语法错误的情况例如缺失的逗号、引号不匹配或大括号/中括号未闭合等问题。

安装pip install json-repair基本用法from json_repair import repair_json def repair_json_string(broken_json_str): 修复有问题的JSON字符串并转换为Python对象 Args: broken_json_str (str): 有问题的JSON字符串如key没加引号、结尾多逗号等 Returns: dict or list or None: 修复后的Python对象修复失败时返回None try: # 修复JSON字符串 fixed_json_str repair_json(broken_json_str) # 转换成Python对象 fixed_data json.loads(fixed_json_str) return fixed_data except Exception as e: # 修复失败返回None return NoneBad

多了逗号输入{name: 蔡坨坨, age: 18,} 输出{name: 蔡坨坨, age: 18}Bad

未闭合输入{name: test caituotuo, age: 18 输出{name: test caituotuo, age: 18}Bad

混入了中文符号输入{name: “test caituotuo”, age: 18 输出{name: test caituotuo, age: 18}Bad

括号重复输入{name: test caituotuo, age: 18}} 输出{name: test caituotuo, age: 18}更多badcase可以在评论区留言~需要注意的是json-repair无法处理字段直接缺失的情况只能保证现有字段的语法正确性。

JSON片段提取代码提取返回结果中的JSON片段信息对于非法JSON直接舍弃def extract_json_strings(text): 从文本中提取所有有效的JSON对象 Args: text (str): 包含JSON数据的文本 Returns: list: 包含解析后的JSON对象的列表dict或list对象 Examples: 输入: Here is some data: {name: test, value: 123} and [1,2,3] 输出: [{name: test, value: 123}, [1, 2, 3]] ifnot text: return [] json_objects [] i 0 while i len(text): # 寻找JSON对象的开始标记 if text[i] in [{, []: start_char text[i] # end_char } if start_char { else ] # 使用栈来匹配括号 stack [start_char] j i 1 while j len(text) and stack: char text[j] if char : # 跳过字符串内容处理转义字符 j 1 while j len(text): if text[j] and text[j - 1] ! \\: break j 1 elif char in [{, []: stack.append(char) elif char in [}, ]]: if stack: last stack[-1] if (char }and last {) or (char ]and last [): stack.pop() j 1 # 如果栈为空说明找到了完整的JSON结构 ifnot stack: json_str text[i:j] try: # 解析JSON字符串为Python对象 json_obj json.loads(json_str) json_objects.append(json_obj) except json.JSONDecodeError: # JSON无效跳过 pass i j else: i 1 else: i 1 return json_objects输入 json [ {id: 1, name: caituotuo}, {id: 2, name: 测试蔡坨坨, [{id: 3, 输出[[{id: 1, name: caituotuo}]]重试机制当自动修复失败或数据关键信息缺失时向模型重新提问大模型偶尔一时的抽风不代表全部都有问题。

综上当然了以上只是一些基础的用法大模型的格式化输出实际上已经是很多团队和研究者在持续探索的方向。

学习资源推荐如果你想更深入地学习大模型以下是一些非常有价值的学习资源这些资源将帮助你从不同角度学习大模型提升你的实践能力。

全套AGI大模型学习路线AI大模型时代的学习之旅从基础到前沿掌握人工智能的核心技能​因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取

640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。

无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示​因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取

AI大模型经典PDF籍随着人工智能技术的飞速发展AI大模型已经成为了当今科技领域的一大热点。

这些大型预训练模型如GPT-

BERT、XLNet等以其强大的语言理解和生成能力正在改变我们对人工智能的认识。

那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取

AI大模型商业化落地方案作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量。

香蕉文化-香蕉文化应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123