一起学大模型 - 一起动笔练习prompt的用法

文章目录

  • 前言
  • 一、代码演示
  • 二、代码解析
    • 1. 导入所需的库和模块:
    • 2. 设置日志记录和初始化模型:
    • 3. 定义一个函数用于清理GPU内存:
    • 4. 定义一个继承自LLM基类的QianWenChatLLM类,并实现对话生成的逻辑:
    • 5. 示例代码的主体部分:
  • 三、运行结果
    • 在这里插入图片描述
  • 总结


前言

在之前的文章里面我们学习了Langchain的prompt接口的知识,光学习是不够的。
让我们一起练习一下Langchain prompt的用法,并更加合理地组织它。prompt的组织方法没有特定的规范,可以使用不同的前缀来标注用户、AI、历史记录或已知信息,这是可变的。只要格式明确,大模型就可以正确识别。


一、代码演示

import os
import torch
from typing import List, Optionalfrom langchain.chains import LLMChain
from langchain.llms.base import LLM
from langchain_core.prompts import HumanMessagePromptTemplate, ChatPromptTemplate
from modelscope import AutoModelForCausalLM, AutoTokenizer
from modelscope import GenerationConfig
import logging
import torchfrom configs import log_verboselogger = logging.getLogger(__name__)tokenizer = AutoTokenizer.from_pretrained("I:/aimodels/Qwen/Qwen-1_8B-Chat", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("I:/aimodels/Qwen/Qwen-1_8B-Chat", device_map="cuda", trust_remote_code=True).eval()
model.generation_config = GenerationConfig.from_pretrained("I:/aimodels/Qwen/Qwen-1_8B-Chat", trust_remote_code=True)def torch_gc():try:if torch.cuda.is_available():# with torch.cuda.device(DEVICE):torch.cuda.empty_cache()torch.cuda.ipc_collect()elif torch.backends.mps.is_available():try:from torch.mps import empty_cacheempty_cache()except Exception as e:msg = ("如果您使用的是 macOS 建议将 pytorch 版本升级至 2.0.0 或更高版本,""以支持及时清理 torch 产生的内存占用。")logger.error(f'{e.__class__.__name__}: {msg}',exc_info=e if log_verbose else None)except Exception:...# wrap the qwen model with langchain LLM base class
class QianWenChatLLM(LLM):max_length = 10000temperature: float = 0.01top_p = 0.9def __init__(self):super().__init__()@propertydef _llm_type(self):return "ChatLLM"def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:print(prompt)response, history = model.chat(tokenizer, prompt, history=None)torch_gc()return responseif __name__ == '__main__':qwllm = QianWenChatLLM()print('@@@ qianwen LLM created')# 使用qwllm对话qwllm.temperature = 0.01qwllm.top_p = 0.9qwllm.max_length = 10000human_prompt = "{input}"human_message_template = HumanMessagePromptTemplate.from_template(human_prompt)chat_prompt = ChatPromptTemplate.from_messages([("human", "我们来玩成语接龙,我先来,生龙活虎"),("ai", "虎头虎脑"),("human", "{input}")])chain = LLMChain(prompt=chat_prompt, llm=qwllm, verbose=True)print(chain({"input": "恼羞成怒"}))chat_prompt2 = ChatPromptTemplate.from_messages(['<指令>这里是我通过工具获取的当前信息。请你根据这些信息进行提取并有调理,简洁的回答问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题”,答案请使用中文。 </指令>\n''<已知信息>{context}</已知信息>\n''<问题>{question}</问题>\n'])# 取当前时间,格式是年月日时分秒import datetimenow = datetime.datetime.now()now_time = now.strftime("%Y-%m-%d %H:%M:%S")chain2 = LLMChain(prompt=chat_prompt2, llm=qwllm, verbose=True)print(chain2({"context": "当前的时间是" + now_time, "question": "请问现在几点了?"}))

二、代码解析

这段代码主要是使用了一个名为"Qwen"的预训练语言模型进行对话生成。以下是代码的解释:

1. 导入所需的库和模块:

import os
import torch
from typing import List, Optional
from langchain.chains import LLMChain
from langchain.llms.base import LLM
from langchain_core.prompts import HumanMessagePromptTemplate, ChatPromptTemplate
from modelscope import AutoModelForCausalLM, AutoTokenizer
from modelscope import GenerationConfig
import logging
import torch
from configs import log_verbose

2. 设置日志记录和初始化模型:

logger = logging.getLogger(__name__)
# 使用预训练模型的tokenizer和model
tokenizer = AutoTokenizer.from_pretrained("I:/aimodels/Qwen/Qwen-1_8B-Chat", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("I:/aimodels/Qwen/Qwen-1_8B-Chat", device_map="cuda", trust_remote_code=True).eval()
model.generation_config = GenerationConfig.from_pretrained("I:/aimodels/Qwen/Qwen-1_8B-Chat", trust_remote_code=True)

3. 定义一个函数用于清理GPU内存:

def torch_gc():try:if torch.cuda.is_available():torch.cuda.empty_cache()torch.cuda.ipc_collect()elif torch.backends.mps.is_available():try:from torch.mps import empty_cacheempty_cache()except Exception as e:msg = "如果您使用的是 macOS 建议将 pytorch 版本升级至 2.0.0 或更高版本,以支持及时清理 torch 产生的内存占用。"logger.error(f'{e.__class__.__name__}: {msg}', exc_info=e if log_verbose else None)except Exception:...

4. 定义一个继承自LLM基类的QianWenChatLLM类,并实现对话生成的逻辑:

class QianWenChatLLM(LLM):max_length = 10000temperature: float = 0.01top_p = 0.9def __init__(self):super().__init__()@propertydef _llm_type(self):return "ChatLLM"def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:print(prompt)response, history = model.chat(tokenizer, prompt, history=None)torch_gc()return response

5. 示例代码的主体部分:

if __name__ == '__main__':qwllm = QianWenChatLLM()print('@@@ qianwen LLM created')# 使用qwllm对话qwllm.temperature = 0.01qwllm.top_p = 0.9qwllm.max_length = 10000human_prompt = "{input}"human_message_template = HumanMessagePromptTemplate.from_template(human_prompt)chat_prompt = ChatPromptTemplate.from_messages([("human", "我们来玩成语接龙,我先来,生龙活虎"),("ai", "虎头虎脑"),("human", "{input}")])chain = LLMChain(prompt=chat_prompt, llm=qwllm, verbose=True)print(chain({"input": "恼羞成怒"}))chat_prompt2 = ChatPromptTemplate.from_messages(['<指令>这里是我通过工具获取的当前信息。请你根据这些信息进行提取并有调理,简洁的回答问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题”,答案请使用中文。 </指令>\n''<已知信息>{context}</已知信息>\n''<问题>{question}</问题>\n'])# 取当前时间,格式是年月日时分秒import datetimenow = datetime.datetime.now()now_time = now.strftime("%Y-%m-%d %H:%M:%S")chain2 = LLMChain(prompt=chat_prompt2, llm=qwllm, verbose=True)print(chain2({"context": "当前的时间是" + now_time, "question": "请问现在几点了?"}))

在主体部分,首先创建了一个QianWenChatLLM的实例qwllm,并设置了生成对话时的参数。接下来定义了两个对话的模板prompt,用于生成聊天对话。然后创建了LLMChain实例chain,将prompt和qwllm传入,最后调用chain生成对话并打印结果。

代码的最后部分,又创建了一个LLMChain实例chain2,其中的prompt包含了当前的时间信息,然后调用chain2生成对话并打印结果。


三、运行结果

在这里插入图片描述

总结

在上面的代码,我们可以看出Langchain的prompt对文本组织结构和角色的分配是很灵活。但是并不代表就可以随便写。不同的写法出来的结果是不一样的。 在实际的运用中也需要不断的调优,达到更好的效果。
大家可以一起练习一下,并在练习的过程中排查各种问题,提升自己对prompt的理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第137题只出现一次的数字II

题目&#xff1a; 题解&#xff1a; class Solution { public:int singleNumber(vector<int>& nums) {int a 0, b 0;for (int num: nums) {b ~a & (b ^ num);a ~b & (a ^ num);}return b;} };

【2024高考作文】新课标I卷-人工智能主题,用chatGPT作答

目录 &#x1f438;&#x1f438;作文真题 ⭐⭐1.chatGPT作答 ⭐⭐2.通义千问作答 ⭐⭐3.KiMi作答 整理不易&#xff0c;欢迎一键三连&#xff01;&#xff01;&#xff01; 送你们一条美丽的--分割线-- &#x1f438;&#x1f438;作文真题 随着互联网的普及、人工智能的…

安卓约束性布局学习

据说这个布局是为了解决各种布局过度前套导致代码复杂的问题的。 我想按照自己想实现的各种效果来逐步学习&#xff0c;那么直接拿微信主页来练手&#xff0c;用约束性布局实现微信首页吧。 先上图 先实现顶部搜索框加号按钮 先实现 在布局中添加一个组件&#xff0c;然后摆放…

2024 年最全的 21 款数据恢复工具软件汇总

使用其中任何一款免费数据恢复工具&#xff0c;您都可以找回那些您认为已经永远消失的文件。我根据这些程序对我而言的易用性和它们提供的功能对这些程序进行了排名。 这些应用程序从您的硬盘、USB 驱动器、媒体卡等恢复文档、视频、图像、音乐等。我建议每个计算机所有者都安装…

软件测试--Linux快速入门

文章目录 软件测试-需要掌握的Linux指令Linux命令操作技巧Linx命令的基本组成常用命令 软件测试-需要掌握的Linux指令 Linux命令操作技巧 使用Tab键自动补全上下键进行翻找之前输入的命令命令执行后无法停止使用CtrC,结束屏幕输出 Linx命令的基本组成 命令 [-选项] [参数] …

react - isValidElement 判断参数是否是一个有效的ReactElement

作用&#xff1a;isValidElement是ReactElement对象中的一个方法&#xff0c;可以通过react.isValidElement(object)来调用&#xff0c;它的作用是验证判断参数object是否为有效的ReactElement&#xff0c;返回boolean值。 方法定义&#xff1a; /*** 验证 object 参数是否是 …

一个嵌套对象的一个属性变化了,immer库和zustand是能够识别吗

当使用immer库与zustand配合时&#xff0c;一个嵌套对象的一个属性变化了&#xff0c;immer库和zustand是能够识别并触发状态更新的。 这主要得益于immer库的特性&#xff0c;它允许使用原生的JavaScript语法来更新状态&#xff0c;同时自动处理深拷贝和不可变性的问题。具体来…

CANopen for Python

系列文章目录 前言 该软件包支持与 CANopen 节点网络交互。 注意 这里的大部分文档都是从 CANopen 维基百科页面上直接盗用的。 本文档正在编写中。欢迎反馈和修改&#xff01; CANopen 是用于自动化领域嵌入式系统的通信协议和设备配置文件规范。根据 OSI 模型&#x…

【Java】解决Java报错:ConcurrentModificationException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 遍历过程中修改集合2.2 使用 Iterator 进行删除操作 3. 解决方案3.1 使用 Iterator 的 remove 方法3.2 使用 CopyOnWriteArrayList3.3 使用 synchronized 块 4. 预防措施4.1 使用线程安全的集合类4.2 使用合适的遍历和修改方法4.…

如何在没有密码的情况下解锁iPhone

通常&#xff0c;您可以使用密码、FaceID 或 Touch ID 轻松解锁 iPhone。但是&#xff0c;有时您可能会忘记密码、iPhone 已停用或您的二手手机已锁定。在这种情况下&#xff0c;您必须绕过 iPhone 密码才能访问您的设备。在本文中&#xff0c;我们将向您介绍 5 种经过测试的方…

【多模态/CV】图像数据增强数据分析和处理

note 多模态大模型训练前&#xff0c;图片数据处理的常见操作&#xff1a;分辨率调整、网格畸变、水平翻转、分辨率调整、随机crop、换颜色、多张图片拼接、相似图片检测并去重等 一、分辨率调整 from PIL import Image def resize_image(original_image_path, save_image_p…

手撸一个代码生成器插件

要实现一个代码生成器&#xff0c;您需要考虑以下几个步骤&#xff1a; 数据库元数据解析&#xff1a; 您需要从数据库中获取表的元数据&#xff0c;包括表名、字段名、字段类型等信息。模板编写&#xff1a; 创建模板文件&#xff0c;用于生成实体类、仓库接口、控制器和前端…

windows下的which命令

在linux下使用which命令&#xff0c;很爽&#xff1b; 可惜在windows上没有&#xff08;虽然只有一个where命令&#xff09;&#xff0c;所以写了一个&#xff0c;见附件。 用法&#xff1a; which.exe cmd.exe 可执行文件地址&#xff1a; http://download.csdn.net/detai…

0105__学习一个 Linux 命令:objcopy 命令

学习一个 Linux 命令&#xff1a;objcopy 命令-CSDN博客

mysql 8 linux7,8安装教程

选择自己对应的linux版本 cat /etc/os-release //查看自己linux系统版本 1.mysql下载地址 MySQL :: Download MySQL Community Server (Archived Versions) 拉到下面找到 选择自己linux指定的版本&#xff0c;否则会很麻烦 cat /etc/os-release //查看系统版本 2.查…

Hatch 现代化的项目管理、构建工具

文章目录 Hatch 现代化的项目管理、构建工具简介安装操作项目常用操作虚拟环境相关 故障记录https 和 ssl 报错UnicodeDecodeError: utf-8 codec cant ... 参考资料 Hatch 现代化的项目管理、构建工具 简介 介绍 Hatch 是一个用于创建、构建和发布 Python 软件包的现代化命令…

MyBatis-源码解说

归档 GitHub: MyBatis-源码解说 总说明 源码仓库&#xff1a; https://github.com/mybatis/mybatis-3克隆&#xff1a;git clone https://github.com/mybatis/mybatis-3.git切分支&#xff08;tag&#xff09;&#xff1a;git checkout masterJDK: 17Mapper 测试在 org.apac…

钉钉二次开发-企业内部系统集成官方OA审批流程(三)

书接上回&#xff0c;本文主要分享 企业内部系统集成钉钉官方OA审批流程的步骤 的第二部分。 前端代码集成钉钉免登JSAPI: 前端通过corpid 获得钉钉临时访问码code&#xff0c;再通过临时访问码code调用此接口返回当前用户的姓名、userid、 钉钉用户id、 系统工号、 钉钉部门…

从0开发一个Chrome插件:核心功能开发——弹出页面

前言 这是《从0开发一个Chrome插件》系列的第十一篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必…

从0开发一个Chrome插件:内容脚本实战——用户访问任何网页时,在页面顶部插入一条通知信息

前言 这是《从0开发一个Chrome插件》系列的第十篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必要…