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