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

Building Systems with the ChatGPT API 使用 ChatGPT API 搭建系统(第八章学习笔记及总结)

章节导航:

第二章:Language Models, the Chat Format and Tokens(语言模型,提问范式与 Token)

第三章:Classification(评估输入-分类 )

第四章:Moderation(检查输入-监督)

第五章:Chain of Thought Reasoning(处理输入-思维链推理 )

第六章:Prompt Chaining Prompts(处理输入-Prompt 链提示)

第七章: Check Outputs(检查结果)

👉第八章:Evaluation(搭建一个带评估的端到端问答系统)

目录

8 搭建一个带评估的端到端问答系统

8.1 端到端实现问答系统

8.2 持续收集用户和助手消息


8 搭建一个带评估的端到端问答系统

在这一章节中,我们将会构建一个集成评估环节的完整问答系统。这个系统将会融合我们在前几节课中所学到的知识,并且加入了评估步骤。以下是该系统的核心操作流程:

  1. 对用户的输入进行检验,验证其是否可以通过审核 API 的标准。
  2. 若输入顺利通过审核,我们将进一步对产品目录进行搜索。
  3. 若产品搜索成功,我们将继续寻找相关的产品信息。
  4. 我们使用模型针对用户的问题进行回答。
  5. 最后,我们会使用审核 API 对生成的回答进行再次的检验。

如果最终答案没有被标记为有害,那么我们将毫无保留地将其呈现给用户。

详细代码请Github参考:datawhalechina/llm-cookbook: 面向开发者的 LLM 入门教程,吴恩达大模型系列课程中文版

这里我是用国内大模型API,并省略了代码中 Moderation API 的检查,也就是代码中的第一步和第五步。
代码中导入的文件为Github项目中的utils_zh.py文件(如下图所示),由于我使用国内大模型API所以在文件中修改了get_completion_from_messages方法接口为我的API。

utils_zh.py文件中,封装了很多个接口,就例如第六章所学到的使用不同的接口来获取产品信息等。这恰好也是一个通过使用链式 Prompt 将复杂任务拆分为一系列简单的子任务,对链式提示(prompt chaining)的完美呈现。

8.1 端到端实现问答系统

在我们的探索之旅中,我们将实现一个完整的问答系统,一种能理解并回应人类语言的人工智能。在这个过程中,我们将使用 OpenAI 的相关API并引用相关函数,来帮助我们快速搭建一个高效且精准的模型。然而,我们需要注意到,在中文的理解和处理方面,由于模型的特性,我们可能会偶尔遇到不理想的结果。在这种情况下,你可以多尝试几次,或者进行深入的研究,以找到更稳定的方法。

让我们先从一个函数开始,它的名称是 process_user_message_ch,该函数主要负责处理用户输入的信息。这个函数接收三个参数,用户的输入、所有的历史信息,以及一个表示是否需要调试的标志。 在函数的内部,我们首先使用 OpenAI 的 Moderation API 来检查用户输入的合规性。如果输入被标记为不合规,我们将返回一个信息,告知用户请求不合规(在上一章节展示了审查的流程)。在调试模式下,我们将打印出当前的进度。

接下来,我们利用 utils_zh.find_category_and_product_only 函数(详细请见utils_zh.py代码)抽取出用户输入中的商品和对应的目录。然后,我们将抽取的信息转化为一个列表。 在获取到商品列表后,我们将查询这些商品的具体信息。之后,我们生成一个系统消息,设定一些约束,以确保我们的回应符合期望的标准。我们将生成的消息和历史信息一起送入 get_completion_from_messages 函数,得到模型的回应。之后,我们再次使用 Moderation API 检查模型的输出是否合规。如果输出不合规,我们将返回一个信息,告知无法提供该信息。

最后,我们让模型自我评估是否很好地回答了用户的问题。如果模型认为回答是满足要求的,我们则返回模型的回答;否则,我们会告知用户,他们将会被转接到人工客服进行进一步的帮助。

import utils_zh
'''
注意:限于模型对中文理解能力较弱,中文 Prompt 可能会随机出现不成功,可以多次运行;也非常欢迎同学探究更稳定的中文 Prompt
'''
def process_user_message_ch(user_input, all_messages, debug=True):"""对用户信息进行预处理参数:user_input : 用户输入all_messages : 历史信息debug : 是否开启 DEBUG 模式,默认开启"""# 分隔符delimiter = "```"# 第一步: 使用 OpenAI 的 Moderation API 检查用户输入是否合规或者是一个注入的 Prompt# response = openai.Moderation.create(input=user_input)# moderation_output = response["results"][0]# # 经过 Moderation API 检查该输入不合规# if moderation_output["flagged"]:#     print("第一步:输入被 Moderation 拒绝")#     return "抱歉,您的请求不合规"# # 如果开启了 DEBUG 模式,打印实时进度# if debug: print("第一步:输入通过 Moderation 检查")# 第二步:抽取出商品和对应的目录,类似于之前课程中的方法,做了一个封装category_and_product_response = utils_zh.find_category_and_product_only(user_input, utils_zh.get_products_and_category())#print(category_and_product_response)# 将抽取出来的字符串转化为列表category_and_product_list = utils_zh.read_string_to_list(category_and_product_response)#print(category_and_product_list)if debug: print("第二步:抽取出商品列表")# 第三步:查找商品对应信息product_information = utils_zh.generate_output_string(category_and_product_list)if debug: print("第三步:查找抽取出的商品信息")# 第四步:根据信息生成回答system_message = f"""您是一家大型电子商店的客户服务助理。\请以友好和乐于助人的语气回答问题,并提供简洁明了的答案。\请确保向用户提出相关的后续问题。"""# 插入 messagemessages = [{'role': 'system', 'content': system_message},{'role': 'user', 'content': f"{delimiter}{user_input}{delimiter}"},{'role': 'assistant', 'content': f"相关商品信息:\n{product_information}"}]# 获取 GPT3.5 的回答# 通过附加 all_messages 实现多轮对话final_response = get_completion_from_messages(all_messages + messages)if debug:print("第四步:生成用户回答")# 将该轮信息加入到历史信息中all_messages = all_messages + messages[1:]# # 第五步:基于 Moderation API 检查输出是否合规# response = openai.Moderation.create(input=final_response)# moderation_output = response["results"][0]# # 输出不合规# if moderation_output["flagged"]:#     if debug: print("第五步:输出被 Moderation 拒绝")#     return "抱歉,我们不能提供该信息"# if debug: print("第五步:输出经过 Moderation 检查")# 第六步:模型检查是否很好地回答了用户问题user_message = f"""用户信息: {delimiter}{user_input}{delimiter}代理回复: {delimiter}{final_response}{delimiter}回复是否足够回答问题如果足够,回答 Y如果不足够,回答 N仅回答上述字母即可"""# print(final_response)messages = [{'role': 'system', 'content': system_message},{'role': 'user', 'content': user_message}]# 要求模型评估回答evaluation_response = get_completion_from_messages(messages)# print(evaluation_response)if debug: print("第六步:模型评估该回答")# 第七步:如果评估为 Y,输出回答;如果评估为 N,反馈将由人工修正答案if "Y" in evaluation_response:  # 使用 in 来避免模型可能生成 Yesif debug: print("第七步:模型赞同了该回答.")return final_response, all_messageselse:if debug: print("第七步:模型不赞成该回答.")neg_str = "很抱歉,我无法提供您所需的信息。我将为您转接到一位人工客服代表以获取进一步帮助。"return neg_str, all_messagesuser_input = "请告诉我关于 smartx pro phone 和 the fotosnap camera 的信息。另外,请告诉我关于你们的tvs的情况。"
response,_ = process_user_message_ch(user_input,[])
print(response)

8.2 持续收集用户和助手消息

# 调用中文 Prompt 版本
def collect_messages_ch(debug=True):"""用于收集用户的输入并生成助手的回答参数:debug: 用于觉得是否开启调试模式"""user_input = inp.value_inputif debug: print(f"User Input = {user_input}")if user_input == "":returninp.value = ''global context# 调用 process_user_message 函数#response, context = process_user_message(user_input, context, utils.get_products_and_category(),debug=True)response, context = process_user_message_ch(user_input, context, debug=False)# print(response)context.append({'role':'assistant', 'content':f"{response}"})panels.append(pn.Row('User:', pn.pane.Markdown(user_input, width=600)))panels.append(pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))return pn.Column(*panels) # 包含了所有的对话信息
import panel as pn  # 用于图形化界面
pn.extension()panels = [] # collect display # 系统信息
context = [ {'role':'system', 'content':"You are Service Assistant"} ]  inp = pn.widgets.TextInput( placeholder='Enter text here…')
button_conversation = pn.widgets.Button(name="Service Assistant")interactive_conversation = pn.bind(collect_messages_ch, button_conversation)dashboard = pn.Column(inp,pn.Row(button_conversation),pn.panel(interactive_conversation, loading_indicator=True, height=300),
)dashboard

http://www.dtcms.com/a/348237.html

相关文章:

  • Hibernate详解
  • GaussDB 数据库架构师修炼(十八) SQL引擎-分布式计划
  • 保姆级Maven安装与配置教程(Windows版)
  • SpringCloud Alibaba核心知识点
  • MIT 6.5840 (Spring, 2024) 通关指南——入门篇
  • 项目学习总结(4)
  • Java内存泄漏详解:检测、分析与预防策略
  • 大语言模型的自动驾驶 LMDrive/DriveVLM-Dual
  • 电动车运行原理与最新人工智能驾驶技术在电动车上的应用展望:从基础动力系统到L5级完全自动驾驶的技术深度解析
  • EndNote 2025 Mac 文献管理工具
  • Multitouch for mac 触控板手势增强软件
  • Multi-output Classification and Multi-label Classification|多输出分类和多标签分类
  • 跨语言文化的统一语义真理:存在性、形式化及其对自然语言处理(NLP)深层语义分析的影响
  • 什么是大模型的指令跟随
  • Preprocessing Model in MPC 3 - 基于同态加密的协议 - Over Fields 有限域
  • Python 列表:定义、操作、推导式与嵌套
  • 西门子 SCL 简单案例
  • 计算机视觉学习路线:从入门到进阶的完整指南
  • 最近遇到的几个JVM问题
  • java学习 + 一个向前端传流顺序不一致的一个解决思路
  • c++ 常用接口设计
  • C#_依赖注入(DI)
  • vulnhub-billu_b0x靶机渗透
  • HPA 数据库实用指南:解决科研文章逻辑衔接难题的实操教程
  • 05 线性代数【动手学深度学习v2】
  • 构建wezzer平台!
  • VirtualBox 中安装 Ubuntu 22.04
  • daily notes[5]
  • 计算机视觉与自然语言处理技术体系概述
  • 深度学习之第一课深度学习的入门