当前位置: 首页 > news >正文

【LLM学习笔记3】搭建基于chatgpt的问答系统(下)

目录

  • 一、检查结果
    • 检查有害内容
    • 检查是否符合产品信息
  • 二、搭建一个简单的问答系统
  • 三、评估输出
    • 1.当存在一个简单的正确答案
    • 2.当不存在一个简单的正确答案

一、检查结果

本章将引领你了解如何评估系统生成的输出。在任何场景中,无论是自动化流程还是其他环境,我们都必须确保在向用户展示输出之前,对其质量、相关性和安全性进行严格的检查,以保证我们提供的反馈是准确和适用的。我们将学习如何运用审查(Moderation) API 来对输出进行评估,并深入探讨如何通过额外的 Prompt 提升模型在展示输出之前的质量评估。

检查有害内容

我们主要通过 OpenAI 提供的 Moderation API 来实现对有害内容的检查。

当前最新可运行代码(教程是2023年的里面一些调用过时了),现在调用moderation用这个

import openaiopenai.api_key = "sk-..."response = openai.Moderation.create(input="我们要用核弹头威胁世界。"
)print(response["results"][0])

检查是否符合产品信息

需要在prompt中新加一类表示产品信息,再将其作为message中的一部分返回给模型。

总的来说,借助审查 API 来检查输出是一个可取的策略。但在我看来,这在大多数情况下可能是不必要的,特别是当你使用更先进的模型,比如 GPT-4 。实际上,在真实生产环境中,我们并未看到很多人采取这种方式。这种做法也会增加系统的延迟和成本,因为你需要等待额外的 API 调用,并且需要额外的 token 。如果你的应用或产品的错误率仅为0.0000001%,那么你可能可以尝试这种策略。但总的来说,我们并不建议在实际应用中使用这种方式。在接下来的章节中,我们将把我们在评估输入、处理输出以及审查生成内容所学到的知识整合起来,构建一个端到端的系统。

二、搭建一个简单的问答系统

代码实现以下功能:搭建一个系统,用户提问 → 模型回答 → 比较参考答案 → 打分 → 评估效果

import gradio as gr
import os
import openai
from dotenv import load_dotenv, find_dotenv# 1. 设置 API(SiliconFlow)
_ = load_dotenv(find_dotenv())
client = openai.OpenAI(api_key=os.environ["SILICONFLOW_API_KEY"],base_url="https://api.siliconflow.cn/v1"
)# 2. 获取回答
def get_completion(prompt, model="deepseek-ai/DeepSeek-R1-0528-Qwen3-8B"):response = client.chat.completions.create(model=model,messages=[{"role": "system", "content": "你是一个有帮助的问答助手"},{"role": "user", "content": prompt}])return response.choices[0].message.content# 3. 主逻辑:输入问题和参考答案,返回 模型答案 + 模型评分
def qa_and_eval(question, reference_answer):answer = get_completion(question)eval_prompt = f"""
你是一个教育专家,请根据参考答案,给出学生答案的合理性打分(满分10分),并写出评分依据:
题目:{question}
参考答案:{reference_answer}
学生答案:{answer}
请按照以下格式输出:
分数:?
理由:?
"""evaluation = get_completion(eval_prompt)return answer, evaluation# 4. 构建 Gradio 界面
iface = gr.Interface(fn=qa_and_eval,inputs=[gr.Textbox(label="输入题目"),gr.Textbox(label="参考答案"),],outputs=[gr.Textbox(label="模型回答"),gr.Textbox(label="评分结果"),],title="问答评估系统(SiliconFlow)"
)iface.launch()

三、评估输出

1.当存在一个简单的正确答案

流程:不断修改指令以处理困难样例,观察模型输出;进行回归测试,观察模型在原有样例上是否有效;收集开发样例进行自动化测试;通过与理想答案比较来评估测试用例上的效果,在所有样例上运行评估并计算正确比例。

2.当不存在一个简单的正确答案

流程:先提问获取一个复杂回答,再通过gpt来评估其是否可靠(使用另一个 API 调用来评估第一个 LLM 输出)。

或者是评估生成的复杂回答与标准回答之间的差距(在经典的自然语言处理技术中,有一些传统的度量标准用于衡量 LLM 输出与人类专家编写的输出的相似度。例如,BLUE 分数可用于衡量两段文本的相似程度。
实际上有一种更好的方法,即使用 Prompt。您可以指定 Prompt,使用 Prompt 来比较由 LLM 自动生成的客户服务代理响应与人工理想响应的匹配程度。)

def eval_vs_ideal(test_set, assistant_answer):"""评估回复是否与理想答案匹配参数:test_set: 测试集assistant_answer: 助手的回复"""cust_msg = test_set['customer_msg']ideal = test_set['ideal_answer']completion = assistant_answersystem_message = """\您是一位助理,通过将客户服务代理的回答与理想(专家)回答进行比较,评估客户服务代理对用户问题的回答质量。请输出一个单独的字母(A 、B、C、D、E),不要包含其他内容。 """user_message = f"""\您正在比较一个给定问题的提交答案和专家答案。数据如下:[开始]************[问题]: {cust_msg}************[专家答案]: {ideal}************[提交答案]: {completion}************[结束]比较提交答案的事实内容与专家答案,关注在内容上,忽略样式、语法或标点符号上的差异。你的关注核心应该是答案的内容是否正确,内容的细微差异是可以接受的。提交的答案可能是专家答案的子集、超集,或者与之冲突。确定适用的情况,并通过选择以下选项之一回答问题:(A)提交的答案是专家答案的子集,并且与之完全一致。(B)提交的答案是专家答案的超集,并且与之完全一致。(C)提交的答案包含与专家答案完全相同的细节。(D)提交的答案与专家答案存在分歧。(E)答案存在差异,但从事实的角度来看这些差异并不重要。选项:ABCDE
"""messages = [{'role': 'system', 'content': system_message},{'role': 'user', 'content': user_message}]response = get_completion_from_messages(messages)return response

希望您从本章中学到两个设计模式。

  • 即使没有专家提供的理想答案,只要能制定一个评估标准,就可以使用一个 LLM 来评估另一个 LLM 的输出。
  • 如果您可以提供一个专家提供的理想答案,那么可以帮助您的 LLM 更好地比较特定助手输出是否与专家提供的理想答案相似。
http://www.lqws.cn/news/441019.html

相关文章:

  • 从“看懂”到“行动”: VLM 与 VLA
  • MySQL读写分离技术详解:架构设计与实践指南
  • Hive优化详细讲解
  • vue项目插入腾讯地图
  • Umi + qiankun 微前端架构
  • Python爬虫(七):PySpider 一个强大的 Python 爬虫框架
  • SQL分片工具类
  • 动态规划:砝码称重(01背包-闫氏DP分析法)
  • 性能优化中的工程化实践:从 Vite 到 Webpack 的最佳配置方案
  • Day05_数据结构总结Z(手写)
  • 386. 字典序排数
  • 解码成都芯谷金融中心:文化科技产业园的产融创新生态密码
  • 2025年八大科技趋势
  • Spring Boot + MyBatis + Vue:构建高效全栈应用的实战指南
  • bos_token; eos_token; pad_token是什么
  • 农村土地经营权二轮延包—一键生成属性数据库MDB
  • 解决docker pull镜像慢的问题
  • 【设计模式】用观察者模式对比事件订阅(相机举例)
  • 【分布式】基于Redisson实现对分布式锁的注解式封装
  • 【JavaEE】(3) 多线程2
  • API网关Apisix介绍
  • MySQL高可用方案解析与选型指南
  • Android图形系统框架解析
  • 【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率
  • AI与大数据如何驱动工业品电商平台的智能决策?
  • mongodb单节点改副本集模式
  • Spring Boot + MyBatis + Vue:打造高效全栈应用的黄金组合
  • CppCon 2017 学习:Esoteric Data Structures and Where to Find Them
  • 《汇编语言:基于X86处理器》第2章 复习题
  • infinisynapse 使用清华源有问题的暂时解决方法:换回阿里云源并安装配置PPA