【个人日志】

Gson 在解析 JSON 字符串时期望一个 JSON 对象开始标记 {,但实际遇到的是一个字符串。这表明传递给 Gson.fromJson 方法的输入并不是一个有效的 JSON 对象。生成的字符串并不是一个标准的 JSON 格式。这是因为把一个复杂的文本传递给了 Gson.fromJson,而这个文本并没有被正确地转换为 JSON 对象。

解决方案

  1. 生成正确的 JSON 格式

    • 需要确保输入是一个有效的 JSON 对象。即使是从模板生成的字符串,也要符合 JSON 格式。
  2. 解析 JSON

    • 在从模板生成的字符串中提取出 JSON 部分进行解析。

示例代码

假设AI 助手返回了一个字符串形式的 JSON,这样做:

package com.sprint.questai.tool;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.sprint.questai.model.entity.UserCaseInfo;
import com.sprint.questai.model.enums.ChatModelEnums;
import com.sprint.questai.service.Assistant;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
import dev.langchain4j.service.AiServices;
import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.Map;

public class LegalCaseToolTest {
    LegalCaseTool tool = new LegalCaseTool();
    ChatLanguageModel model = ChatModelEnums.glm3.getValue();
    Assistant assistant = AiServices.builder(Assistant.class)
            .chatLanguageModel(model)
            .build();

    @Test
    public void test() {
        PromptTemplate template = PromptTemplate.from(",你要分析信息并提取信息,以json的形式返回,注意只需要返回json,不要加上Markdown 标记" +
                "这是用户初始问题{{question}}," +
                "下面是根据查询所获得的法条解释与案例分析:案例:{{cases}};法条解释:{{law}}" +
                "下面我会给你用户提供的最新信息,示例的更新信息的形式如下:我当时把对方打到骨折了,然后想要逃跑的时候被警察带走了" +
                "输出示例如下:{对方伤势:手臂骨折,是否自首:否}" +
                "下面是用户提供的最新信息:{{info}}");

        String info = "信息 是否醉驾:是;酒精浓度:120";
        String question = "我喝了酒开车撞了人,被抓获了,会怎么判刑";
        String cases = "【基本案情】\n" +
                "2020年6月23日晚,邱某酒后驾车途遇南雄交警部门设卡查酒驾,邱某拒不配合交警调查撒腿就跑,并在抓捕过程中激烈反抗,采取咬、抓等方式导致多名交警不同程度受伤。经检测,邱某血样中乙醇含量为15.59mg/100ml,不属于醉酒驾驶机动车,不构成危险驾驶罪。但邱某暴力抗拒抓捕行为已涉嫌妨害公务罪,南雄检察院依法提起公诉。\n" +
                "【裁判结果】\n" +
                "南雄法院认为,邱某无视国家法律,以暴力方式阻碍人民警察依法执行职务,致一人轻微伤,其行为已构成妨害公务罪,犯罪事实清楚,证据确实、充分,依法判处被告人有期徒刑一年六个月。";
        String law = "醉酒驾驶机动车辆,吊销驾照,5年内不得重新获取驾照,经过判决后处以拘役,并处罚金;醉酒驾驶营运机动车辆,吊销驾照,10年内不得重新获取驾照,终生不得驾驶营运车辆,经过判决后处以拘役,并处罚金。\n" +
                "第九十一条,饮酒后驾驶机动车的,处暂扣六个月机动车驾驶证,并处一千元以上二千元以下罚款。因饮酒后驾驶机动车被处罚,再次饮酒后驾驶机动车的,处十日以下拘留,并处一千元以上二千元以下罚款,吊销机动车驾驶证。\n" +
                "醉酒驾驶机动车的,由公安机关交通管理部门约束至酒醒,吊销机动车驾驶证,依法追究刑事责任;五年内不得重新取得机动车驾驶证。\n" +
                "饮酒后驾驶营运机动车的,处十五日拘留,并处五千元罚款,吊销机动车驾驶证,五年内不得重新取得机动车驾驶证。\n" +
                "醉酒驾驶营运机动车的,由公安机关交通管理部门约束至酒醒,吊销机动车驾驶证,依法追究刑事责任;十年内不得重新取得机动车驾驶证,重新取得机动车驾驶证后,不得驾驶营运机动车。\n" +
                "饮酒后或者醉酒驾驶机动车发生重大交通事故,构成犯罪的,依法追究刑事责任,并由公安机关交通管理部门吊销机动车驾驶证,终生不得重新取得机动车驾驶证。";

        Map<String, Object> map = new HashMap<>();
        map.put("question", question);
        map.put("cases", cases);
        map.put("law", law);
        map.put("info", info);

        Prompt prompt = template.apply(map);

        // 打印生成的提示字符串
        System.out.println("生成的提示: " + prompt.text());

        // 假设返回的字符串包含一个 JSON 对象
        String jsonResponse = "{\n" +
                "  \"userCaseInfo\": {\n" +
                "    \"caseType\": \"酒驾撞人\",\n" +
                "    \"alcoholConcentration\": \"120\",\n" +
                "    \"injured\": \"是\",\n" +
                "    \"flight\": \"否\",\n" +
                "    \"resistanceToArrest\": \"否\",\n" +
                "    \"precedent\": \"邱某案例\"\n" +
                "  }\n" +
                "}";

        try {
            UserCaseInfo keyValues = new Gson().fromJson(jsonResponse, UserCaseInfo.class);
            System.out.println(keyValues);
        } catch (JsonSyntaxException e) {
            System.err.println("解析JSON失败,输入字符串为: " + jsonResponse);
            e.printStackTrace();
        }
    }

    @Test
    public void extracttest() {
        PromptTemplate template = PromptTemplate.from(",你要分析信息并提取信息,以json的形式返回,注意只需要返回json,不要加上Markdown标记,禁止使用markdown输出" +
                "下面我会给你用户提供的最新信息,示例的更新信息的形式如下:我当时把对方打到骨折了,然后想要逃跑的时候被警察带走了" +
                "输出示例如下:{对方伤势:手臂骨折,是否自首:否}" +
                "下面是用户提供的最新信息:{{info}}");

        String info = "信息 是否醉驾:是;酒精浓度:120";
        String question = "我喝了酒开车撞了人,被抓获了,会怎么判刑";

        Map<String, Object> map = new HashMap<>();
        map.put("question", question);
        map.put("info", info);

        Prompt prompt = template.apply(map);

        // 打印生成的提示字符串
        System.out.println("生成的提示: " + prompt.text());

        // 假设返回的字符串包含一个 JSON 对象
        String jsonResponse = "{\n" +
                "  \"userCaseInfo\": {\n" +
                "    \"caseType\": \"酒驾撞人\",\n" +
                "    \"alcoholConcentration\": \"120\",\n" +
                "    \"injured\": \"是\",\n" +
                "    \"flight\": \"否\",\n" +
                "    \"resistanceToArrest\": \"否\",\n" +
                "    \"precedent\": \"邱某案例\"\n" +
                "  }\n" +
                "}";

        try {
            UserCaseInfo keyValues = new Gson().fromJson(jsonResponse, UserCaseInfo.class);
            System.out.println(keyValues);
        } catch (JsonSyntaxException e) {
            System.err.println("解析JSON失败,输入字符串为: " + jsonResponse);
            e.printStackTrace();
        }
    }
}

关键点

  1. 生成正确的 JSON 格式:确保传递给 Gson.fromJson 方法的字符串是有效的 JSON 对象。
  2. 调试输出:在尝试解析 JSON 之前,输出生成的提示字符串,以便确认其格式。
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值