langchain基础(二)

一、输出解析器(Output Parser)

作用:(1)让模型按照指定的格式输出;

(2)解析模型输出,提取所需的信息

1、逗号分隔列表

CommaSeparatedListOutputParser:规定模型输出为以逗号分隔的字符串形式(它是自然语言意义上的列表,不是 Python 意义上的列表),解析时再将逗号分隔的字符串转成列表。

python 复制代码
#使用CommaSeparatedListOutputParser限制模型输出格式,并对输出进行解析,将其转换为列表形式。

from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatOpenAI

# 初始化模型
model=ChatOpenAI(model="gpt-3.5-turbo",
                 base_url="https://api.gptsapi.net/v1",
                )

#构建消息列表
prompt = ChatPromptTemplate.from_messages([ #构建提示模板
    ("system", "{parser_instructions}"),
    ("human", "列出5个{subject}色系的十六进制颜色码。")
])

output_parser=CommaSeparatedListOutputParser() #创建输出解析器(以逗号分隔的列表)
parser_instructions=output_parser.get_format_instructions() #获取解析器的指令
print(parser_instructions) #Your response should be a list of comma separated values, eg: `foo, bar, baz` or `foo,bar,baz`

final_prompt=prompt.invoke( #将变量填充,生成最终提示
    {"parser_instructions":parser_instructions,
    "subject":"莫兰迪"}
)

# 调用模型并输出结果
response=model.invoke(final_prompt)
print(type(response)) #<class 'langchain_core.messages.ai.AIMessage'>
print(response.content) # #F0A202, #FFCD75, #F8E6A0, #EAE0C8, #E1D9B7

response2list=output_parser.invoke(response) #使用output_parser的invoke方法对模型的响应response进行解析
print(response2list) #['#F0A202', '#FFCD75', '#F8E6A0', '#EAE0C8', '#E1D9B7']

系统消息("{parser_instructions}"),此消息位置用于传递输出解析器的指令,告诉模型如何格式化输出。

创建CommaSeparatedListOutputParser实例output_parser,用于解析模型输出。

通过output_parser.get_format_instructions()获取输出格式指令,这些指令会告诉模型应以逗号分隔的列表形式输出结果。打印这些指令可查看具体内容,例如:"你的回答应该是一个逗号分隔的列表,不包含任何其他解释或说明。"

使用output_parser的invoke方法对模型的响应response进行解析。output_parser会按照之前定义的格式指令,将模型输出转换为 Python 列表。

对于output_parser的invoke函数,

Union[str, BaseMessage] 是 Python typing 模块中的类型注解,表示 input 参数可以是 str 类型(字符串类型)或者 BaseMessage 类型。Union 用于指定一个参数可以是多种类型中的任意一种。

2、JSON

python 复制代码
# 从给定的书籍概述中提取书名、作者以及书籍体裁等信息,并将提取结果解析为 Pydantic 模型对象

from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import ChatPromptTemplate
from pydantic import BaseModel,Field
from typing import List
from langchain_community.chat_models import ChatOpenAI

# 初始化模型
model=ChatOpenAI(model="gpt-3.5-turbo",
                 base_url="https://api.gptsapi.net/v1",
                )

# 消息列表
## 定义数据输出和解析格式,获取parser_instructions
class BookInfo(BaseModel):
    book_name:str=Field(description="书籍的名字",
                        example="百年孤独")
    author_name:str=Field(description="书籍的作者",
                          example="加西亚·马尔克斯")
    genres:List[str]=Field(description="书籍的体裁",
                         example=["小说","文学"])
    
output_parser=PydanticOutputParser(pydantic_object=BookInfo) #将BookInfo类作为参数传递,用于将模型输出解析为BookInfo对象
parser_instructions=output_parser.get_format_instructions()
print(parser_instructions)

## 构建提示模板
prompt=ChatPromptTemplate.from_messages(
    [
        ("system","{parser_instructions}。你输出的结果请使用中文。"),
        ("human","请你帮我从书籍概述中,提取书名、作者,以及书籍的体裁。书籍概述会被三个#符号包围。\n###{book_introduction}###")
    ]
)

book_introduction="""
《明朝那些事儿》,作者是当年明月。2006 年 3 月在天涯社区首次发表,
2009 年 3 月 21 日连载完毕,边写作边集结成书出版发行,一共 7 本。
《明朝那些事儿》主要讲述的是从 1344 年到 1644 年这三百年间关于明朝的一些故事。
以史料为基础,以年代和具体人物为主线,并加入了小说的笔法,语言幽默风趣。
对明朝十六帝和其他王公权贵和小人物的命运进行全景展示,
尤其对官场政治、战争、帝王心术着墨最多,并加入对当时政治经济制度、人伦道德的演义。
它以一种网络语言向读者娓娓道出三百多年关于明朝的历史故事、人物。
其中原本在历史中陌生、模糊的历史人物在书中一个个变得鲜活起来。
《明朝那些事儿》为读者解读历史中的另一面,让历史变成一部活生生的生活故事。"""

## 将格式指令和书籍概述填充到提示模板中,生成最终的提示
final_prompt=prompt.invoke(
    {
        "parser_instructions":parser_instructions,
        "book_introduction":book_introduction
    }
)

# 调用模型并输出结果
response=model.invoke(final_prompt)
print(response.content)

response2bookinfo=output_parser.invoke(response) #将模型的响应response解析为BookInfo对象response2bookinfo
print(response2bookinfo)
print(response2bookinfo.book_name)
print(response2bookinfo.author_name)
print(response2bookinfo.genres)

1、pydantic是一个功能强大的python库,主要用于数据验证、数据解析和数据序列化。

数据验证:

(1)类型检查:对输入的数据进行严格的类型检查,确保数据符合模型定义的类型。例如,在定义一个用户模型时,可以指定用户的年龄为整数类型,如果传入的数据不是整数,pydantic 会抛出验证错误。

(2)范围和约束检查:为字段设置范围和约束条件,如最大长度、最小长度、最大值、最小值等。

数据解析:

自动类型转换: 可以自动将输入的数据转换为模型定义的类型。例如,输入的字符串形式的数字可以自动转换为整数或浮点数。

数据序列化:

模型实例可以方便地转换为字典(.dict)或 JSON 字符串(.json),便于数据的存储和传输。

补充:dict和json的区别

如果你只在 Python 内部处理数据,字典可能更合适;而如果涉及到数据的传输或存储,尤其是跨系统的交互,JSON 字符串通常是更好的选择。

2、BaseModelField来自pydantic库,它们具有以下作用:

BaseModel是一个基类,用于创建数据模型类。通过继承BaseModel,可以快速定义具有数据验证、序列化和反序列化等功能的数据模型。

比如BookInfo类继承自BaseModel,这使得BookInfo类可以利用pydantic提供的自动验证功能,确保数据符合定义的类型和约束条件。

Field是用于定义模型字段的函数。它为模型中的字段(book_nameauthor_namegenres)提供额外的元数据和配置选项,如字段的描述(descripton)、示例(example)等。

这些信息在生成文档、进行数据验证以及帮助开发者、AI理解代码逻辑等方面都非常有帮助。

3、打印指令print(parser_instructions)

开头部分说明了输出应该被格式化为一个符合给定 JSON 模式的 JSON 实例,并通过一个示例展示了什么样的输出是符合模式的,什么样的输出是不符合模式的。

JSON Schema(schema模式,用于规范实际存储的书籍信息的结构和规则):"说明书"

输出json:

4、输出的json本质上是字符串,将其转为类实例更容易提取对应信息

result.book_name就可以直接得到书名了。

5、from typing import List

在 Python 3.9 之前需要引入 List 来实现更精确的类型提示,而 Python 3.9 及以后可以直接使用内置的 list 完成类似功能。不过,为了保持代码在不同 Python 版本之间的兼容性,很多项目仍然会使用 typing 模块中的类型。

相关推荐
学历真的很重要8 小时前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
工藤学编程9 小时前
零基础学AI大模型之LangChain智能体执行引擎AgentExecutor
人工智能·langchain
Smoothzjc14 小时前
别再只把AI当聊天机器人了!揭秘大模型进化的终极形态,看完颠覆你的认知!
后端·langchain·ai编程
SCBAiotAigc14 小时前
langchain1.x学习笔记(三):langchain之init_chat_model的新用法
人工智能·python·langchain·langgraph·deepagents
工藤学编程20 小时前
零基础学AI大模型之LangChain智能体之initialize_agent开发实战
人工智能·langchain
ohyeah1 天前
打造 AI 驱动的 Git 提交规范助手:基于 React + Express + Ollama+langchain 的全栈实践
langchain·全栈·ollama
XiaoYu20021 天前
第11章 LangChain
前端·javascript·langchain
猫头虎1 天前
2025年AI领域年度深度总结:始于DeepSeek R1开源发布,终于Manus天价出海
人工智能·langchain·开源·prompt·aigc·ai编程·编程技术
真上帝的左手2 天前
26. AI-框架工具-LangChain & LangGraph
人工智能·langchain
大模型真好玩2 天前
LangGraph智能体开发设计模式(四)——LangGraph多智能体设计模式:网络架构
人工智能·langchain·agent