【Java-LangChain:使用 ChatGPT API 搭建系统-10】评估(下)-当不存在一个简单的正确答案时

本文探讨了评估生成文本型LLM输出的策略,包括环境配置、问答系统的应用,以及如何使用GPT进行评估,重点介绍了在没有明确正确答案时如何通过上下文和事实内容的比较来评价模型的回答质量。

第十章,评估(下)-当不存在一个简单的正确答案时

在上一章中,了解了如何评估 LLM 模型在 有明确正确答案 的情况下的输出,我们可以编写一个函数来判断 LLM 输出是否正确地分类并列出产品。

然而,如果 LLM 用于生成文本,而不仅仅是分类问题的答案呢?接下来,我们将探讨如何评估这种类型的 LLM 输出的方法。

一,环境配置

参考第二章的 环境配置小节内容即可。

二,运行问答系统获得一个复杂回答


        String delimiter = "###";

        String customer = "告诉我有关 the smartx pro phone 和 the fotosnap camera, the dslr one 的信息。\n" +
                "另外,你们这有什么 TVs ?";

        //从问题中抽取商品大类和名称
        String result = this.getProductsFromQuery(customer);

        JSONArray jsonArray = JSONUtil.parseArray(result);

        //查找商品对应信息
        List<JSONObject> products = this.getMentionedProductInfo(jsonArray);


        List<ChatMessage> messages = new ArrayList<>();

        String system = "您是一家大型电子商店的客户服务助理。\n" +
                "请用友好和乐于助人的口吻回答问题,提供简洁明了的答案。\n" +
                "确保向用户提出相关的后续问题。";


        ChatMessage systemMessage = new ChatMessage();
        systemMessage.setRole("system");
        systemMessage.setContent(system);
        messages.add(systemMessage);

        ChatMessage userMessage = new ChatMessage();
        userMessage.setRole("user");
        userMessage.setContent(delimiter + customer + delimiter);
        messages.add(userMessage);

        ChatMessage assistantMessage = new ChatMessage();
        assistantMessage.setRole("assistant");
        assistantMessage.setContent("相关产品信息:\n" + JSONUtil.toJsonStr(products));
        messages.add(assistantMessage);

        String answer = this.getCompletionFromMessage(messages, 0);

        log.info("test1:\n{}", answer);
test1: 
我们有以下产品可供您选择:

1. SmartX ProPhone - 这是一款功能强大的智能手机,拥有6.1英寸的显示屏,128GB的存储空间,12MP的双摄像头和5G网络支持。售价为899.99美元。

2. FotoSnap DSLR Camera - 这是一款多功能的单反相机,拥有24.2MP的传感器,1080p的视频拍摄能力,3英寸的LCD屏幕和可更换镜头。售价为599.99美元。

关于电视,我们有以下几款可供选择:

1. CineView 4K TV - 这是一款55英寸的4K电视,支持HDR和智能电视功能。售价为599.99美元。

2. CineView 8K TV - 这是一款65英寸的8K电视,支持HDR和智能电视功能。售价为2999.99美元。

3. CineView OLED TV - 这是一款55英寸的OLED电视,支持4K分辨率、HDR和智能电视功能。售价为1499.99美元。

请问您对以上产品有什么具体的要求或者其他问题吗?

三,使用 GPT 评估回答是否正确

我们希望您能从中学到一个设计模式,即当您可以指定一个评估 LLM 输出的标准列表时,您实际上可以使用另一个 API 调用来评估您的第一个 LLM 输出。

    /**
     * 使用 GPT API 评估生成的回答
     *
     * @param customerMsg     用户的输入
     * @param context         回答需要的上下文内容
     * @param assistantAnswer GPT的回答
     */
    public String evalWithRubric(String customerMsg, String context, String assistantAnswer) {

        String delimiter = "###";
        String system = "你是一位助理,通过查看客户服务代理使用的上下文来评估客户服务代理回答用户问题的情况。";
        String user = "你正在根据代理使用的上下文评估对问题的提交答案。以下是数据:\n" +
        "    [开始]\n" +
        "    ************\n" +
        "    [用户问题]: " + customerMsg + "\n" +
        "    ************\n" +
        "    [使用的上下文]: " + context + "\n" +
        "    ************\n" +
        "    [客户代理的回答]: " + assistantAnswer + "\n" +
        "    ************\n" +
        "    [结束]\n" +
        "\n" +
        "    请将提交的答案的事实内容与上下文进行比较,忽略样式、语法或标点符号上的差异。\n" +
        "    回答以下问题:\n" +
        "    助手的回应是否只基于所提供的上下文?(是或否)\n" +
        "    回答中是否包含上下文中未提供的信息?(是或否)\n" +
        "    回应与上下文之间是否存在任何不一致之处?(是或否)\n" +
        "    计算用户提出了多少个问题。(输出一个数字)\n" +
        "    对于用户提出的每个问题,是否有相应的回答?\n" +
        "    问题1:(是或否)\n" +
        "    问题2:(是或否)\n" +
        "    ...\n" +
        "    问题N:(是或否)\n" +
        "    在提出的问题数量中,有多少个问题在回答中得到了回应?(输出一个数字)";


        List<ChatMessage> messages = new ArrayList<>();

        ChatMessage systemMessage = new ChatMessage();
        systemMessage.setRole("system");
        systemMessage.setContent(system);
        messages.add(systemMessage);

        ChatMessage userMessage = new ChatMessage();
        userMessage.setRole("user");
        userMessage.setContent(delimiter + user + delimiter);
        messages.add(userMessage);

        String answer = this.getCompletionFromMessage(messages, 0);

        return answer;
    }

输出:

助手的回应只基于所提供的上下文。 (是)

回答中不包含上下文中未提供的信息。 (否)

回应与上下文之间不存在任何不一致之处。 (是)

用户提出了2个问题。 (2)

对于用户提出的每个问题,都有相应的回答。

问题1:是
问题2:是

在提出的问题数量中,有2个问题在回答中得到了回应。 (2)

四、给出一个标准回答,要求其评估生成回答与标准回答的差距

在经典的自然语言处理技术中,有一些传统的度量标准用于衡量 LLM 输出与人类专家编写的输出的相似度。例如,BLUE 分数可用于衡量两段文本的相似程度。

实际上有一种更好的方法,即使用 Prompt。您可以指定 Prompt,使用 Prompt 来比较由 LLM 自动生成的客户服务代理响应与人工理想响应的匹配程度。

    public String evalVsIdeal(String customerMsg, String idealAnswer, String assistantAnswer) {
        
        String system = "您是一位助理,通过将客户服务代理的回答与理想(专家)回答进行比较,评估客户服务代理对用户问题的回答质量。\n" +
                "请输出一个单独的字母(A 、B、C、D、E),不要包含其他内容。";

        String user = "您正在比较一个给定问题的提交答案和专家答案。数据如下:\n" +
                "    [开始]\n" +
                "    ************\n" +
                "    [问题]: " + customerMsg + "\n" +
                "    ************\n" +
                "    [专家答案]: " + idealAnswer + "\n" +
                "    ************\n" +
                "    [提交答案]: " + assistantAnswer + "\n" +
                "    ************\n" +
                "    [结束]\n" +
                "\n" +
                "    比较提交答案的事实内容与专家答案。忽略样式、语法或标点符号上的差异。\n" +
                "    提交的答案可能是专家答案的子集、超集,或者与之冲突。确定适用的情况,并通过选择以下选项之一回答问题:\n" +
                "    (A)提交的答案是专家答案的子集,并且与之完全一致。\n" +
                "    (B)提交的答案是专家答案的超集,并且与之完全一致。\n" +
                "    (C)提交的答案包含与专家答案完全相同的细节。\n" +
                "    (D)提交的答案与专家答案存在分歧。\n" +
                "    (E)答案存在差异,但从事实的角度来看这些差异并不重要。\n" +
                "    选项:ABCDE";


        List<ChatMessage> messages = new ArrayList<>();

        ChatMessage systemMessage = new ChatMessage();
        systemMessage.setRole("system");
        systemMessage.setContent(system);
        messages.add(systemMessage);

        ChatMessage userMessage = new ChatMessage();
        userMessage.setRole("user");
        userMessage.setContent(user);
        messages.add(userMessage);

        String answer = this.getCompletionFromMessage(messages, 0);

        return answer;
    }

这个评分标准来自于 OpenAI 开源评估框架,这是一个非常棒的框架,其中包含了许多评估方法,既有 OpenAI 开发人员的贡献,也有更广泛的开源社区的贡献。

在这个评分标准中,我们要求 LLM 针对提交答案与专家答案进行信息内容的比较,并忽略其风格、语法和标点符号等方面的差异,但关键是我们要求它进行比较,并输出从A到E的分数,具体取决于提交的答案是否是专家答案的子集、超集或完全一致,这可能意味着它虚构或编造了一些额外的事实。

LLM 将选择其中最合适的描述。

Java快速转换到大模型开发:
配套课程的所有代码已经发布在:https://github.com/Starcloud-Cloud/java-langchain
课程合作请留言

<think>我们正在开发一个基于人工智能的模拟面试平台。根据引用内容,已有类似系统利用ChatGPT等语言模型提供个性化面试体验。我们的方案需要包括技术选型、系统架构设计、核心功能实现等。参考引用: [^1]提到使用OpenAI的ChatGPT作为基础语言模型。[^2]提到使用SpringBoot作为后端,UniApp开发小程序前端。 [^3]提到使用Dify平台来构建,这是一个低代码的LLM应用开发平台。综合以上,我们可以设计两种方案:方案一:自主开发(参考引用[2]的技术栈)-后端:SpringBoot-前端:UniApp(跨平台小程序)-AI模型:调用OpenAI API(或其他大模型API,如国内的通义千问、文心一言等)方案二:使用Dify平台(参考引用[3])-利用Dify平台快速构建AI应用,包括Prompt设计、知识库集成等。-前端仍然可以使用UniApp开发小程序,后端则使用Dify提供的API。核心功能:1.用户管理:用户注册、登录、个人信息管理。2.岗位选择:用户可以选择同的面试岗位(如Java开发、产品经理等)。3.模拟面试:基于AI的实问答,AI根据岗位生成问题,并评估用户回答。4.反馈报告:面试后生成报告,包括表现分析、改进建议。5.历史记录:保存用户的历史面试记录,便于回顾。开发步骤:1.需求分析:确定平台的具体功能,如支持的岗位、面试形式(文字或语音)等。2.技术选型:根据团队熟悉的技术和资源选择方案一或方案二。3. AI模型集成:-方案一:直接调用大模型API,设计Prompt让AI模拟面试官。-方案二:在Dify平台上设计面试流程,包括问题生成、回答评估的Pipeline,然后通过API接入。4.后端开发:实现用户管理、面试记录存储、与AI服务交互等。5.前端开发:实现用户界面,包括开始面试、实问答、查看报告等。6.测试与优化。具体实现一个面试流程的AI部分:-问题生成:根据岗位要求,从知识库中抽取相关问题,或由AI动态生成。-回答评估:将用户回答和问题一起发送给AI,要求AI从专业性、逻辑性、语言表达等方面评分并给出建议。例如,使用OpenAI API的示例代码(方案一):```pythonimport openaidefgenerate_question(position,topic):prompt= f"你是一个{position}职位的面试官,请针对{topic}主题提出一个面试问题。"response= openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role": "user","content": prompt}])returnresponse.choices[0].message.contentdef evaluate_answer(question,user_answer):prompt= f"作为面试官,我提出了以下问题:{question}。应聘者回答:{user_answer}。请对应聘者的回答进行专业评估,并给出改进建议。"response =openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role": "user","content": prompt}])returnresponse.choices[0].message.content```方案二(Dify)则可以通过可视化工作流设计,将问题生成和回答评估作为两个节点,然后通过API调用整个工作流。注意事项:-如果面向国内用户,可能需要考虑使用国内的大模型,以避免访问问题。-面试问题需要专业准确,建议建立知识库,让AI在知识库基础上生成问题,避免随意发挥。以上是两种可行的方案,选择哪种取决于开发资源和团队熟悉的技术栈。</think>基于人工智能技术开发模拟面试平台的方案和工具,可参考以下分阶段实现方案: ### 一、核心架构设计 ```mermaid graph LR A[用户端] --> B[AI面试引擎] B --> C[知识库系统] C --> D[大模型API] B --> E[评估反馈系统] A --> F[管理后台] ``` ### 二、技术栈选型 1. **AI引擎层**: - 基础模型:OpenAI GPT-4/Claude 3(通用能力)[^1] - 领域优化:LangChain框架构建面试流程链 - 本地部署:Llama 3(数据隐私场景)[^3] 2. **开发框架**: - 前端:UniApp(跨平台小程序)[^2] - 后端:Spring Boot(管理后台)[^2] - 快速开发:Dify平台(低代码AI应用搭建)[^3] 3. **辅助系统**: ```python # 语音处理示例(Python) import whisper def speech_to_text(audio): model = whisper.load_model("base") result = model.transcribe(audio) return result["text"] ``` ### 三、核心功能实现 1. **智能面试流**: - 岗位定制:通过Prompt工程生成针对性问题 $$ \text{Prompt} = \text{岗位JD} + \text{公司文化} + \text{考核维度} $$ -追问:基于BERT模型实现上下文理解 - 多模态评估:语音情感分析 + 文本内容评分 2. **反馈系统**: - STAR原则评估框架: ```mermaid pie title 评估维度占比 “专业匹配度” : 40 “逻辑表达” : 30 “应变能力” : 20 “语言规范” : 10 ``` 3. **知识库构建**: - 结构化数据:2000+真实面试题库 - 动态更新:HR专家标注的优质回答样本 - 行业分类器: $$ \text{行业} = \underset{c \in C}{\arg\max} P(c|\text{问题}) $$ ### 四、开发路线图 | 阶段 | 关键任务 | 工具 | |------|----------|------| | 原型设计 | 岗位面试流程设计 | Dify工作流[^3] | | MVP开发 | 基础问答系统 | LangChain + OpenAI API | | 进阶功能 | 语音面试/追问 | Whisper + BERT模型 | | 优化迭代 | 个性化反馈 | 用户行为分析系统 | ### 五、成本优化建议 1. 混合模型策略:高频问题使用本地小模型(如Phi-3),复杂场景调用云端大模型 2. 缓存机制:常见问题回答预生成 3. 分布式部署:将评分模块与生成模块分离
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

df007df

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值