langchain(1):使用LangChain 调用 openai 的 text/chat model

news2024/10/7 10:16:39

文章目录

  • 重要参考
  • OPENAI API
    • 调用 Text 模型
    • 调用 Chat 模型
      • 消息
      • 角色
    • Chat 模型 vs Text 模型
  • 通过 LangChain 调用 Text 和 Chat 模型
    • 调用 text 模型
    • 调用 chat 模型

重要参考

langchain 中文网
langchain api
openai api 文档
huggingface

LangChain 是一个全方位的、基于大语言模型这种预测能力的应用开发工具,它的灵活性和模块化特性使得处理语言模型变得极其简便。不论你在何时何地,都能利用它流畅地调用语言模型,并基于语言模型的“预测”或者说“推理”能力开发新的应用。
LangChain 本质上就是对各种大模型提供的 API 的套壳,是为了方便我们使用这些 API,搭建起来的一些框架、模块和接口。
因此,要了解 LangChain 的底层逻辑,需要了解大模型的 API 的基本设计思路。而目前接口最完备的、同时也是最强大的大语言模型,当然是 OpenAI 提供的 GPT 家族模型。

OPENAI API

由于 LangChain 需要调用大模型的API,这里以 openai 为主要大模型api进行介绍。

在这里插入图片描述

  • Chat Model,聊天模型,用于产生人类和 AI 之间的对话,代表模型当然是 gpt-3.5-turbo(也就是 ChatGPT)和 GPT-4。当然,OpenAI 还提供其它的版本,gpt-3.5-turbo-0613 代表 ChatGPT 在 2023 年 6 月 13 号的一个快照,而 gpt-3.5-turbo-16k 则代表这个模型可以接收 16K 长度的 Token,而不是通常的 4K。(注意了,gpt-3.5-turbo-16k 并未开放给我们使用,而且你传输的字节越多,花钱也越多)
  • Text Model,文本模型,在 ChatGPT 出来之前,大家都使用这种模型的 API 来调用 GPT-3,文本模型的代表作是 text-davinci-003(基于 GPT3)。而在这个模型家族中,也有专门训练出来做文本嵌入的 text-embedding-ada-002,也有专门做相似度比较的模型,如 text-similarity-curie-001。上面这两种模型,提供的功能类似,都是接收对话输入(input,也叫 prompt),返回回答文本(output,也叫 response)。但是,它们的调用方式和要求的输入格式是有区别的,

调用 Text 模型

import openai

response = openai.Completion.create(
  model="text-davinci-003",
  temperature=0.5,
  max_tokens=100,
  prompt="请给我的花店起个名")
print(response.choices[0].text.strip())

在使用 OpenAI 的文本生成模型时,你可以通过一些参数来控制输出的内容和样式。这里总结为了一些常见的参数。
在这里插入图片描述

当你调用 OpenAI 的 Completion.create 方法时,它会返回一个响应对象,该对象包含了模型生成的输出和其他一些信息。这个响应对象是一个字典结构,包含了多个字段。在使用 Text 模型(如 text-davinci-003)的情况下,响应对象的主要字段包括:
在这里插入图片描述
choices 字段是一个列表,因为在某些情况下,你可以要求模型生成多个可能的输出。每个选择都是一个字典,其中包含以下字段:text:模型生成的文本。finish_reason:模型停止生成的原因,可能的值包括 stop(遇到了停止标记)、length(达到了最大长度)或 temperature(根据设定的温度参数决定停止)。所以,response.choices[0].text.strip() 这行代码的含义是:从响应中获取第一个(如果在调用大模型时,没有指定 n 参数,那么就只有唯一的一个响应)选择,然后获取该选择的文本,并移除其前后的空白字符。这通常是你想要的模型的输出。

调用 Chat 模型

整体流程上,Chat 模型和 Text 模型的调用是完全一样的,只是输入(prompt)和输出(response)的数据格式有所不同。

response = openai.ChatCompletion.create(
  model="gpt-4",
  messages=[
        {"role": "system", "content": "You are a creative AI."},
        {"role": "user", "content": "请给我的花店起个名"},
    ],
  temperature=0.8,
  max_tokens=60
)
print(response['choices'][0]['message']['content'])

这段代码中,除去刚才已经介绍过的 temperature、max_tokens 等参数之外,有两个专属于 Chat 模型的概念,一个是消息,一个是角色!

消息

消息就是传入模型的提示。此处的 messages 参数是一个列表,包含了多个消息。每个消息都有一个 role(可以是 system、user 或 assistant)和 content(消息的内容)。系统消息设定了对话的背景(你是一个很棒的智能助手),然后用户消息提出了具体请求(请给我的花店起个名)。模型的任务是基于这些消息来生成回复。

角色

在 OpenAI 的 Chat 模型中,system、user 和 assistant 都是消息的角色。每一种角色都有不同的含义和作用。

  • system:系统消息主要用于设定对话的背景或上下文。这可以帮助模型理解它在对话中的角色和任务。例如,你可以通过系统消息来设定一个场景,让模型知道它是在扮演一个医生、律师或者一个知识丰富的 AI 助手。系统消息通常在对话开始时给出。
  • user:用户消息是从用户或人类角色发出的。它们通常包含了用户想要模型回答或完成的请求。用户消息可以是一个问题、一段话,或者任何其他用户希望模型响应的内容。
  • assistant:助手消息是模型的回复。例如,在你使用 API 发送多轮对话中新的对话请求时,可以通过助手消息提供先前对话的上下文。然而,请注意在对话的最后一条消息应始终为用户消息,因为模型总是要回应最后这条用户消息。

在使用 Chat 模型生成内容后,返回的响应,也就是 response 会包含一个或多个 choices,每个 choices 都包含一个 message。每个 message 也都包含一个 role 和 content。role 可以是 system、user 或 assistant,表示该消息的发送者,content 则包含了消息的实际内容。

{
 'id': 'chatcmpl-2nZI6v1cW9E3Jg4w2Xtoql0M3XHfH',
 'object': 'chat.completion',
 'created': 1677649420,
 'model': 'gpt-4',
 'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
 'choices': [
   {
    'message': {
      'role': 'assistant',
      'content': '你的花店可以叫做"花香四溢"。'
     },
    'finish_reason': 'stop',
    'index': 0
   }
  ]
}

在这里插入图片描述

这就是 response 的基本结构,其实它和 Text 模型返回的响应结构也是很相似,只是 choices 字段中的 Text 换成了 Message。你可以通过解析这个对象来获取你需要的信息。例如,要获取模型的回复,可使用 response[‘choices’][0][‘message’][‘content’]。

Chat 模型 vs Text 模型

Chat 模型和 Text 模型都有各自的优点,其适用性取决于具体的应用场景。相较于 Text 模型,Chat 模型的设计更适合处理对话或者多轮次交互的情况。这是因为它可以接受一个消息列表作为输入,而不仅仅是一个字符串。这个消息列表可以包含 system、user 和 assistant 的历史信息,从而在处理交互式对话时提供更多的上下文信息。
这种设计的主要优点包括:

  • 对话历史的管理:通过使用 Chat 模型,你可以更方便地管理对话的历史,并在需要时向模型提供这些历史信息。例如,你可以将过去的用户输入和模型的回复都包含在消息列表中,这样模型在生成新的回复时就可以考虑到这些历史信息。
  • 角色模拟:通过 system 角色,你可以设定对话的背景,给模型提供额外的指导信息,从而更好地控制输出的结果。

当然在 Text 模型中,你在提示中也可以为 AI 设定角色,作为输入的一部分。然而,对于简单的单轮文本生成任务,使用 Text 模型可能会更简单、更直接。例如,如果你只需要模型根据一个简单的提示生成一段文本,那么 Text 模型可能更适合。从上面的结果看,Chat 模型给我们输出的文本更完善,是一句完整的话,而 Text 模型输出的是几个名字。这是因为 ChatGPT 经过了对齐(基于人类反馈的强化学习),输出的答案更像是真实聊天场景。

通过 LangChain 调用 Text 和 Chat 模型

调用 text 模型

import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
from langchain.llms import OpenAI
llm = OpenAI(  
    model="text-davinci-003",
    temperature=0.8,
    max_tokens=60,)
response = llm.predict("请给我的花店起个名")
print(response)

这只是一个对 OpenAI API 的简单封装:先导入 LangChain 的 OpenAI 类,创建一个 LLM(大语言模型)对象,指定使用的模型和一些生成参数。使用创建的 LLM 对象和消息列表调用 OpenAI 类的 call 方法,进行文本生成。生成的结果被存储在 response 变量中。没有什么需要特别解释之处。

调用 chat 模型

import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(model="gpt-4",
                    temperature=0.8,
                    max_tokens=60)
from langchain.schema import (
    HumanMessage,
    SystemMessage
)
messages = [
    SystemMessage(content="你是一个很棒的智能助手"),
    HumanMessage(content="请给我的花店起个名")
]
response = chat(messages)
print(response)

这段代码也不难理解,主要是通过导入 LangChain 的 ChatOpenAI 类,创建一个 Chat 模型对象,指定使用的模型和一些生成参数。然后从 LangChain 的 schema 模块中导入 LangChain 的 SystemMessage 和 HumanMessage 类,创建一个消息列表。消息列表中包含了一个系统消息和一个人类消息。你已经知道系统消息通常用来设置一些上下文或者指导 AI 的行为,人类消息则是要求 AI 回应的内容。之后,使用创建的 chat 对象和消息列表调用 ChatOpenAI 类的 call 方法,进行文本生成。生成的结果被存储在 response 变量中。

另外,无论是 langchain.llms 中的 OpenAI(Text 模型),还是 langchain.chat_models 中的 ChatOpenAI 中的 ChatOpenAI(Chat 模型),其返回的结果 response 变量的结构,都比直接调用 OpenAI API 来得简单一些。这是因为,LangChain 已经对大语言模型的 output 进行了解析,只保留了响应中最重要的文字部分。

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

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

相关文章

1、LeetCode之两数之和

两数之和 给定一个整数数组 nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 nums [2,7,11,15]target 9[0,1]枚…

java计算两个字符串日期相隔天数

java计算两个字符串日期相隔天数 public static void main(String[] args) throws ParseException {Scanner sc new Scanner(System.in);System.out.print("请输入计算开始的日期(yyyy-MM-dd):");String startTime sc.next();System.out.print("请输入计算结…

《C++避坑神器·十九》C++多线程使用,啥也不懂看它就对了

C11后有了标准的线程库&#xff1a; #include <thread>并发 是指多个线程任务在同一个CPU上快速地轮换执行&#xff0c;由于切换的速度非常快&#xff0c;给人的感觉就是这些线程任务是在同时进行的&#xff0c;但其实并发只是一种逻辑上的同时进行&#xff1b; 并行 是…

vue-admin-template

修改登录接口 1.f12查看请求接口 模仿返回数据写接口 修改方式1 1.在env.devolopment修改 修改方式2 vue.config.js 改成本地接口地址 配置转发 后端创建相应接口&#xff0c;使用map返回相同的数据 修改前端请求路径 修改前端返回状态码 utils里面的request.js

“开源 vs. 闭源:大模型的未来发展趋势预测“——探讨大模型未来的发展方向

文章目录 每日一句正能量前言什么是大模型的开源与闭源开源与闭源的定义和特点开源的意义开源和闭源的优劣势比较不同的大模型企业&#xff0c;开源、闭源的策略不尽相同。开源vs 闭源&#xff1a;两者并非选择题后记 每日一句正能量 依赖别人的人等于折断了自己的翅膀&#xf…

Leetcode_48:旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],…

ROS stm32 CAN通信

文章目录 运行环境&#xff1a;原理1.1 ros中的代码1)socketcan_bridge2)测试的ros-python包3)keil5中数据解析4)USB-CAN连接5)启动指令 运行环境&#xff1a; ubuntu18.04.melodic STM32&#xff1a;DJI Robomaster C板 ROS&#xff1a;18.04 硬件&#xff1a;USB-CAN&#x…

索引的创建和设计原则

文章目录 1. 索引的声明与使用1.1 索引的分类1.2 创建索引 2. MySQL8.0索引新特性2.1 支持降序索引2.2 隐藏索引 3 哪些情况适合创建索引?3.1 字段的数值有唯一性的限制3.2 频繁作为 WHERE 查询条件的字段3.3 经常 GROUP BY 和 ORDER BY 的列3.4 UPDATE、DELETE 的 WHERE 条件…

【Linux】一

本文使用的是云服务器来获取Linux环境 (使用虚拟机同样可以学习使用命令), 并且介绍了常用的Linux 命令. 获取Linux环境 使用xshell连接到云服务器 1.新建会话 输入主机号(云服务器的外网ip) 2.输入用户名/密码 centos的用户名:root 密码就是在后台设置的 3.成功进入 ~描…

微信如何设置自动保存图片和视频

8-6 在日常的工作中&#xff0c;如果你需要经常或者每天都要对同事们发来的大量图片和视频进行保存的&#xff0c;这种工作需要花费很多时间&#xff0c;如果你想节省这些手工时间的话&#xff0c;也许本文适合你&#xff0c;首先要明白的是&#xff0c;微信本身是没有任何相关…

《C++避坑神器·二十一》回调函数使用

1、不涉及类的回调函数使用&#xff1a; 注意&#xff1a;提供给别人使用的就是注册回调函数的那个接口 void registHeightcallback(CallbackFun callback, void* contex) 2、涉及类的回调函数使用&#xff1a; 一般提供给别人使用的都是注册回调函数的接口 在类中定义的回调函…

相机突然断电,保存的DAT视频文件如何修复

3-7 本文主要解决因相机突然断电导致拍摄的视频文件损坏的问题。 在平常使用相机拍摄视频&#xff0c;比如用单反相机、无人机拍摄视频的时候&#xff0c;如果电池突然断电&#xff0c;或者突然炸机了&#xff0c;就非常有可能会得到一个损坏的视频文件&#xff0c;比如会产生…

基于JavaWeb+SpringBoot+Vue房屋租赁系统微信小程序系统的设计和实现

基于JavaWebSpringBootVue房屋租赁系统微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 21世纪是信息的时代&#xff0c;是网络的时代&#xff0c;进入信息社会高速…

WMS仓储管理系统与TMS系统整合后的优势

随着全球化的加速和供应链网络的日益复杂&#xff0c;仓库和运输成为企业运营中的两个关键环节。为了更高效地管理这两个环节&#xff0c;许多企业开始探索将WMS仓储管理系统和TMS运输管理系统整合的可能性。这种整合不仅可以提升仓库流程的可见性&#xff0c;还有助于改善调度…

将Python程序(.py)转换为Windows可执行文件(.exe)

python开发者向普通windows用户分享程序,要给程序加图形化的界面(传送门:这可能是最好玩的python GUI入门实例! http://www.jianshu.com/p/8abcf73adba3),并要将软件打包为可执行文件(.exe结尾),那如何将.py转为.exe ? 将.py转为.exe 第一步:安装pyinstaller(临时调用了国内豆…

JS 读取excel文件内容 和 将json数据导出excel文件

一、实现将json数据导出为excel文件 1、通过原生js实现 核心方法&#xff1a; function JSONToExcelConvertor(JSONData, FileName, title, filter) {if (!JSONData)return;//转化json为objectvar arrData typeof JSONData ! object ? JSON.parse(JSONData) : JSONData;va…

大数据Doris(二十三):取消导入与其他导入案例参考

文章目录 取消导入与其他导入案例参考 一、取消导入

一文看懂TikTok养号

随着国内抖音红利的进一步释放&#xff0c;越来越多人涌入了TikTok国内外市场。而TikTok作为海外新兴的社媒平台&#xff0c;也在迅速的发展着&#xff0c;吸引了大批的跨境电商玩家入驻。然而&#xff0c;TikTok运营的一大难点就是养号&#xff0c;许多人还没开始转化号就被封…

【MATLAB源码-第77期】基于matlab的OCDM系统在AWGN信道下理论误码率和实际误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交线性调频分频复用&#xff08;OCDM&#xff0c;Orthogonal Chirp Division Multiplexing&#xff09;是一种无线通信技术&#xff0c;它基于啁啾信号的原理。啁啾信号是一种频率随时间变化的信号&#xff0c;通常频率是线…

4.4.2.1 内部类

内部类 成员内部类 定义 调用内部类 访问修饰符的影响 外部类的成员变量及成员方法在内部类的使用 内部类在外部类的使用 静态内部类 静态内部类调用非静态外部类 1