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

文章目录

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


前言

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


一、代码演示

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

logger = 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_cache
                empty_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 = 10000
    temperature: float = 0.01
    top_p = 0.9

    def __init__(self):
        super().__init__()

    @property
    def _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


if __name__ == '__main__':
    qwllm = QianWenChatLLM()
    print('@@@ qianwen LLM created')

    # 使用qwllm对话

    qwllm.temperature = 0.01
    qwllm.top_p = 0.9
    qwllm.max_length = 10000



    human_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 datetime
    now = 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_cache
                empty_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 = 10000
    temperature: float = 0.01
    top_p = 0.9

    def __init__(self):
        super().__init__()

    @property
    def _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.01
    qwllm.top_p = 0.9
    qwllm.max_length = 10000

    human_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 datetime
    now = 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的理解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

柏曼护眼台灯值得入手吗?明基、书客实测对比

早期的台灯主要是以白炽灯为主&#xff0c;但随着LED技术的成熟&#xff0c;LED台灯逐渐成为主流。目前&#xff0c;台灯行业已经进入了一个高速发展的阶段&#xff0c;市场竞争也越来越激烈。如何选购护眼台灯也是大家最常问的问题&#xff0c;柏曼护眼台灯值得入手吗&#xf…

HTML静态网页成品作业(HTML+CSS)—— 电影泰坦尼克号介绍网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

2024年G3锅炉水处理证考试题库及G3锅炉水处理试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G3锅炉水处理证考试题库及G3锅炉水处理试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机…

咖啡机器人如何精准控制液位流量

在如今快节奏的生活中&#xff0c;精确控制液位流量的需求愈发迫切&#xff0c;特别是在咖啡机器人等精密设备中。为了满足这一需求&#xff0c;工程师们不断研发出各种先进的技术&#xff0c;以确保液体流量的精准控制。其中&#xff0c;霍尔式流量计和光电式流量计就是两种常…

如何用Postman做接口自动化测试?5个步骤带你轻松实现!

什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完成的用例还…

基于函数计算部署GPT-Sovits语音生成模型实现AI克隆声音

GPT-Sovits是一个热门的文本生成语音的大模型&#xff0c;只需要少量样本的声音数据源&#xff0c;就可以实现高度相似的仿真效果。通过函数计算部署GPT-Sovits模型&#xff0c;您无需关心GPU服务器维护和环境配置&#xff0c;即可快速部署和体验模型&#xff0c;同时&#xff…

基于ensp的园区网络搭建综合实验

核心技术介绍 1、虚拟局域网&#xff08;VLAN&#xff09; 2、链路聚合&#xff08;E-trunk&#xff09; 3、多生成树协议&#xff08;MSTP&#xff09; 4、VLANIF三层逻辑接口 5、虚拟路由冗余协议&#xff08;VRRP&#xff09; 6、开放式最短路径优先&#xff08;OSPF&…

【C++历练之路】C++11中的列表初始化声明新方法深入标准模板库的变革

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 目录 1. C11简介 2. 统一的列表初始化 2.1 &#xff5b;&#xff5d;初始化 2.2 std::initializer_list 3. 声明 3.1 auto 3.2 decltype 4.STL中一些变化 1. C11简介 在2003年C标准委员会曾经提交了一份技术勘误…

响应式流规范解析

在互联网应用构建过程中&#xff0c;我们知道可以采用异步非阻塞的编程模型来提高服务的响应能力。而为了实现异步非阻塞&#xff0c;我们可以引入数据流&#xff0c;并对数据的流量进行控制。我们来考虑一个场景&#xff0c;如果数据消费的速度跟不上数据发出的速度&#xff0…

腺苷调节合成高密度脂蛋白用于三阴性乳腺癌的化学免疫治疗

引用信息 文 章&#xff1a;Adenosine-modulating synthetic high-density lipoprotein for chemoimmunotherapy of triple-negative breast cancer 期 刊&#xff1a;Journal of Controlled Release&#xff08;影响因子&#xff1a;10.8&#xff09; 发表时间&am…

webgl_effects_stereo

ThreeJS 官方案例学习&#xff08;webgl_effects_stereo&#xff09; 1.效果图 2.源码 <template><div><div id"container"></div></div> </template> <script> import * as THREE from three; // 导入控制器 import { …

【乐吾乐2D可视化组态编辑器】实时数据,数据绑定

什么是绑定变量&#xff1f; 绑定变量是指把图元的一个属性与设备数据点关联的一个过程。【注意】只是建立一个数据模型的关联&#xff0c;数据源后面设置。 乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 为什么不直接设置数据源&#xff1f; 方便批量…

AWS-生产级微服务部署架构分享

使用AWS搭建云上应用 名词解释 AWS ECR&#xff1a;AWS ECR 容器存储库&#xff0c;按项目名创建容器仓库&#xff0c;一个项目对应一个仓库&#xff0c;目前是由Jenkins构建镜像远程push到AWS ECR。 **AWS ECS&#xff1a;Amazon Elastic Container Service (ECS) &#xf…

物理安全防护如何创新强化信息安全体系?

物理安全防护是信息安全体系的重要组成部分&#xff0c;它通过保护实体设施、设备和介质等&#xff0c;防止未授权访问、破坏、盗窃等行为&#xff0c;从而为信息系统提供基础的安全保障。要创新强化信息安全体系中的物理安全防护&#xff0c;可以从以下几个方面着手&#xff1…

AI查重与降重:科研人员的新型助手

论文写作低效&#xff1f;试试这四款AI论文工具和降重技术&#xff01;-笔灵 副本 在科研领域&#xff0c;AI写作工具如同新一代的科研利器&#xff0c;它们能够极大提高文献查阅、思路整理和表达优化的效率&#xff0c;本质上促进了科研工作的进步。AI写作工具不仅快速获取并…

k8s AIOps

k8s AIOps 主要介绍下k8sgpt 官站 github 介绍 k8sgpt 是一个用于扫描Kubernetes集群、诊断和分级问题的工具。它以简单的英语呈现问题&#xff0c;并将站点可靠性工程&#xff08;SRE&#xff09;的经验编码到其分析器中。通过AI丰富问题的解释&#xff0c;k8sgpt帮助提取最…

面试题react03

React事件机制&#xff1a; React的事件机制可以分为两个部分&#xff1a;事件的触发和事件的处理。事件的触发&#xff1a;在React中&#xff0c;事件可以通过用户与组件进行交互而触发&#xff0c;如点击、鼠标移动、键盘输入等。当用户与组件进行交互时&#xff0c;浏览器会…

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.查…

为什么给网站安装SSL证书之后还是有被提示不安全?

分为两种情况一种是安装了付费证书之后还是显示无效&#xff0c;另一种是安装了免费SSL证书的。 付费SSL证书&#xff1a;直接找厂商帮助解决遇到的问题&#xff0c;一般都是有专业的客服来对接这些的。 免费SSL证书&#xff1a;出现这种情况的原因会有很多。因为免费SSL证书的…

代码随想录-二叉树 | 101对称二叉树

代码随想录-二叉树 | 101对称二叉树 LeetCode 101-对称二叉树解题思路代码难点总结 LeetCode 101-对称二叉树 题目链接 代码随想录 题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 解题思路 判断&#xff1a; 同时遍历并比较根节点的左、右子树。…