如何让 AI 稳定的输出指定 json 结构

116 天前
 chouqiu

需求是:提取 word 文档内容,翻译成多个语种

目前的实现方式是把 word 文档里的 xml 内容提取出来,整理成一个 list ,结构如下:

["待翻译的文本一", "待翻译的文本二"]

使用的 prompt 如下:

system prompt

你是一个{industry}行业的{language}翻译专家,请将用户输入的文字翻译成{language},翻译结果需要严格按照用户输入的 JSON 内容进行翻译,翻译后返回的 JSON 结构与用户输入的 JSON 结构需要完全一致。请参考用户输入的术语库翻译 JSON 数组内容,翻译结果输出 JSON 格式。

下面是一个用户输入内容示例:
术语库:
{"你好": "hello", "什么": "what"}
需翻译的 JSON 内容:
{"filename": "这是文件名", "items": ["你好", "这是什么", "你好"]}

请严格按照下面的要求输出翻译结果:
1. 翻译结果为合法的标准的 JSON 对象字符串(不要输出 markdown 格式),不要过度转义,输出稳定的合法的标准的 JSON 对象字符串
2. 翻译结果 JSON 包含 filename 和 items 两个 key ,并保证 items 数组元素数量和待翻译的 items 数组元素数量一致
3. 翻译结果需要严格按照用户输入的 JSON 内容进行翻译,翻译后返回的 JSON 结构与用户输入的 JSON 结构需要完全一致,并保证 items 数组元素数量和待翻译的 items 数组元素数量严格保持一致。
4. 输出示例:{"filename": "this is filename", "items": ["hello", "what is it", "hello"]}

user prompt

术语库:
xxxxxxxxxx
需翻译的 JSON 内容:
xxxxxxxxxx

但是 AI 的响应结果,有时是 json 格式,有时是 markdown 格式,有时返回的 json 里面,items 的数量和待翻译的数量又不一致

3723 次点击
所在节点    程序员
35 条回复
anexplore
116 天前
通过 function_calling(or tools)实现 Structured Output
chouqiu
116 天前
收到,谢谢各位,我研究下 response_format ,都不知道这个
zhangkunkyle
116 天前
BeautifulSoap
116 天前
模型支持 json mode 或者 structured outputs 的话时最简单的
如果不支持但支持 function call ,那就用 function call
如果不支持 function call ,那么这里有个很全的整理

https://www.boundaryml.com/blog/structured-output-from-llms
lasuar
116 天前
langchain 支持 结构化输出
findstrx
116 天前
如果是调用 API 的话,有一个参数,可以强行指定 json 返回,这比在提示词里强调效果要好的多
mkroen
116 天前
怎么没人提 pydantic-ai ,可以将 BaseModel 派生出的类作为参数传入,工具会自行校验返回结果
Hundredwz
116 天前
自己部署的话,可以看看 sglang ,支持[结构化输出]( https://docs.sglang.ai/backend/structured_outputs.html),vllm 应该也一样。
如果使用 api ,openai 是支持的,其他的没调研过,不了解了。
Hundredwz
116 天前
conn457567
116 天前
可以试试 json-repair 这个库,一些小的格式错误它能修复
macaodoll
116 天前
结构化输出,这个开关打开,不过也得看你用的模型支持不支持,
m319
115 天前
除了 api 中指定结构化输出以外,还有一个提示词层面的小技巧,由于 llm 会模仿输入的格式,所以只要输入格式也用 json 就行,不过也看模型指令遵循情况

如何让大语言模型输出 JSON 格式? - HowardZhangdqs 的回答 - 知乎
https://www.zhihu.com/question/656512469/answer/3515553778
wxxxcxx
115 天前
可以学习下 anthropic 的提示工程文档,里面很多技巧是通用的。

https://docs.anthropic.com/zh-CN/docs/build-with-claude/prompt-engineering/prefill-claudes-response
wxxxcxx
115 天前
@wxxxcxx 一般可以使用 xml 结合示例,然后使用预填充,能达到比较好的效果
realJamespond
115 天前
不听话可以微调 lora 参数随机生成 1000 条指定格式 json 数据

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1134871

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX