LangChain与大型语言模型(LLMs)应用基础教程:角色定义

news2025/1/9 15:15:56

如果您还没有看过我之前写的两篇博客,请先看一下,这样有助于对本文的理解:

LangChain与大型语言模型(LLMs)应用基础教程:Prompt模板

LangChain与大型语言模型(LLMs)应用基础教程:信息抽取

LangChain是大型语言模型(LLM)的应用框架,LangChain可以直接与 OpenAI 的 text-davinci-003、gpt-3.5-turbo 模型以及 Hugging Face 的各种开源语言模如 Google 的 flan-t5等模型集成。通过使用LangChain可以开发出更为强大和高效的LLM的各种应用。

在ChatGPT中角色定义

在和让大型语言模型(LLM)如ChatGPT等对话时,为了要让LLM能准确回答我们的问题,我们应该在对话之前给LLM设定一个角色,这样当LLM知道自己的角色定位以后,它的回答将会符合自己的角色,而不会天马行空,自由发挥。下面我们看一下如何用python直接调用openai的语言模型"gpt-3.5-turbo"时设定角色,首先我们看看openai官网上对调用"gpt-3.5-turbo"模型时的参数结构的描述,其中messages参数中角色包含了“system”,“user”,“assistand” 这三种角色:

 这里的system是指ChatGPT机器人的系统角色也就是机器人在聊天之前的自身定位,而 user,和assistant则是用户和机器人在聊天时区分彼此的角色。下面我们看看使用python在编写与ChatGPT聊天程时如何定义角色

安装所需要的python包:

pip -q install openai langchain

 下面我们首先给ChatGPT的语言模型“gpt-3.5-turbo” 定义一个系统角色为:You are a helpful assistant(你是一个乐于助人的助手),这样ChatGPT在回答问题时的风格和倾向都必须符合自己这个系统角色。

import os
import openai

#您申请的openai的api_key
openai.api_key = 'XXXXXXXX'

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Hello what can you do for me?"},
    ]
)

response 

 这是ChatGPT返回的消息的数据结构,下面我们把我们所需要的内容提取出来:

 这里我们把ChatGPT的角色设定为:You are a helpful assistant(你是一个乐于助人的助手),helpful assistant 是一个比较正面的角色,那我们是否可以更改一下角色,给机器人增加一个负面角色呢?比如让机器人成为一个爱说大话,谎话连篇的吹牛大王呢?我们可以尝试一下:

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "你是一个爱吹牛说大话,谎话连篇的助理,名叫吹牛大王"},
        {"role": "user", "content": "你会吹牛吗?"},
    ]
)

print(response.choices[0].message.content)

 接下来我们来进行一场连续的对话,并记录每次对话所用的token数量,最后统计一下总的tokens数量。

#定义系统角色
messages=[{"role": "system", "content": "你是一个爱吹牛说大话,谎话连篇的助理,名叫吹牛大王"}]

conversation_total_tokens = 0
while True:
    message = input("你: ")
    if message=='exit':
        print(f"在本轮对话中一共使用了{conversation_total_tokens} 个 tokens")
        break
    if message:
        messages.append(
            {"role": "user", "content": message},
        )
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo", messages=messages
        )
    
    reply = response.choices[0].message.content
    total_tokens = response.usage['total_tokens']
    conversation_total_tokens += total_tokens
    print(f"ChatGPT: {reply} \n (本次对话一共使用了{total_tokens}个token)\n")
    messages.append({"role": "assistant", "content": reply})

 通过上述对话,我们发现,通过给ChatGPT进行系统角色定位,似乎可以改变ChatGPT在聊天时候的倾向性,但是能多大程度的改变ChatGPT聊天的倾向性或者立场,还有待观察。

 在LangChain中定义角色

下面我们看看如何让LangChain在集成大型语言模型(LLM)时定义角色。

from langchain import PromptTemplate, LLMChain
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAIChat
import os
#您申请的openai的api_key
os.environ['OPENAI_API_KEY'] = 'XXXXXXXX'

#定义系统角色
prefix_messages = [{"role": "system", "content": "你是一位乐于助人的历史学教授,名叫王老师"}]

# 定义大型语言模型llm
llm = OpenAIChat(model_name='gpt-3.5-turbo', 
             temperature=0, 
             prefix_messages=prefix_messages,
             max_tokens = 256)

这里我们给llm定义的角色为:一个乐于助人的历史学教授,名叫王老师。接下来我们定义一个prompt模板,我们希望 王老师能够用生动有趣,简明扼要的方式回答问题。

template = """根据问题: {user_input}

请用生动有趣,简明扼要的方式回答上述问题。"""

prompt = PromptTemplate(template=template,input_variables=["user_input"])

最后我们要定义chain,chain的作用是将llm实例化,并套用预先定义的prompt模板

#定义chain
llm_chain = LLMChain(prompt=prompt, llm=llm)

user_input = "中国一共有哪些朝代?"

print(llm_chain.run(user_input))

llm_chain.run("唐朝有哪几位皇帝?")

 

 从上述llm的回答看来,llm清楚了解自己的角色定位,所以它说回答的内容或者风格都似乎和自己角色相符合,这似乎说明角色定位能在某种程度上改变llm回答问题的倾向和立场。

总结

今天我们学习了,如何给openai的语言模型以及在Langchain中对llm进行角色定位,并且通过实验发现角色定位似乎在某种程度上可以改变llm在回答问题时候的倾向和立场,不过这还有待进一步实验验证。

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

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

相关文章

RK3568平台开发系列讲解(LCD篇)快速了解RK LCD的使用

🚀返回专栏总目录 文章目录 一、内核Config配置二、MIPI配置2.1 引脚配置2.2 背光配置2.3 显示时序配置2.3.1 Power on/off sequence2.3.2 Display-Timings三、EDP配置3.1 引脚配置3.2 EDP背光配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇章带大家快速了…

数据结构_查找

目录 1. 查找的基本概念 2. 顺序查找和折半查找 2.1 顺序查找 2.1.1 一般线性表的顺序查找 2.1.2 有序表的顺序查找 2.2 折半查找 2.3 分块查找 2.4 相关练习 3. 树型查找 3.1 二叉排序树 3.1.1 二叉排序树的定义 3.1.2 二叉排序树的查找 3.1.3 二叉排序树…

想要一个本地部署的海洋实景三维展示系统吗?

最近几年实景三维非常火,很多人包括博主都想将自己平时干的海洋测绘项目进行实景三维化,这样做的好处就是无论是管理数据还是成果展示都非常方便。我们可能会使用谷歌地图、奥维地图、图新地球等地图服务软件,它们也提供了一些测量、画图功和…

使用Hexo在Github上搭建个人博客

使用Hexo在Github上搭建个人博客 1. 安装Node和git2. 安装Hexo3. Git与Github的准备工作4. 将Hexo部署到Github5. 开始写作 1. 安装Node和git 在Mac上安装Node.js可以使用Homebrew,使用以下命令安装: brew install node使用以下命令安装Git: …

解决 Uncaught TypeError: SpriteCanvasMaterial is not a constructor.

文章目录 前言一、替代语法总结 前言 上周买了本《Three.js开发指南》, 第三版, 里面的语法不太跟趟, 有点旧, 倒也不能全怪作者, three迭代的确很快. 一、替代语法 这几天没事做, 加上前面本来就接触过Three, 很快进展到了第六章. 在推进 利用Canvas贴图给精灵(Sprite)增加样…

研发工程师玩转Kubernetes——启用microk8s的监控面板(dashboard)

安装插件 microk8s enable dashboard 查看dashboard 地址 由于dashboard是在kube-system的namespace中,我们可以使用下面指令查看它服务的地址。 microk8s kubectl get service -n kube-system kubernetes-dashboard 可以得到地址是https://10.152.183.167。 登…

Android Jetpack-Databinding基本使用

文章目录 让你的项目支持Databinding基本使用布局和绑定表达式常用运算符判空null获取对象属性避免空指针异常其他控件引用资源引用 事件处理import,variables,and includesimportVariablesIncludes 数据更新->UI更新监听字段变化更新监听对象变化更新 UI更新->数据更新绑…

MPLS隧道——隧道迭代与MPLS高可靠性

目录 MPLS隧道迭代 什么情况下需要隧道迭代 解决方法 MPLS高可靠性 VPN FRR VPN GR MPLS隧道迭代 什么情况下需要隧道迭代 解决方法 两种解决方法 将IBGP邻居更改为Vpnv4的IBGP邻居(为目标网段产生私网标签,然后此带标签的BGP路由直接进入标签隧道…

作为程序员的你,常用的工具软件有哪些?

不会还有程序员没用过Chatgpt吧? 我现在的工作日常:把需求提给Chatgpt,代码出来后再自行润色一下代码,然后到工业环境里跑一下,没问题就可以提交了。一来一回效率提高了好几倍,摸鱼的时间都变多了…… 除了…

自学黑客(网络安全)必学内容

随着时代的发展,经济、社会、生产、生活越来越依赖网络。而随着万物互联的物联网技术的兴起,线上线下已经打通,虚拟世界和现实世界的边界正变得模糊。这使得来自网络空间的攻击能够穿透虚拟世界的边界,直接影响现实世界的安全。 …

环环相扣,循环不止:深入解析循环队列

本盘博客会讲解力扣“622. 设计循环队列”的解题思路,这是题目链接。 先来审下题: 以下是示例: 以下是提示: 如何设计一个循环队列呢?这里我用数组来实现。结构的定义如下: typedef struct {int* a; …

又一神器开源!无需服务器支持!打通手机,浏览器的Web LLM!

大家好,我是千与千寻,大家可以叫我“千寻哥”,之前和大家分享了两篇关于ChatGPT的技术文章: 1.chatgpt 2.chatgpt ChatGPT毫无疑问是现在最大的风口,各个行业都在集成ChatGPT的API接口以及各类的应用插件&#xff0…

本地部署 GPT Academic

本地部署 GPT Academic GPT Academic 项目概述Github 地址部署 GPT Academic配置 GPT Academic 参数启动 GPT Academic访问 GPT AcademicNew Bing Cookie 的获取方法 GPT Academic 项目概述 GPT 学术优化 (GPT Academic),为GPT/GLM提供图形交互界面,特别…

SSM整合(单元测试、结果封装、异常处理)

文章目录 1,SSM整合1.1 流程分析1.2 整合配置步骤1:创建Maven的web项目步骤2:添加依赖步骤3:创建项目包结构步骤4:创建SpringConfig配置类步骤5:创建JdbcConfig配置类步骤6:创建MybatisConfig配置类步骤7:创建jdbc.properties步骤8:创建SpringMVC配置类步…

【Leetcode刷题】算法:最长公共前缀

文章目录 一、题目描述二、解题思路2.1 解法12.2 解法22.3 解法32.4 解法4 三、结果提交 一、题目描述 二、解题思路 2.1 解法1 class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:if not strs: # 如果字符串数组为空,则返回空字符串ret…

MIL-STD-1553B总线系统搭建指导

MIL-STD-1553B总线系统搭建指导 1.1553B总线协议 1.11553B总线介绍 MIL-STD-1553B(GJB 289A)是一种应用于机载电子设备间通信的共享式总线通信协议,以总线式拓扑结构连接最多31个终端设备互联,传输速率为1Mbps,在航…

任务跟踪器重要性探析:提升项目效率,实现管理优化

使用任务跟踪器完成项目的最显著好处之一是它们大大减少了开始新项目的初始阻力,尤其是当它们是大型、长期和复杂的项目时。任务跟踪器可用于将这些艰巨的项目分解为更小的、相互依赖的任务,这些任务有助于激发动力和行动以实现最终目标。使用项目任务跟…

Python: 让单元测试输出像GoogleTest一样

文章目录 1. 目的2. 原版 unittest 的输出3. 仿 GoogleTest 的输出效果4. 实现原理浅析传入 testRunner 参数testRunner 参数应该满足的条件颜色高亮: ASCII 转义字符的使用测试用例输出文本内容的格式调整:仿googletest 5. 完整实现代码6. 完整调用代码…

$‘\r‘: command not found syntax error near unexpected token `$‘do\r‘‘ 解决方案

问题描述 今天在执行代码时出现了这样的错误: bash xxx.sh xxx.sh: line 2: $\r: command not found xxx.sh: line 7: $\r: command not found xxx.sh: line 8: syntax error near unexpected token $do\r 经查阅,发现是.sh文件在windows下编辑&#xf…

Nevron Open Vision for .NET Crack

Nevron Open Vision for .NET Crack 增加了对Microsoft.NET 7.0的支持-NOV现在完全支持.NET Core 7.0,此外还支持Microsoft.NET Framework 4.7.2、.NET Core 5.0和.NET Core 6.0的内部版本。 用于.NET改进的NOV图表 添加了WPF和WinForms版本中提供的新3D渲染引擎。新…