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

小白从零开始勇闯人工智能:LangChain 入门指南(下)

1、输出解析器

模型返回的内容通常是字符串,但我们往往希望得到结构化的数据(如列表、JSON)。LangChain 的输出解析器可以将模型输出解析成 Python 对象。

1、列表解析器

通过LangChain框架构建了一个结合输出解析器:首先创建解析器并获取其格式说明作为系统提示,然后定义聊天提示模板,其中系统消息嵌入解析器指令,人类消息要求列出指定国家的五个汽车品牌;接着用“中国”和解析指令填充模板,调用qwen-plus模型生成回答,最后打印原始输出并通过解析器将逗号分隔的内容转换为列表。

from langchain_openai import ChatOpenAI from langchain.output_parsers import CommaSeparatedListOutputParser from langchain.prompts import ChatPromptTemplate output_parser = CommaSeparatedListOutputParser() parser_instructions = output_parser.get_format_instructions() print(parser_instructions)

get_format_instructions() 会返回一段说明文字,告诉模型应该以何种格式输出。

prompt = ChatPromptTemplate.from_messages([ ("system", "{parser_instructions}"), ("human", "列出5个{subject}国家的汽车品牌。") ]) final_prompt = prompt.invoke({ "subject": "中国", "parser_instructions": parser_instructions }) model = ChatOpenAI( model="qwen-plus", openai_api_key="你的API_KEY", openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1" ) response = model.invoke(final_prompt) print(response.content) # 例如:比亚迪, 吉利, 长城, 蔚来, 小鹏 # 使用解析器将字符串转为列表 result = output_parser.invoke(response) print(result) # ['比亚迪', '吉利', '长城', '蔚来', '小鹏']

这样我们就得到了一个干净的 Python 列表,便于后续处理。

2、JSON 解析器

对于更复杂的数据结构,可以使用基于 Pydantic 的解析器,定义好期望的 JSON 格式,模型就会按此格式返回 JSON。

通过LangChain框架结合Pydantic输出解析器,首先定义了一个包含电影名、导演和题材字段的FilmInfo数据模型,然后创建PydanticOutputParser实例并获取其格式指令作为系统提示。接着构建聊天提示模板,要求模型从给定的电影概述中提取信息并用中文输出。调用模型生成回答,最后通过解析器将模型输出转换为结构化的FilmInfo对象。

from typing import List from langchain.output_parsers import PydanticOutputParser from langchain.prompts import ChatPromptTemplate from langchain_core.pydantic_v1 import BaseModel, Field # 定义我们期望的数据结构 class FilmInfo(BaseModel): film_name: str = Field(description="电影的名字", example="拯救大兵瑞恩") author_name: str = Field(description="电影的导演", example="斯皮尔伯格") genres: List[str] = Field(description="电影的题材", example=["历史", "战争"]) output_parser = PydanticOutputParser(pydantic_object=FilmInfo) print(output_parser.get_format_instructions())

这段输出会告诉模型:你需要返回一个 JSON 对象,包含 film_name、author_name、genres 字段,并给出 JSON schema。

接着构造提示:

prompt = ChatPromptTemplate.from_messages([ ("system", "{parser_instructions} 你输出的结果请使用中文。"), ("human", "请你帮我从电影概述中,提取电影名、导演,以及电影的体裁。电影概述会被三个#符号包围。\n###{film_introduction}###") ]) film_introduction = """ 《唐人街探案》是由万达影视传媒有限公司、上海骋亚影视文化传媒有限公司出品,湖南芒果娱乐有限公司、合一影业有限公司等联合出品,陈思诚执导,陈思诚、程佳客、刘凯、白鹤编剧,王宝强、刘昊然领衔主演,陈赫、佟丽娅、肖央、小沈阳特别出演,金士杰、董成鹏、张国强友情出演的喜剧电影 [67]。该片于2015年12月31日在中国上映 [69-70]。2025年4月30日19:30在江苏卫视播出。 [80] 该片讲述了唐仁、秦风必须在躲避警察追捕、匪帮追杀、黑帮围剿的同时,在短短七天内,完成找到“失落的黄金”、查明“真凶”、为自己“洗清罪名”这些“逆天”任务的故事 [69]。 该片获得第73届威尼斯国际电影节“威尼斯日”特别推荐、“观众票选最受瞩目电影奖”、“东京电影节展映” [1] [72],截至2024年5月8日,该片累计票房82333.7万元 [71]。 """ final_prompt = prompt.invoke({ "film_introduction": film_introduction, "parser_instructions": output_parser.get_format_instructions() }) model = ChatOpenAI( model="qwen-plus", openai_api_key="你的API_KEY", openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1" ) response = model.invoke(final_prompt) print(response.content)

使用解析器提取为 FilmInfo 对象:

result = output_parser.invoke(response) print(result) # FilmInfo(film_name='唐人街探案', author_name='陈思诚', genres=['喜剧']) print(result.film_name) # 唐人街探案 print(result.genres) # ['喜剧']

5、链:将一切串联起来

前面我们都是分别调用 prompt、model、parser,但 LangChain 最强大的特性之一是可以使用 | 操作符将这些组件组合成一个链(Chain),然后一次性调用。

通过LangChain构建一个问答链,首先创建包含输出解析器格式指令的提示模板,并使用逗号分隔列表解析器,随后实例化ChatOpenAI模型。我们对比两种调用方式:传统方式通过多次嵌套invoke逐步执行提示填充、模型推理和结果解析;而链式调用使用管道符`|`将提示模板、模型和解析器组合成一个可执行链,直接传入输入参数即可获得解析后的列表。两种方式都可以输出结果,但链式写法更简洁直观。

from langchain_openai import ChatOpenAI from langchain.output_parsers import CommaSeparatedListOutputParser from langchain.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_messages([ ("system", "{parser_instructions}"), ("human", "列出5个{subject}生产的汽车的品牌。") ]) output_parser = CommaSeparatedListOutputParser() parser_instructions = output_parser.get_format_instructions() model = ChatOpenAI( model="qwen-plus", openai_api_key="你的API_KEY", openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1" ) # 传统方式:嵌套调用 result_old = output_parser.invoke( model.invoke( prompt.invoke({"subject": "中国", "parser_instructions": parser_instructions}) ) ) # 使用链:使用管道符组合 chat_model_chain = prompt | model | output_parser result = chat_model_chain.invoke({"subject": "中国", "parser_instructions": parser_instructions}) print(result) # ['比亚迪', '吉利', '长城', '蔚来', '小鹏']

prompt | model | output_parser 创建了一个链,它接受输入字典,先交给 prompt 生成消息,然后交给 model 获取响应,最后交给 output_parser 解析。

调用链的 .invoke() 方法只需传入一个字典,内部自动完成整个流程。

通过这两篇文章的学习,我们已经了解了LangChain的五个核心概念。首先是模型,它提供了与底层大型语言模型进行交互的基础能力。其次是提示模板,用于动态构建系统消息和用户消息,以灵活地构造输入。第三是少量示例提示模板,通过提供示例来引导模型按照期望的格式生成输出。第四是输出解析器,能够将模型的输出解析为结构化的数据形式,例如列表或JSON对象。最后是链,它能够将多个组件无缝地组合在一起,形成复杂的任务处理流程。这些组件可以被组合使用,以构建各种AI应用,例如智能翻译、信息提取和格式化输出等实用工具。在此基础上,我们下一步将会继续探索LangChain的其他功能,包括内存(Memory)用于状态管理、代理(Agent)用于自主决策、文档加载器(Document Loaders)用于处理外部数据等,从而进一步扩展我们应用的能力。

http://www.jsqmd.com/news/491527/

相关文章:

  • GoChatIAI -Go语言AI应用服务平台(3)
  • 酒店地毯供应商实力评测及选购指南 - 优质品牌商家
  • 6款思维导图软件深度评测:协作、AI能力与工具选型对比
  • 基于javaweb和mysql的ssm酒吧后台管理系统(java+ssm+jsp+html+mysql)
  • ToB/ToC 前端开发:程序员选赛道必看!从业务本质到技术选型,避开高频坑
  • 2026大型集团资产管理系统选型指南:五大主流平台深度解析与推荐 - 品牌2026
  • 计算机毕业设计之springboot疫情背景下光明小区管理系统的设计与实现
  • 国产替代:福尔蒂vs利安隆/金发/普立万在阻燃PC母粒的技术代差与应用边界
  • buuctf BabyUpload
  • 以太坊 vs Polkadot 预编译合约对比 | 同样的入口,完全不同的能力边界
  • 题目2281:蓝桥杯2018年第九届真题-次数差
  • Windows 10系统盘制作(纯净版)
  • 具身智能中的VLA基础概念
  • 【Spring框架】别再死记硬背!AOP 原来这么简单
  • 回归实战2
  • 一次试样失败催生的技术革新:福尔蒂吹瓶专用ACR助剂逆向推演与流变拟合
  • 半监督食物图像分类项目
  • 国内首个,面向中小企业数据资产估值体系:“荟宸信科面向中小企业数据资产估值体系”正式发布(一)
  • iPhone开发 - %1$、%2$的写法
  • 就让我们从react的渲染逻辑出发吧
  • WordPress报错:preg_match() Compilation failed 错误解决方法
  • 【跨端技术ReactNative】JavaScript学习
  • 长亭 Xray Web 漏洞扫描器
  • 行业大咖谈数据资产|中海油如何规划数据资产管理?央企硬核实践拆解
  • 湘潭品牌设计公司权威推荐榜单
  • 零/负电价来了!储能业主如何抓住机遇?
  • 中小企业可用福尔蒂轻量化改性套件:含17种PA6/PBT配比+免费云端模拟
  • es为什么快面试回答
  • 筋膜提升第几天最肿
  • 深入解析HDFS:定义、架构、原理、应用场景及常用命令