AI开发-python-langchain框架(1-11 返回枚举-格式解析器)
跟上一篇内容一样,这次我们来看如何限定大模型返回的结果值是枚举类型的。
先看代码:
# 导入必要的模块
from langchain.prompts import PromptTemplate # 用于创建和管理提示模板
from langchain_openai import ChatOpenAI # 用于调用OpenAI兼容的聊天模型(如DeepSeek)
from langchain.output_parsers.enum import EnumOutputParser # 用于将LLM输出解析为枚举类型
from enum import Enum # Python标准库,用于定义枚举类型
import os # 用于读取环境变量
# 定义颜色枚举类,限定LLM输出必须为以下五种颜色之一
class Colors(Enum):
RED = "红色"
BROWN = "棕色"
BLACK = "黑色"
WHITE = "白色"
YELLOW = "黄色"
# 创建枚举输出解析器,强制LLM输出必须匹配Colors枚举中的值
output_parser = EnumOutputParser(enum=Colors)
# 获取格式化指令,告诉LLM如何正确格式化输出(例如:"输出必须是:红色、棕色...")
format_instructions = output_parser.get_format_instructions()
print(format_instructions) # 打印格式要求,用于调试或提示用户
print('###########') # 分隔线
# 创建提示模板:包含两个占位符 {person}(人物)和 {instructions}(输出格式要求)
promptTemplate = PromptTemplate.from_template(
"""{person}的皮肤主要是什么颜色?
{instructions}"""
)
# 固定instructions部分的内容,避免每次调用时重复传入
instructions = "响应的结果请选择以下选项之一:红色、棕色、黑色、白色、黄色。"
prompt = promptTemplate.partial(instructions=instructions) # partial用于预填充模板中的部分变量
# 输出完整提示词示例(以"亚洲人"为例),用于调试查看实际发送给LLM的内容
print(prompt.invoke({"person": "亚洲人"}).text)
print('--------------')
# 初始化聊天模型(使用DeepSeek API)
llm = ChatOpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"), # 从环境变量读取API密钥
base_url=os.getenv("BASE_URL"), # 从环境变量读取API基础URL(如 https://api.deepseek.com)
model="deepseek-v3:671b", # 指定使用的模型版本
temperature=0.7, # 生成随机性控制:0.7 适中创造性
max_tokens=1024 # 单次响应最大token数
)
# 构建处理链:提示模板 → 大语言模型 → 枚举解析器
# 实现端到端流程:生成提示 → 调用LLM → 强制输出为枚举类型
chain = prompt | llm | output_parser
# 调用链,传入"亚洲人"作为输入
result = chain.invoke({"person": "亚洲人"})
# 输出解析后的结果(Enum类型)
print(result) # 打印枚举对象(如:Colors.YELLOW)
print(result.name) # 打印枚举成员名称(如:"YELLOW")
print(result.value) # 打印枚举成员值(如:"黄色")
返回值:
Select one of the following options: 红色, 棕色, 黑色, 白色, 黄色 ########### 亚洲人的皮肤主要是什么颜色? 响应的结果请选择以下选项之一:红色、棕色、黑色、白色、黄色。 -------------- Colors.YELLOW YELLOW 黄色
重点说明:
浙公网安备 33010602011771号