大家是如何限制 LLM 输出格式为 JSON

查看 46|回复 4
作者:lqw3030   
  • 最近遇到一个问题,无论我用哪家(智谱、moonshot 、DeepSeek...等)都会存在有一定概率回复带引导词,或非完整的 json:

    {
        "usage": {
            "prompt_tokens": 185,
            "completion_tokens": 304,
            "total_tokens": 489
        },
        "created": 1717295221,
        "model": "GLM-4",
        "id": "123",
        "error": null,
        "choices": [
            {
                "finish_reason": "stop",
                "index": 0,
                "message": {
                    "role": "assistant",
                    "content": "根据您提供的信息,我为您做了以下规划:\n\n```json\n{\n  \"planDays\": [\n    {\n      \"dayPlanOrder\": 0,\n      \"dayStations\": [\n        {\n          \"stationName\": \"腾格里沙漠\",\n          \"stationOrder\": 0,\n          \"stationDescription\": \"中国第四大沙漠,体验沙漠探险和沙丘摩托\",\n          \"stationTag\": \"探险,自然景观\",\n          \"stationActivity\": \"沙漠徒步,骑骆驼,沙丘摩托\",\n          \"timeUsed\": 120\n        },\n        {\n          \"stationName\": \"贺兰山\",\n          \"stationOrder\": 1,\n          \"stationDescription\": \"阿拉善著名景点,参观贺兰山岩画\",\n          \"stationTag\": \"历史,文化,自然景观\",\n          \"stationActivity\": \"参观岩画,登山\",\n          \"timeUsed\": 90\n        },\n        {\n          \"stationName\": \"巴丹吉林沙漠\",\n          \"stationOrder\": 2,\n          \"stationDescription\": \"中国第三大沙漠,欣赏沙漠日落\",\n          \"stationTag\": \"自然景观\",\n          \"stationActivity\": \"欣赏日落\",\n          \"timeUsed\": 60\n        }\n      ]\n    }\n  ]\n}\n```\n\n 这个行程涵盖了阿拉善的主要景点,您可以根据个人兴趣选择参加的活动。如果选择自驾出行,可以在景点附近寻找停车场。祝您在阿拉善度过愉快的一天!",
                    "name": null,
                    "tool_call_id": null,
                    "tool_calls": null
                },
                "delta": null
            }
        ],
        "task_id": null,
        "request_id": null,
        "task_status": null
    }
  • 上述 content 字段中期望的理想的是只有纯粹的 json ,但实际字段中多出了“根据您提供的信息,我为您做了以下规划:\n\n```json\n”,并且是 markdown 格式的
  • 尽管我已经在 prompt 中加入了“参照以下格式输出,直接给出规划的结果,不需要添加任何引导性文本,输出的结果符合标准 json 格式{someKey:someValue}”。
    想请教下各位是怎么解决的

  • mekingname   
    我使用 tool calling 来实现。
    定义一个函数,接受 n 个参数,这些参数就是你的 json 里面对应的各个字段。然后让大模型通过 tool calling 去调用这个函数就可以了。在函数里面拿到这些参数,就是你需要的已经格式化以后的数据。
    lqw3030
    OP
      
    @mekingname tool/funcation call 有碰到过非期望响应的情况不
    yinmin   
    调用 api 时,可以是多组对话,因此,你加几组“一问一答”到 message 里,给 gpt 做参考,而不是写在一条信息里
    maolon   
    可能无关: gpt 可以指定 return as json object ,以及比较好奇楼上的 tool calling 能否解决嵌套字段问题?
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部