(一)、基于 LangChain 实现大模型应用程序开发 | 模型调用 + 提示模版构建 + 输出解析器

⭐ 下面我们开始入门下LangChain框架,LangChain 是用于构建大模型应用程序的开源框架,有Python和JavaScript两个不同版本的包。LangChain 也是一个开源项目,社区活跃,新增功能快速迭代。LangChain基于模块化组合,有许多单独的组件,可以一起使用或单独使用。

该专栏将重点介绍 LangChain 的常用组件:

  • 模型(Models):集成各种语言模型与向量模型。
  • 提示(Prompts):向模型提供指令的途径。
  • 索引(Indexes):提供数据检索功能。
  • 链(Chains):将组件组合实现端到端应用。
  • 代理(Agents):扩展模型的推理能力。

通过学习使用这些组件构建链式应用,你将可以快速上手 LangChain,开发出功能强大的语言模型程序。让我们开始探索LangChain的魅力吧!

文章目录

  • 1、openai 环境初始化 - 声明api key
  • 2、模型调用 + 提示模版构建
  • 3、人设设定 - SystemMessage
  • 4、构造输出解析器
  • Reference

  • ⭐ langchain官方文档:https://python.langchain.com/docs/get_started/introduction.html
  • ⭐ langchain官方GitHub地址:https://github.com/hwchase17/langchain

1、openai 环境初始化 - 声明api key

通过langchain调用chatgpt接口,需先声明一下OPENAI_API_KEY环境变量,即你的api key。在当前目录下创建一个.env文件,里面的内容存你的api key,写法如下:

OPENAI_API_KEY = ‘sk-xxx’

这样,跑下面的代码时就可以调接口了。

import os
import openai
# 运行此API配置,需要将目录中的.env中api_key替换为自己的
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.environ['OPENAI_API_KEY']

2、模型调用 + 提示模版构建

  • 在一些复杂的场景,prompt可能写的比较长,不利于管理,使用这种模版的形式可以方便的重复使用。
  • LangChain还提供了提示模版用于一些常用场景。比如summarization, Question answering, or connect to sql databases等。 通过使用LongChain内置的提示模版,你可以快速建立自己的大模型应用,而不需要花时间去设计和构造提示。
  • 对于如何设计更好的prompt,我不做介绍,可参考我的prompt engineering专题进行学习:https://blog.csdn.net/weixin_43646592/category_12329055.html?spm=1001.2014.3001.5482。
  • langchain专题主要讲如何基于langchain进行大模型的开发与应用。
# 这里我们将参数temperature设置为0.0,从而减少生成答案的随机性。
# 如果你想要每次得到不一样的有新意的答案,可以尝试调整该参数。
# 以下的对话均无记忆,即每次调用预测不会记得之前的对话。(想要有记忆功能请看下一节的langchain的Memory模块)
chat = ChatOpenAI(temperature=0,
                  model_name="gpt-3.5-turbo")
chat

ChatOpenAI(cache=None, verbose=False, callbacks=None, callback_manager=None, tags=None, client=<class ‘openai.api_resources.chat_completion.ChatCompletion’>, model_name=‘gpt-3.5-turbo’, temperature=0.0, model_kwargs={}, openai_api_key=‘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’, openai_api_base=‘’, openai_organization=‘’, openai_proxy=‘’, request_timeout=None, max_retries=6, streaming=False, n=1, max_tokens=None, tiktoken_model_name=None)

# \在字符串里就是取消换行符的意思
template_string =  """\
对与如下三个反引号括住的评论,我需要提取如下信息。
饮料:这个产品是饮料吗?如果是,返回True,否则返回答False。
产品名:提取出产品的名字,如果没有,返回-1。
价格与价值:提取出关于该产品的价格或价值的所有信息,将他们存入python list中,并返回。
{format_instructions}
```{query}```"""

prompt_template = ChatPromptTemplate.from_template(template_string)
prompt_template

ChatPromptTemplate(input_variables=[‘query’, ‘format_instructions’], output_parser=None, partial_variables={}, messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=[‘format_instructions’, ‘query’], output_parser=None, partial_variables={}, template=‘对与如下三个反引号括住的评论,我需要提取如下信息。\n饮料:这个产品是饮料吗?如果是,返回True,否则返回答False。\n产品名:提取出产品的名字,如果没有,返回-1。\n价格与价值:提取出关于该产品的价格或价值的所有信息,将他们存入python list中,并返回。\n{format_instructions}\n{query}’, template_format=‘f-string’, validate_template=True), additional_kwargs={})])

prompt_template.input_variables
['query', 'format_instructions']
query = '这喜茶新出的桑葚葡萄太好喝里吧,而且才19块一杯,太值啦,高性价比!'
format_instructions = """\
将输出组织成带有如下key的json形式:
饮料
产品名
价格与价值"""

prompt = prompt_template.format_messages(format_instructions=format_instructions, query=query)
print(prompt)
print(prompt[0])
# prompt一个HumanMessage的类,也就是人类的提问
  • [HumanMessage(content=‘对与如下三个反引号括住的评论,我需要提取如下信息。\n饮料:这个产品是饮料吗?如果是,返回True,否则返回答False。\n产品名:提取出产品的名字,如果没有,返回-1。\n价格与价值:提取出关于该产品的价格或价值的所有信息,将他们存入python list中,并返回。\n将输出组织成带有如下key的json形式:\n饮料\n产品名\n价格与价值\n这喜茶新出的桑葚葡萄太好喝里吧,而且才19块一杯,太值啦,高性价比!’, additional_kwargs={}, example=False)]
  • content=‘对与如下三个反引号括住的评论,我需要提取如下信息。\n饮料:这个产品是饮料吗?如果是,返回True,否则返回答False。\n产品名:提取出产品的名字,如果没有,返回-1。\n价格与价值:提取出关于该产品的价格或价值的所有信息,将他们存入python list中,并返回。\n将输出组织成带有如下key的json形式:\n饮料\n产品名\n价格与价值\n这喜茶新出的桑葚葡萄太好喝里吧,而且才19块一杯,太值啦,高性价比!’ additional_kwargs={} example=False

3、人设设定 - SystemMessage

from langchain.schema import HumanMessage, SystemMessage
# 可以通过SystemMessage类来设置机器人的人设,即让它角色扮演
system_msg = SystemMessage(content="你是一个语文老师。")
system_msg
# SystemMessage(content='你是一个语文老师。', additional_kwargs={})

# res = chat(prompt) # 不用人设
res = chat([system_msg]+prompt) # 用人设,因为prompt本身就是个列表
res = res.content
print(res)
print(type(res))

{
“饮料”: true,
“产品名”: “桑葚葡萄”,
“价格与价值”: [“19块一杯”, “高性价比”]
}
<class ‘str’>

msg = [HumanMessage(content='你是谁?')]
res = chat([system_msg]+msg) # 用人设,因为prompt本身就是个列表
res = res.content
print(res)
# 我是一个语文老师。

4、构造输出解析器

前面的res.content,无论你prompt返里让他返回什么,如json格式,它回的都是字符串类型。
而使用如下langchain提供的输出解析器,则方便将输出格式化为我们想要的格式,以便处理下游任务。

# 🔥构造输出解析器
from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParser
gift_schema = ResponseSchema(name="饮料",
                             description='',
                             type="string")

delivery_days_schema = ResponseSchema(name="产品名",
                                      description='',
                                      type="string")

price_value_schema = ResponseSchema(name="价格与价值",
                                    description='',
                                    type="list")
response_schemas = [gift_schema,
                    delivery_days_schema,
                    price_value_schema]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()
print(format_instructions)

输出:

The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":
```json
{
	"饮料": string  // 
	"产品名": string  // 
	"价格与价值": list  // 
}
prompt = prompt_template.format_messages(format_instructions=format_instructions, query=query)
print(prompt)
print(prompt[0].content)

输出:

[HumanMessage(content='对与如下三个反引号括住的评论,我需要提取如下信息。\n饮料:这个产品是饮料吗?如果是,返回True,否则返回答False。\n产品名:提取出产品的名字,如果没有,返回-1。\n价格与价值:提取出关于该产品的价格或价值的所有信息,将他们存入python list中,并返回。\nThe output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":\n\n```json\n{\n\t"饮料": string  // \n\t"产品名": string  // \n\t"价格与价值": list  // \n}\n```\n```这喜茶新出的桑葚葡萄太好喝里吧,而且才19块一杯,太值啦,高性价比!```', additional_kwargs={}, example=False)]
对与如下三个反引号括住的评论,我需要提取如下信息。
饮料:这个产品是饮料吗?如果是,返回True,否则返回答False。
产品名:提取出产品的名字,如果没有,返回-1。
价格与价值:提取出关于该产品的价格或价值的所有信息,将他们存入python list中,并返回。
The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":

```json
{
	"饮料": string  // 
	"产品名": string  // 
	"价格与价值": list  // 
}
```
```这喜茶新出的桑葚葡萄太好喝里吧,而且才19块一杯,太值啦,高性价比!```
res = chat(prompt)
res = res.content
print(res)
print(type(res))

```json
{
	"饮料": true,
	"产品名": "桑葚葡萄",
	"价格与价值": ["19块一杯", "太值啦", "高性价比"]
}
```
<class 'str'>

解析器解析一波:

format_res = output_parser.parse(res)
print(format_res)
print(type(format_res))

{'饮料': True, '产品名': '桑葚葡萄', '价格与价值': ['19块一杯', '太值啦', '高性价比']}
<class 'dict'>

Reference

  • [1] 吴恩达老师的教程
  • [2] DataWhale组织

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

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

相关文章

everything的高效使用方法

目录 前言1 everything的简单介绍2 常用搜索3 语法搜索4 正则表达式搜索5 服务器功能 前言 本文介绍everything软件的高效使用方法&#xff0c;everything是一款在系统中快速搜索文件的软件&#xff0c;能够帮助人们快速定位需要查找的文件。首先介绍everything软件的作用和使…

自学人工智能该从哪里开始准备?

随着人工智能技术的飞速发展&#xff0c;越来越多的人对学习人工智能产生了浓厚的兴趣。然而&#xff0c;对于许多初学者来说&#xff0c;不知道如何开始自学人工智能。今天&#xff0c;我将向大家介绍一些自学人工智能的步骤&#xff0c;帮助大家更好地入门这个领域。 第一步&…

基于SSM的奖助学金管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

【MATLAB】史上最全的9种频谱分析算法全家桶

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 大家吃一顿火锅的价格便可以拥有9种频谱分析算法&#xff0c;绝对不亏&#xff0c;知识付费是现今时代的趋势&#xff0c;而且都是我精心制作的教程&#xff0c;有问题可随时反馈~也可单独获取某一算法的代码&#xff08…

基于SSM的焦作旅游协会管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

应用程序生成器:App Builder 2023

DecSoft应用程序生成器 专为小屏幕设备设计&#xff0c;但也可以&#xff08;无需更改&#xff09;部署在平板电脑等较大设备中。 如果您想创建现代桌面和移动应用程序&#xff0c;那么您来对地方了&#xff01;DecSoft App Builder 是一个专业的可视化开发环境&#xff0c;用于…

【LeetCode刷题笔记】链表

141. 环形链表 解题思路: 1. 哈希表 , 最容易想到的方法是遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过。 2. 快慢指针 「Floyd 判圈算法」(又称龟兔赛跑算法)快慢指针从 head 开始走, 慢指针每次只移动1步 ,而 快指针每次移动2步 。 如果在移动的过程…

常用的OLED透明显示屏款式,有几种?

作为OLED透明屏的制造工程师&#xff0c;尼伽小编对这一领域的发展和技术进步有着丰富的经验和深入的理解。在本文中&#xff0c;我将为大家介绍一些关于OLED透明显示屏款式的知识&#xff0c;并探讨其在未来的应用前景。 OLED透明显示屏作为新一代的显示技术&#xff0c;其独特…

实人认证API的出现,让电子化身份验证更加可靠

前言 随着信息技术的快速发展和数字化转型的加速&#xff0c;各种电子化应用正在走进人们的生活中&#xff0c;电子化身份验证也成为了日益普遍的需求。从现在生活中各种App、网站、电商平台等需要身份认证的场景来看&#xff0c;身份验证的确是十分重要的一环。但是&#xff…

监控电脑的软件叫什么丨科普小知识

监控电脑的软件叫电脑监控软件。 电脑监控软件是一种可以监控电脑使用情况的软件&#xff0c;通常具有记录屏幕活动、网站访问、聊天记录等功能。 应用场景 1、企业内部管理&#xff1a;企业管理者可以通过监控电脑软件来监视员工的工作活动&#xff0c;以确保员工遵守公司政…

基于Pyflwdir实现流域的提取(参照官网例子)

本文参照官网例子实现流域的提取,官方GitHub地址如下pyflwdir&#xff1a; 该工具包目前仅支持D8和LDD两种算法&#xff0c;在效率上具有较好的应用性&#xff0c;我用省级的DEM&#xff08;30米&#xff09;数据作为测试&#xff0c;输出效率可以满足一般作业需要。 环境env…

微信怎么发状态?简单教程,一学就会!

微信是一个非常实用的社交应用&#xff0c;不仅提供了基础的聊天功能&#xff0c;还推出了很多其他有趣的功能。比如微信个人状态&#xff0c;这个功能可以让用户随时随地分享自己的心情和动态。那么&#xff0c;微信怎么发状态呢&#xff1f;本文将为大家介绍有关微信发状态的…

三十分钟学会SCALA

SCALA Scala 是一种运行在 JVM上的函数式的面向对象语言。 Scala 是兼容的&#xff1a;兼容 Java&#xff0c;可以访问庞大的 Java 类库&#xff1b;Scala 是精简的&#xff1a;Scala 表达能力强&#xff0c;一行代码抵得上多行 Java 代码&#xff0c;开发速度快。可以让程序…

【快速解决】实验四 对话框 《Android程序设计》实验报告

目录 前言 实验要求 实验四 对话框 正文开始 第一步建立项目 第二步选择empty views activity点击next ​编辑 第三步起名字&#xff0c;点击finish 第四步对 activity _main.xml文件操作进行布局 第五步&#xff0c;建立两个新文件&#xff0c;建立方法如下 SecondA…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑多重不确定性和潜在博弈的楼宇群电能优化调度策略》

这个标题涉及到楼宇群电能的优化调度策略&#xff0c;并强调了两个重要的方面&#xff1a;多重不确定性和潜在博弈。 楼宇群电能优化调度策略&#xff1a; 这指的是在一个涉及多个楼宇&#xff08;建筑物&#xff09;的群体中&#xff0c;对电能的使用进行优化调度的策略。这可…

矩阵代数概论

矩阵代数 共轭转置 对于矩阵 A [ a i j ] A[a_{ij}] A[aij​]&#xff0c;共轭矩阵被定义为 A ‾ [ a ‾ i j ] \overline{A}[\overline{a}_{ij}] A[aij​]&#xff0c;所以 A A A的共轭转置 A ‾ T A T ‾ \overline{A}^T\overline{A^T} ATAT&#xff0c;其中 A ‾ T \ov…

【Flink】核心概念:并行度与算子链

并行度&#xff08;Parallelism&#xff09; 当要处理的数据量非常大时&#xff0c;我们可以把一个算子操作&#xff0c;“复制”多份到多个节点&#xff0c;数据来了之后就可以到其中任意一个执行。这样一来&#xff0c;一个算子任务就被拆分成了多个并行的“子任务”&#x…

单图像3D重建AI算法综述【2023】

计算机视觉是人工智能的一个快速发展的领域&#xff0c;特别是在 3D 领域。 本概述将考虑一个应用任务&#xff1a;2D 和 3D 环境之间的转换。 在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编…

python趣味编程-5分钟实现一个蛇梯游戏(含源码、步骤讲解)

蛇梯游戏是用Python编程语言开发的,它是一个桌面应用程序。 这个Python蛇梯游戏可以免费下载开源代码,它是为想要学习Python的初学者创建的。 该项目系统使用了 Pygame 和 Random 模块。 Pygame 是一组跨平台的 Python 模块,专为编写视频游戏而设计。 此游戏包含 Python …

《洛谷深入浅出基础篇》P5266 学籍管理——map的应用

上链接&#xff1a;P5266 【深基17.例6】学籍管理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P5266#submit 题干&#xff1a; 题目描述 您要设计一个学籍管理系统&#xff0c;最开始学籍数据是空的&#xff0c;然后该系统能够支持下面的…
最新文章