当前位置: 首页 > article >正文

使用LangChain控制大模型的输出——解析器Parser

LangChain框架中有两个好用的工具:
提示词模板(PromptTemplate)用于指定LLM的输入,解析器(Parser)来正确解释LLM给出的输出

即:

  1. 提示词模板(PromptTemplate):用于格式化地接受输入string变量,作为完整的提示词。
    给生产{product}的公司起个名字。其中的product是可以变化的。

  2. 解析器(Parser):用于格式化大模型的输出,控制输出格式(不会有多余的文字描述)。
    dict格式的 {"product_name":"袜子", "company_name":"袜界精品"}

环境配置

from langchain_community.chat_models import ChatZhipuAI
import os
os.environ["ZHIPUAI_API_KEY"] = "463xxxxxxDLN"	# 替换为你的Api-Key
# 指定zhipu大模型
chat = ChatZhipuAI(model="glm-4",temperature=0.5)

1.仅用PromptTemplate

from langchain.prompts import ChatPromptTemplate

country = """中国"""
country_template = """
任务:输入一个国家,输出国家的首都
语言:中文

按json格式输出,输出格式如下:
country_name
capital_name

国家: {country_name}
"""

prompt_template = ChatPromptTemplate.from_template(country_template)
# print(prompt_template)

messages = prompt_template.format_messages(country_name = country)
response = chat(messages)
print(response.content)

输出是dict格式,偶尔会出现其他文字表述,且response中的keyvalue是取不出来的。
在这里插入图片描述

2.使用PromptTemplate + Parser

[步骤1]. 指定响应模式

from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParser

## [步骤1]. 指定响应模式
# 定义国家名称的响应模式
country_schema = ResponseSchema(name="country_name", description="国家的名称。")
# 定义首都名称的响应模式
capital_schema = ResponseSchema(name="capital_name", description="对应国家的首都名称。")
# 将两个模式放入列表中
response_schemas = [country_schema, capital_schema]

# 使用 `from_response_schemas` 方法创建 `StructuredOutputParser` 类的实例。
# 该方法接收 `response_schemas` 参数,即包含多个模式的列表。
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
print(output_parser)

输出如下:

StructuredOutputParser(response_schemas=[ResponseSchema(name=‘country_name’, description=‘Name of a country.’, type=‘string’), ResponseSchema(name=‘capital_name’, description=‘Capital of the corresponding country.’, type=‘string’)])

[步骤2]. 将响应格式化并插入到提示词中

这部分的提示词,跟仅PromptTemplate的区别就是,把"按json格式输出xxx"这截省略,用{format_instructions}就可以固定输出格式了。

format_instructions 嵌入到模版和提示词中,可以用ChatPromptTemplateHumanMessagePromptTemplate,效果一样,二选一,别看乱了。看一种就去看步骤3哈

法1. 用ChatPromptTemplate

## [步骤2]. 将响应格式化并插入到提示词中
from langchain.prompts import ChatPromptTemplate
# 获取格式化指令
format_instructions = output_parser.get_format_instructions()

# 定义模板字符串,用于构建提示词
country = "中国"
country_template = """\
任务: 输入一个国家,输出国家的首都
语言:中文

国家: {country_name}
{format_instructions}
"""
# 使用模板字符串创建 `ChatPromptTemplate` 实例
prompt_template = ChatPromptTemplate.from_template(country_template)
# 格式化消息,传入具体的国家名称和格式化指令
messages = prompt_template.format_messages(country_name=country,
                                           format_instructions=format_instructions)
# 发送消息并获取响应
response = chat(messages)
# 打印响应内容
print(response.content)

法2. 用HumanMessagePromptTemplate

from langchain.prompts import HumanMessagePromptTemplate
format_instructions = output_parser.get_format_instructions()

country_template = """\
任务: 输入一个国家,输出国家的首都
语言:中文

国家: {country_name}
{format_instructions}
"""

prompt = ChatPromptTemplate(
    messages=[HumanMessagePromptTemplate.from_template(country_template)],
    input_variables=["country_name"],
    partial_variables={"format_instructions": format_instructions}
)

messages = prompt.format_prompt(country_name = "中国")
response = chat(messages.to_messages())
print(response.content)

输出如下:

```json
{
“country_name”: “中国”,
“capital_name”: “北京”
}
```

[步骤3]. 解析响应

## [步骤3]. 解析响应
# 使用 `output_parser` 解析响应内容
output_dict = output_parser.parse(response.content)
# 打印解析后的响应
print(output_dict)

输出是dict格式,且一定可以取出dict中的keyvalue

反推过来,response中一定不会有其他文字。
在这里插入图片描述

完整代码

from langchain_community.chat_models import ChatZhipuAI
import os
os.environ["ZHIPUAI_API_KEY"] = "463xxxxxxDLN"	# 替换为你的Api-Key
# 指定zhipu大模型
chat = ChatZhipuAI(model="glm-4",temperature=0.5)

from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParser

## 步骤1. 指定响应模式
# 定义国家名称的响应模式
country_schema = ResponseSchema(name="country_name", description="国家的名称。")
# 定义首都名称的响应模式
capital_schema = ResponseSchema(name="capital_name", description="对应国家的首都名称。")
# 将两个模式放入列表中
response_schemas = [country_schema, capital_schema]

# 使用 `from_response_schemas` 方法创建 `StructuredOutputParser` 类的实例。
# 该方法接收 `response_schemas` 参数,即包含多个模式的列表。
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)


## 步骤2. 将响应格式化并插入到提示词中
from langchain.prompts import ChatPromptTemplate
# 获取格式化指令
format_instructions = output_parser.get_format_instructions()

# 定义模板字符串,用于构建提示词
country_template = """\
任务: 输入一个国家,输出国家的首都
语言:中文

国家: {country_name}
{format_instructions}
"""
# 使用模板字符串创建 `ChatPromptTemplate` 实例
prompt_template = ChatPromptTemplate.from_template(country_template)
# 格式化消息,传入具体的国家名称和格式化指令
messages = prompt_template.format_messages(country_name="中国",
                                           format_instructions=format_instructions)
# 发送消息并获取响应
response = chat(messages)
# 打印响应内容
print(response.content)

## 步骤3. 解析响应
# 使用 `output_parser` 解析响应内容
output_dict = output_parser.parse(response.content)
# 打印解析后的响应
print(output_dict)

更多LangChain的 解析器 Parse 使用教程:https://python.langchain.com.cn/docs/modules/model_io/output_parsers/
在这里插入图片描述


http://www.kler.cn/a/374887.html

相关文章:

  • SpringBoot+Vue养老院管理系统设计与实现【开题报告+程序+安装部署+售后讲解】
  • 数势科技:解锁数据分析 Agent 的智能密码(14/30)
  • Java:缓存:LinkedHashMap实现Lru
  • 计算机网络练习题
  • 【Yarn】通过JMX采集yarn相关指标的Flink任务核心逻辑
  • Redis(二)value 的五种常见数据类型简述
  • 人工智能:塑造未来生活的强大力量
  • 计组-层次化存储结构
  • uniapp+vite配置环境变量
  • Docker | 将本地项目发布到阿里云的实现流程
  • 第3关:命题逻辑推理
  • TQ15EG开发板教程:fmcomms8两片ADRV9009同步采集测试
  • SpringBoot后端开发常用工具详细介绍——flyway数据库版本控制工具
  • MyBatisPlus 中 LambdaQueryWrapper使用
  • ffmpeg+vue2
  • C++STL详解(九)map和set的使用
  • 探索高效办公新利器 ——ONLYOFFICE
  • TON 区块链开发的深入概述#TON链开发#DAPP开发#交易平台#NFT#Gamefi链游
  • django校园兼职系统-计算机毕业设计源码95561
  • 启明创投与七牛云坚定看好云计算发展前景
  • Java爬虫:如何优雅地从1688获取商品详情
  • 供应商图纸外发:如何做到既安全又高效?
  • 每日算法一练:剑指offer——数组篇(6)
  • 不适合的学习方法
  • SpringBoot应用部署到Docker中MySQL8时间戳相差8小时问题及处理方式
  • 开源AI智能名片2+1链动模式S2B2C商城小程序领域的未来探索