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

发布于:2025-06-20 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、检查结果

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

检查有害内容

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

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

import openai

openai.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_answer
    
    system_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 更好地比较特定助手输出是否与专家提供的理想答案相似。

网站公告

今日签到

点亮在社区的每一天
去签到