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

LangChain大模型应用开发:多模态输入与自定义输出

介绍

大家好,博主又来给大家分享知识了。今天给大家分享的内容是使用LangChain进行大模型应用开发中的多模态输入与自定义输出。

LangChain中的多模态数据输入是指将多种不同形式的数据作为输入提供给基于语言模型的应用程序或系统,以丰富交互内容和提升模型处理能力,让应用能够处理和理解更广泛的信息类型,从而更好地满足用户多样化的需求。

LangChain自定义输出指的是开发者依据具体应用场景和业务需求,对基于LangChain构建的大模型应用输出结果的形式、内容、风格等进行个性化定制的能力。在一些需要数据规整呈现的场景下,我们可以让LangChain输出特定格式的结构化数据,比如JSONXML、YAML等。

好了,我们直接进入正题。

多模态数据输入

这里我们演示如何将多模态输入直接传递给模型。我们目前期望所有输入都以与OpenAI期望的格式相同的格式传递。对于支持多模态输入的其他模型提供者,我们在类中添加了逻辑以转换为预期格式。

在这个演示中,我们让大模型帮助我们描述下面这张图片。

获取Base64编码的图片信息

其中,最常支持的传入图片的方式是将其作为字节字符串传入。这种方式适用于大多数模型集成。

完整代码

# 从langchain_core.messages模块导入HumanMessage类,用于创建人类发送的消息
from langchain_core.messages import HumanMessage
# 从langchain_openai模块导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI
# 导入base64模块,用于对图片数据进行Base64编码
import base64
# 导入httpx库,用于发送HTTP请求获取图片
import httpx# 初始化一个ChatOpenAI实例,使用gpt-4o模型
model = ChatOpenAI(model="gpt-4o")# 定义图片的URL地址
image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"# 通过httpx库发送请求获取图片内容,并使用base64对其进行编码,最后解码为字符串
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")# 创建一个HumanMessage实例,包含文本请求和Base64编码的图片信息
message = HumanMessage(content=[{"type": "text", "text": "用中文描述这张图片中的天气"},{"type": "image_url","image_url": {"url": f"data:image/jpeg;base64,{image_data}"},},],
)# 调用模型处理消息并获取响应
response = model.invoke([message])# 打印模型对图片天气描述的响应内容
print(response.content)

运行结果

这张图片中的天气晴朗,碧蓝的天空中点缀着几朵薄薄的白云。太阳光线充足,明媚的阳光洒在绿色的草地和木质步道上,显得格外清新和温暖。整体感觉空气清新,风和日丽,是一个非常舒适宜人的天气。进程已结束,退出代码为 0

获取URL原始图片信息

我们可以在“image_url”类型的内容模块中直接提供图像URL。但是,前提是:我们使用的模型供应商必须支持此功能

完整代码

# 从langchain_core.messages模块导入HumanMessage类,用于创建人类发送的消息
from langchain_core.messages import HumanMessage
# 从langchain_openai模块导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI# 初始化一个ChatOpenAI实例,使用gpt-4o模型
model = ChatOpenAI(model="gpt-4o")# 定义图片的URL地址
image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"# 通过httpx库发送请求获取图片内容,并使用base64对其进行编码,最后解码为字符串
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")# 创建一个HumanMessage实例,包含文本请求和原始图片URL信息
message = HumanMessage(content=[{"type": "text", "text": "用中文描述这张图片中的天气"},{"type": "image_url", "image_url": {"url": image_url}},],
)# 调用模型处理消息并获取响应
response = model.invoke([message])# 打印模型对图片天气描述的响应内容
print(response.content)

运行结果

这张图片中的天气非常晴朗。天空中有一些轻薄的白云,主要以蓝色为主,显得天特别的高远。阳光明媚,照在绿色的草地上,使整个景象显得非常明亮和清新。整体感觉温暖且令人愉悦,适合外出活动。进程已结束,退出代码为 0

对比多张图片信息

我们还可以传入多张图片并可以让大模型帮我们进行对比。

完整代码

# 从langchain_core.messages模块导入HumanMessage类,用于创建人类发送的消息
from langchain_core.messages import HumanMessage
# 从langchain_openai模块导入ChatOpenAI类,用于调用 OpenAI 的聊天模型
from langchain_openai import ChatOpenAI# 初始化一个ChatOpenAI实例,使用gpt-4o模型
model = ChatOpenAI(model="gpt-4o")# 定义图片的URL地址
image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"# 创建一个HumanMessage实例,询问两张相同图片是否一样,并附带两张图片的URL
message = HumanMessage(content=[{"type": "text", "text": "这两张图片是一样的吗?"},{"type": "image_url", "image_url": {"url": image_url}},{"type": "image_url", "image_url": {"url": image_url}},],
)# 调用模型处理消息并获取响应
response = model.invoke([message])# 打印模型对两张图片是否相同的响应内容
print(response.content)

运行结果

是的,这两张图片是一样的。它们显示了同一个风景场景,都是在一片绿色的草地上,有一条木板路延伸至远处,天空中有少许云彩。从图像内容、颜色和细节上看,它们是完全相同的。进程已结束,退出代码为 0

工具调用

一些多模态模型也支持工具调用功能。要使用此类模型调用工具,只需以通常的方式将工具绑定到它们,然后使用所需类型的内容块(例如,包含图像数据)调用模型。

我们自定义一个名为weather_tool的工具函数,接收一个表示天气状况的参数,参数类型只能是指定的几种天气情况。然后我们利用LangChain库,结合OpenAIgpt-4o模型,实现对两张图片中天气状况的分析描述功能。

完整代码

# 导入Literal类型,用于定义一个只能取特定值的类型
from typing import Literal
# 导入HumanMessage类,用于创建人类发送的消息对象
from langchain_core.messages import HumanMessage
# 导入ChatOpenAI类,用于与OpenAI的聊天模型进行交互
from langchain_openai import ChatOpenAI
# 导入tool装饰器,用于将函数转换为工具
from langchain_core.tools import tool# 使用tool装饰器将weather_tool函数转换为一个工具
@tool
# 定义一个名为weather_tool的工具函数,接收一个表示天气状况的参数,参数类型只能是指定的几种天气情况
def weather_tool(weather: Literal["晴朗的", "多云的", "多雨的", "下雪的"]) -> None:"""Describe the weather"""  # 函数的文档字符串,用于描述函数的功能是描述天气pass  # 函数体为空,暂时不做具体操作# 初始化一个ChatOpenAI对象,使用gpt-4o模型
model = ChatOpenAI(model="gpt-4o")# 将模型与工具绑定,使得模型在运行时可以调用weather_tool工具
model_with_tools = model.bind_tools([weather_tool])# 定义第一张图片的URL
image_url_1 = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"# 定义第二张图片的URL
image_url_2 = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Morning_in_China_Snow_Town.jpg/1280px-Morning_in_China_Snow_Town.jpg"# 创建一个人类消息对象
message = HumanMessage(content=[  # 消息内容是一个列表,包含文本和图片URL信息{"type": "text", "text": "用中文描述两张图片中的天气"},  # 文本内容,指示模型要完成的任务{"type": "image_url", "image_url": {"url": image_url_1}},  # 第一张图片的URL信息{"type": "image_url", "image_url": {"url": image_url_2}},  # 第二张图片的URL信息],
)# 调用绑定了工具的模型,传入人类消息,得到模型的响应
response = model_with_tools.invoke([message])# 打印模型响应中调用工具的相关信息
print(response.tool_calls)

运行结果

[{'name': 'weather_tool', 'args': {'weather': '晴朗的'}, 'id': 'call_cgXu6gngXss6RpgcLamxqB8R', 'type': 'tool_call'}, {'name': 'weather_tool', 'args': {'weather': '下雪的'}, 'id': 'call_aU3xRKwucotSpu2FinamfnHq', 'type': 'tool_call'}]进程已结束,退出代码为 0

从上面的运行结果我们可以看到,当大模型响应完成后我们再去调用自定义工具,输出结果会按照我们自定义工具的参数格式及类型返回。

自定义格式输出

LangChain中,自定义格式输出是指按照特定需求对模型生成的结果进行格式化处理,以满足实际应用的多样化需求。这一功能非常实用,因为语言模型的输出往往是通用的文本形式,而实际使用中可能需要将其转换为特定的数据结构、字符串格式或其他应用程序易于处理的形式。

解析JSON格式输出

虽然一些模型提供商支持内置的方法返回结构化输出,但并非所有都支持。我们可以使用输出解析器来帮助用户通过提示指定任意的JSON模式,查询符合该模式的模型输出,最后将该模式解析为 JSON

请记住,大模型不是完美无缺的,存在着数据、准确性、可靠性等方面的风险和不确定性,在使用时需要谨慎,我们必须使用具有足够容量的大语言模型,具备更强的语言理解和生成能力,以及更好的逻辑和结构化输出能力。

JsonOutputParser是一个内置选项,用于提示并解析JSON输出。虽然它在功能上类似于 PydanticOutputParser,但它还支持流式返回部分JSON对象。

下面,我们将演示如何将其与Pydantic一起使用以方便地声明预期模式。

完整代码

# 从langchain_core库中导入JsonOutputParser类,用于将模型输出解析为JSON格式
from langchain_core.output_parsers import JsonOutputParser
# 从langchain_core库中导入PromptTemplate类,用于创建提示模板
from langchain_core.prompts import PromptTemplate
# 从pydantic库中导入BaseModel和Field类,用于定义数据模型和字段描述
from pydantic import BaseModel, Field
# 从langchain_openai库中导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI# 初始化ChatOpenAI模型实例,使用gpt-3.5-turbo模型,设置temperature=0不考虑随机性
chat_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# 定义一个名为Joke的类,继承自BaseModel,用于表示笑话的数据结构
class Joke(BaseModel):# 定义setup字段,类型为字符串,描述为设置笑话的问题setup: str = Field(description="设置笑话的问题")# 定义punchline字段,类型为字符串,描述为解决笑话的答案punchline: str = Field(description="解决笑话的答案")# 定义一个字符串变量,作为向语言模型请求笑话的查询语句
joke_query = "请给我讲个编程的笑话。"# 创建JsonOutputParser实例,指定pydantic对象为Joke类,用于解析符合Joke结构的JSON输出
json_output_parser = JsonOutputParser(pydantic_object=Joke)# 创建PromptTemplate实例,定义提示模板的格式
prompt = PromptTemplate(# 模板字符串,包含回答查询、格式指令和用户查询三部分template="回答用户的查询。\n{format_instructions}\n{query}\n",# 指定输入变量为 queryinput_variables=["query"],# 部分变量,将解析器的格式指令插入到模板中partial_variables={"format_instructions": json_output_parser.get_format_instructions()},
)# 使用管道操作符将提示模板、模型和解析器连接成一个处理链
chain = prompt | chat_model | json_output_parser# 调用处理链,传入查询语句,得到处理结果
result = chain.invoke({"query": joke_query})# 打印最终处理得到的结果
print(result)

运行结果

{'setup': '为什么计算机工程师喜欢使用黑色背景的代码编辑器?', 'punchline': '因为黑色背景让BUG无处藏。'}进程已结束,退出代码为 0

在上述代码PromptTemplate中的partial_variables属性,我们添加format_instructions变量,然后通过get_format_instructions()方法赋值,这个方法会生成一段指导语言模型按照特定JSON格式输出的指令文本。

我们也可以将format_instructions设置为自定义的值。

自定义提示格式代码演示

custom_instructions = '请用中文来回答。输出应格式化为符合以下JSON模式的JSON实例。例如,对于模式{"properties": {"foo": {"title": "Foo", "description": "字符串列表", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]},对象 {"foo": ["bar", "baz"]}是该模式的格式良好实例。对象{"properties": {"foo": ["bar", "baz"]}}不是格式良好的。'prompt = PromptTemplate(# 模板字符串,包含回答查询、格式指令和用户查询三部分template="回答用户的查询。\n{format_instructions}\n{query}\n",# 指定输入变量为 queryinput_variables=["query"],# 部分变量,将解析器的格式指令插入到模板中partial_variables={"format_instructions": custom_instructions},
)

请大家自行去测试并查看与之前有什么不同😊。

流式处理

如上所述,JsonOutputParserPydanticOutputParser之间的一个关键区别是JsonOutputParser输出解析器支持流式处理部分块。我们演示一下:

流出输出完整代码

# 从langchain_core库中导入JsonOutputParser类,用于将模型输出解析为JSON格式
from langchain_core.output_parsers import JsonOutputParser
# 从 langchain_core库中导入PromptTemplate类,用于创建提示模板
from langchain_core.prompts import PromptTemplate
# 从 pydantic库中导入BaseModel和Field类,用于定义数据模型和字段描述
from pydantic import BaseModel, Field
# 从 langchain_openai库中导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI# 初始化ChatOpenAI模型实例,使用gpt-3.5-turbo模型,设置temperature=0不考虑随机性
chat_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# 定义一个名为Joke的类,继承自BaseModel,用于表示笑话的数据结构
class Joke(BaseModel):# 定义setup字段,类型为字符串,描述为设置笑话的问题setup: str = Field(description="设置笑话的问题")# 定义punchline字段,类型为字符串,描述为解决笑话的答案punchline: str = Field(description="解决笑话的答案")# 定义一个字符串变量,作为向语言模型请求笑话的查询语句
joke_query = "请给我讲个编程的笑话。"# 创建JsonOutputParser实例,指定pydantic对象为Joke类,用于解析符合 Joke 结构的 JSON 输出
json_output_parser = JsonOutputParser(pydantic_object=Joke)# 创建 PromptTemplate 实例,定义提示模板的格式
prompt = PromptTemplate(# 模板字符串,包含回答查询、格式指令和用户查询三部分template="回答用户的查询。\n{format_instructions}\n{query}\n",# 指定输入变量为 queryinput_variables=["query"],# 部分变量,将解析器的格式指令插入到模板中partial_variables={"format_instructions": json_output_parser.get_format_instructions()},
)# 使用管道操作符将提示模板、模型和解析器连接成一个处理链
chain = prompt | chat_model | json_output_parser# 每次从生成器中获取的元素chain_stream是语言模型逐步生成的部分结果
for chain_stream in chain.stream({"query": joke_query}):# 打印每次从生成器中获取的部分结果,方便查看模型逐步生成输出的过程print(chain_stream)

流式输出运行结果

{}
{'setup': ''}
{'setup': '为'}
{'setup': '为什'}
{'setup': '为什么'}
{'setup': '为什么程序'}
{'setup': '为什么程序员'}
{'setup': '为什么程序员喜'}
{'setup': '为什么程序员喜欢'}
{'setup': '为什么程序员喜欢冷'}
{'setup': '为什么程序员喜欢冷笑'}
{'setup': '为什么程序员喜欢冷笑话'}
{'setup': '为什么程序员喜欢冷笑话?'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': ''}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只有'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只有他'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只有他们'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只有他们的'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只有他们的电'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只有他们的电脑'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只有他们的电脑听'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只有他们的电脑听得'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只有他们的电脑听得懂'}
{'setup': '为什么程序员喜欢冷笑话?', 'punchline': '因为只有他们的电脑听得懂!'}进程已结束,退出代码为 0

我们也可以在没有Pydantic的情况下使用JsonOutputParser。此时,它会提示模型返回JSON格式的内容,但不会提供基于Pydantic定义的那种精确、详细的模式信息。不过,我们仍可通过在提示中手动说明等方式,为模型提供一些关于输出模式的大致要求。

不使用Pydantic完整代码

# 从langchain_core库中导入JsonOutputParser类,用于将模型输出解析为JSON格式
from langchain_core.output_parsers import JsonOutputParser
# 从langchain_core库中导入PromptTemplate类,用于创建提示模板
from langchain_core.prompts import PromptTemplate
# 从langchain_openai库中导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI# 初始化ChatOpenAI模型实例,使用gpt-3.5-turbo模型,设置temperature=0不考虑随机性
chat_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# 定义一个字符串变量,作为向语言模型请求笑话的查询语句
joke_query = "请给我讲个编程的笑话,并用中文来回答"# 创建JsonOutputParser实例,用于解析JSON输出
json_output_parser = JsonOutputParser()# 创建 PromptTemplate 实例,定义提示模板的格式
prompt = PromptTemplate(# 模板字符串,包含回答查询、格式指令和用户查询三部分template="回答用户的查询。\n{format_instructions}\n{query}\n",# 指定输入变量为 queryinput_variables=["query"],# 部分变量,将解析器的格式指令插入到模板中partial_variables={"format_instructions": json_output_parser.get_format_instructions()},
)# 使用管道操作符将提示模板、模型和解析器连接成一个处理链
chain = prompt | chat_model | json_output_parser# 调用处理链,传入查询语句,得到处理结果
result = chain.invoke({"query": joke_query})# 打印最终处理得到的结果
print(result)

 不使用Pydantic运行结果

{'response': '为什么程序员总喜欢晒代码?因为他们觉得自己的代码是最美的!'}进程已结束,退出代码为 0

解析XML格式输出

下面我们将演示如何使用XMLOutputParser来提示模型生成XML输出,然后将该输出解析为可用的格式。

标准解析完整代码

# 从langchain_core库中导入XMLOutputParser类,用于将模型输出解析为XML格式
from langchain_core.output_parsers import XMLOutputParser
# 从langchain_core库中导入PromptTemplate类,用于创建提示模板
from langchain_core.prompts import PromptTemplate
# 从langchain_openai库中导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI# 初始化ChatOpenAI模型实例,使用gpt-4o模型,设置temperature=0不考虑随机性
chat_model = ChatOpenAI(model_name="gpt-4o", temperature=0)# 定义一个字符串变量,作为向语言模型发送需求
actor_query = "请帮我生成Jackie Chan主演的电影作品列表,按照最新的时间降序。请用中文来回答。"# 创建XMLOutputParser实例,用于解析XML输出
xml_output_parser = XMLOutputParser()# 我们将在下面的提示中添加这些指令
custom_instructions = """输出应格式化为XML文件。1. 输出应符合以下标签。2. 如果没有给出标签,请自行创建。3. 记住始终要打开和关闭所有标签。例如,对于标签 ["foo", "bar", "baz"]:1. String "<foo><bar><baz></baz></bar></foo>” 是符合模式的格式良好的实例。2. String "<foo><bar></foo>” 是格式错误的实例。3. String "<foo><tag></tag></foo>” 是格式错误的实例。
"""# 创建PromptTemplate实例,定义提示模板的格式
prompt = PromptTemplate(# 模板字符串,包含回答查询、格式指令和用户查询三部分template="回答用户的查询。\n{format_instructions}\n{query}\n",# 指定输入变量为 queryinput_variables=["query"],# 部分变量,将解析器的格式指令插入到模板中partial_variables={"format_instructions": custom_instructions},
)# 使用管道操作符将提示模板、模型和解析器连接成一个处理链
chain = prompt | chat_model# 调用处理链,传入查询语句,得到处理结果
result = chain.invoke({"query": actor_query})# 打印最终处理得到的结果
print(result.content)

标准解析运行结果

```xml
<filmography><actor><name>成龙</name><movies><movie><title>急速追杀</title><release_year>2023</release_year><description>成龙与约翰·塞纳联袂出演的一部动作喜剧电影。</description></movie><movie><title>龙马精神</title><release_year>2023</release_year><description>成龙饰演一名老马术表演演员,电影以马术为主题融合了温情与幽默。</description></movie><movie><title>机器之血</title><release_year>2017</release_year><description>成龙主演的动作科幻电影,讲述一场围绕尖端技术展开的较量。</description></movie><movie><title>英伦对决</title><release_year>2017</release_year><description>成龙饰演一位悲痛欲绝的父亲,为追查女儿遇害的真相而孤军奋战。</description></movie><movie><title>绝地逃亡</title><release_year>2016</release_year><description>成龙与约翰尼·诺克斯维尔合作的一部动作喜剧电影。</description></movie><movie><title>天将雄师</title><release_year>2015</release_year><description>讲述了汉朝时期西域的一位将军保护丝绸之路的故事。</description></movie><movie><title>十二生肖</title><release_year>2012</release_year><description>成龙主演并执导的冒险动作电影,围绕失落的中国国家文物而展开。</description></movie><movie><title>功夫梦</title><release_year>2010</release_year><description>成龙与贾登·史密斯合作的翻拍版本电影,传递了传统武术精神。</description></movie></movies></actor>
</filmography>
```进程已结束,退出代码为 0

我们还可以添加一些标签以根据我们的需求定制输出。我们可以在提示的其他部分中尝试添加自己的格式提示,以增强或替换默认指令。

按标签解析完整代码

# 从langchain_core库中导入XMLOutputParser类,用于将模型输出解析为XML格式
from langchain_core.output_parsers import XMLOutputParser
# 从langchain_core库中导入PromptTemplate类,用于创建提示模板
from langchain_core.prompts import PromptTemplate
# 从langchain_openai库中导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI# 初始化ChatOpenAI模型实例,使用gpt-4o模型,设置temperature=0不考虑随机性
chat_model = ChatOpenAI(model_name="gpt-4o", temperature=0)# 定义一个字符串变量,作为向语言模型发送需求
actor_query = "请帮我生成Jackie Chan主演的电影作品列表,按照最新的时间降序。请用中文来回答。"# 创建XMLOutputParser实例,用于解析XML输出
xml_output_parser = XMLOutputParser()# 我们将在下面的提示中添加这些指令
custom_instructions = """输出应格式化为XML文件。1. 输出应符合以下标签。2. 如果没有给出标签,请自行创建。3. 记住始终要打开和关闭所有标签。例如,对于标签 ["foo", "bar", "baz"]:1. String "<foo><bar><baz></baz></bar></foo>” 是符合模式的格式良好的实例。2. String "<foo><bar></foo>” 是格式错误的实例。3. String "<foo><tag></tag></foo>” 是格式错误的实例。以下是输出标签:'''['movies', 'actor', 'film', 'name', 'genre']
"""# 创建PromptTemplate实例,定义提示模板的格式
prompt = PromptTemplate(# 模板字符串,包含回答查询、格式指令和用户查询三部分template="回答用户的查询。\n{format_instructions}\n{query}\n",# 指定输入变量为 queryinput_variables=["query"],# 部分变量,将解析器的格式指令插入到模板中partial_variables={"format_instructions": custom_instructions},
)# 使用管道操作符将提示模板、模型和解析器连接成一个处理链
chain = prompt | chat_model# 调用处理链,传入查询语句,得到处理结果
result = chain.invoke({"query": actor_query})# 打印最终处理得到的结果
print(result.content)

按标签解析运行结果

```xml
<movies><actor><name>成龙</name></actor><film><name>急先锋</name><genre>动作</genre><year>2020</year></film><film><name>龙牌之谜</name><genre>奇幻, 冒险</genre><year>2019</year></film><film><name>机器之血</name><genre>动作, 科幻</genre><year>2018</year></film><film><name>功夫瑜伽</name><genre>动作, 冒险, 喜剧</genre><year>2017</year></film><film><name>铁道飞虎</name><genre>动作, 冒险, 喜剧</genre><year>2016</year></film><film><name>绝地逃亡</name><genre>动作, 喜剧</genre><year>2016</year></film><film><name>天将雄师</name><genre>动作, 历史, 战争</genre><year>2015</year></film><film><name>警察故事2013</name><genre>动作, 犯罪, 剧情</genre><year>2013</year></film><film><name>十二生肖</name><genre>动作, 冒险, 喜剧</genre><year>2012</year></film>
</movies>
```进程已结束,退出代码为 0

同样的,该解析器支持流式处理部分块。 

流式输出完整代码

# 从langchain_core库中导入XMLOutputParser类,用于将模型输出解析为XML格式
from langchain_core.output_parsers import XMLOutputParser
# 从langchain_core库中导入PromptTemplate类,用于创建提示模板
from langchain_core.prompts import PromptTemplate
# 从langchain_openai库中导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI# 初始化ChatOpenAI模型实例,使用gpt-4o模型,设置temperature=0不考虑随机性
chat_model = ChatOpenAI(model_name="gpt-4o", temperature=0)# 定义一个字符串变量,作为向语言模型发送需求
actor_query = "请帮我生成Jackie Chan主演的电影作品列表,按照最新的时间降序。请用中文来回答。"# 创建XMLOutputParser实例,并按标签解析XML输出
xml_output_parser = XMLOutputParser(tags=['movies', 'actor', 'film', 'name', 'genre'])# 创建PromptTemplate实例,定义提示模板的格式
prompt = PromptTemplate(# 模板字符串,包含回答查询、格式指令和用户查询三部分template="回答用户的查询。\n{format_instructions}\n{query}\n",# 指定输入变量为 queryinput_variables=["query"],# 部分变量,将解析器的格式指令插入到模板中partial_variables={"format_instructions": xml_output_parser.get_format_instructions()},
)# 使用管道操作符将提示模板、模型和解析器连接成一个处理链
chain = prompt | chat_model# 每次从生成器中获取的元素chain_stream是语言模型逐步生成的部分结果
for chain_stream in chain.stream({"query": actor_query}):# 打印每次从生成器中获取的部分结果,方便查看模型逐步生成输出的过程print(chain_stream)

流式输出运行结果

content='' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='```' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='xml' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='<' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='movies' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='   ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='actor' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='成' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='龙' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='film' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='           ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='急' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='先锋' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='           ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='genre' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='动作' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=',' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' 冒' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='险' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='genre' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' </' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='film' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='film' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='           ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='龙' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='牌' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='之' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='谜' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='           ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='genre' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='奇' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='幻' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=',' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' 历' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='史' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='genre' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' </' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='film' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='film' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='           ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='机器' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='之' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='血' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='           ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='genre' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='科' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='幻' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=',' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' 动' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='作' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='genre' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' </' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='film' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='film' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='           ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='功' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='夫' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='瑜' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='伽' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='           ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='genre' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='动作' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=',' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' 喜' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='剧' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='genre' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' </' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='film' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='film' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='           ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='铁' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='道' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='飞' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='虎' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='name' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='           ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' <' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='genre' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='喜' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='剧' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=',' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' 动' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='作' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='genre' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='       ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' </' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='film' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='   ' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content=' </' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='actor' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='</' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='movies' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='>\n' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='```' additional_kwargs={} response_metadata={} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'
content='' additional_kwargs={} response_metadata={'finish_reason': 'stop', 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_b705f0c291'} id='run-d0a803c9-f3bd-4af8-92d3-030addf44842'进程已结束,退出代码为 0

解析YAML格式输出

来自不同提供商的大型语言模型(LLMs)通常根据它们训练的具体数据具有不同的优势。这也意味着有些模型在生成JSON以外的格式输出方面可能更 “优秀” 和可靠。

这个输出解析器允许用户指定任意模式,并查询符合该模式的LLMs输出,使用YAML格式化他们的响应。

我们使用PydanticYamlOutputParser来声明我们的数据模型,并为模型提供更多关于应生成何种类型YAML的上下文信息。

标准解析完整代码

# 从langchain导入YamlOutputParser类,用于将输出解析为YAML格式
from langchain.output_parsers import YamlOutputParser
# 从langchain_core导入PromptTemplate类,用于创建提示模板
from langchain_core.prompts import PromptTemplate
# 从pydantic库中导入BaseModel和Field类,用于定义数据模型和字段描述
from pydantic import BaseModel, Field
# 从langchain_openai导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI# 定义一个名为Joke的数据模型类,继承自BaseModel
class Joke(BaseModel):# 定义setup属性,为字符串类型,用于存储笑话的问题,并添加描述信息setup: str = Field(description="设置笑话的问题")# 定义punchline属性,为字符串类型,用于存储笑话的答案,并添加描述信息punchline: str = Field(description="解答笑话的答案")# 初始化ChatOpenAI模型。
chat_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# 创建一个查询,旨在提示语言模型填充数据结构。
joke_query = "请给我将一个关于编程的笑话。用中文来回答。"# 初始化YamlOutputParser解析器,指定要解析成的Pydantic对象为Joke类
yaml_output_parser = YamlOutputParser(pydantic_object=Joke)# 创建一个提示模板,包含回答查询的要求、格式指令和具体查询内容
prompt = PromptTemplate(# 模板内容,包含回答要求、格式指令和查询变量template="回答用户的查询。\n{format_instructions}\n{query}\n",# 定义模板中的输入变量为 queryinput_variables=["query"],# 部分变量,将解析器的格式指令注入到模板中partial_variables={"format_instructions": yaml_output_parser.get_format_instructions()},
)# 创建一个链式处理流程,先通过提示模板处理输入,再传入模型进行处理
chain = prompt | chat_model# 打印解析器的格式指令,方便查看
print(yaml_output_parser.get_format_instructions())# 调用链式处理流程,传入查询内容,获取模型的响应
response = chain.invoke({"query": joke_query})# 打印模型响应的内容
print(response.content)

标准解析运行结果

The output should be formatted as a YAML instance that conforms to the given JSON schema below.# Examples
## Schema
```
{"title": "Players", "description": "A list of players", "type": "array", "items": {"$ref": "#/definitions/Player"}, "definitions": {"Player": {"title": "Player", "type": "object", "properties": {"name": {"title": "Name", "description": "Player name", "type": "string"}, "avg": {"title": "Avg", "description": "Batting average", "type": "number"}}, "required": ["name", "avg"]}}}
```
## Well formatted instance
```
- name: John Doeavg: 0.3
- name: Jane Maxfieldavg: 1.4
```## Schema
```
{"properties": {"habit": { "description": "A common daily habit", "type": "string" }, "sustainable_alternative": { "description": "An environmentally friendly alternative to the habit", "type": "string"}}, "required": ["habit", "sustainable_alternative"]}
```
## Well formatted instance
```
habit: Using disposable water bottles for daily hydration.
sustainable_alternative: Switch to a reusable water bottle to reduce plastic waste and decrease your environmental footprint.
``` Please follow the standard YAML formatting conventions with an indent of 2 spaces and make sure that the data types adhere strictly to the following JSON schema: 
```
{"properties": {"setup": {"description": "\u8bbe\u7f6e\u7b11\u8bdd\u7684\u95ee\u9898", "title": "Setup", "type": "string"}, "punchline": {"description": "\u89e3\u7b54\u7b11\u8bdd\u7684\u7b54\u6848", "title": "Punchline", "type": "string"}}, "required": ["setup", "punchline"]}
```Make sure to always enclose the YAML output in triple backticks (```). Please do not add anything other than valid YAML output!
```
setup: 为什么程序员总是悲伤?
punchline: 因为他们总是在处理 BUG。
```
setup='为什么程序员总是悲伤?' punchline='因为他们总是在处理 BUG。'进程已结束,退出代码为 0

同样的,该解析器支持流式处理部分块。

流式输出完整代码

# 从langchain导入YamlOutputParser类,用于将输出解析为YAML格式
from langchain.output_parsers import YamlOutputParser
# 从langchain_core导入PromptTemplate类,用于创建提示模板
from langchain_core.prompts import PromptTemplate
# 从pydantic库中导入BaseModel和Field类,用于定义数据模型和字段描述
from pydantic import BaseModel, Field
# 从langchain_openai导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI# 定义一个名为Joke的数据模型类,继承自BaseModel
class Joke(BaseModel):# 定义setup属性,为字符串类型,用于存储笑话的问题,并添加描述信息setup: str = Field(description="设置笑话的问题")# 定义punchline属性,为字符串类型,用于存储笑话的答案,并添加描述信息punchline: str = Field(description="解答笑话的答案")# 初始化ChatOpenAI模型。
chat_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# 创建一个查询,旨在提示语言模型填充数据结构。
joke_query = "请给我将一个关于编程的笑话。用中文来回答。"# 初始化YamlOutputParser解析器,指定要解析成的Pydantic对象为Joke类
yaml_output_parser = YamlOutputParser(pydantic_object=Joke)# 创建一个提示模板,包含回答查询的要求、格式指令和具体查询内容
prompt = PromptTemplate(# 模板内容,包含回答要求、格式指令和查询变量template="回答用户的查询。\n{format_instructions}\n{query}\n",# 定义模板中的输入变量为 queryinput_variables=["query"],# 部分变量,将解析器的格式指令注入到模板中partial_variables={"format_instructions": yaml_output_parser.get_format_instructions()},
)# 创建一个链式处理流程,先通过提示模板处理输入,再传入模型进行处理
chain = prompt | chat_model# 每次从生成器中获取的元素chain_stream是语言模型逐步生成的部分结果
for chain_stream in chain.stream({"query": joke_query}):# 打印每次从生成器中获取的部分结果,方便查看模型逐步生成输出的过程print(chain_stream)

流式输出运行结果

content='' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='``' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='`\n' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='setup' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content=':' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content=' ' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='为' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='什' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='么' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='程序' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='员' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='总' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='是' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='选择' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='快' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='餐' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='作' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='为' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='午' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='餐' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='?\n' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='p' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='unch' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='line' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content=':' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content=' 因' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='为' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='他' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='们' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='喜' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='欢' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='用' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='字' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='节' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='填' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='饱' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='自' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='己' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='!' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='\n' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='```' additional_kwargs={} response_metadata={} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'
content='' additional_kwargs={} response_metadata={'finish_reason': 'stop', 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_0165350fbb'} id='run-743ce710-3522-416e-acec-c98ffd30c7c5'进程已结束,退出代码为 0

结束

好了,以上就是本次分享的全部内容了。希望大家能掌握与理解今天分享的内容。今天分享的内容代码部分比较多,请大家多在自己的电脑上多去测试与调试,我相信大家肯定会有所收获的!

LangChain作为一个强大的语言模型驱动的应用程序的开源框架,在数据输入和输出方面具备独特优势。

首先,它将文本、图像、音频等多种不同形式的数据,作为输入提供给基于语言模型的应用程序或系统。这种方式极大地丰富了交互内容,提升了模型处理能力,使应用能够处理和理解更广泛的信息类型,从而更好地满足用户多样化的需求。比如在智能客服场景中,用户既可以输入文字咨询,也能发送图片、语音等,模型可综合这些信息做出更准确全面的回复。

并且,开发者能依据具体应用场景和业务需求,对基于LangChain构建的大模型应用输出结果进行个性化定制。涵盖输出结果的形式、内容、风格等多个方面。在需要数据规整呈现的场景下,可让LangChain输出特定格式的结构化数据,如JSONXMLYAML等。比如在数据分析场景中,要求模型以JSON格式输出分析结果,便于后续的数据处理和系统集成;在报告生成场景中,可定制输出风格,使其更符合正式报告的要求。

那么本次分享就到这了。最后,博主还是那句话:请大家多去大胆的尝试和使用,成功总是在不断的失败中试验出来的,敢于尝试就已经成功了一半。如果大家对博主分享的内容感兴趣或有帮助,请点赞和关注。大家的点赞和关注是博主持续分享的动力🤭,博主也希望让更多的人学习到新的知识。

相关文章:

LangChain大模型应用开发:多模态输入与自定义输出

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天给大家分享的内容是使用LangChain进行大模型应用开发中的多模态输入与自定义输出。 LangChain中的多模态数据输入是指将多种不同形式的数据作为输入提供给基于语言模型的应用程序或系统&#xff0c;以丰富交互内容和提…...

HarmonyOS 开发套件 介绍 ——上篇

HarmonyOS 开发套件 介绍 ——上篇 在当今科技飞速发展的时代&#xff0c;操作系统作为智能设备的核心&#xff0c;其重要性不言而喻。而HarmonyOS&#xff0c;作为华为推出的全新操作系统&#xff0c;正以其独特的魅力和强大的功能&#xff0c;吸引着越来越多的开发者和用户的…...

【Unity Shader编程】之图元装配与光栅化

执行方式&#xff1a;自动完成 图元装配自动化流程 顶点坐标存入装配区 → 按绘制模式连接顶点 → 生成完整几何图元 示例&#xff1a;gl.drawArrays(gl.TRIANGLES, 0, 3)自动生成三角形 会自动自动裁剪超出屏幕范围&#xff08;NDC空间外&#xff09;的三角形&#xff0c;仅保…...

小游戏-记忆卡牌

1、游戏开始4张卡牌&#xff0c;每次过关后新增两张&#xff0c;总共64张卡&#xff0c;可以修改数组EMOJIS&#xff0c;添加表情&#xff0c;增加卡牌数量 2、新建txt文件&#xff0c;将代码粘贴进去&#xff0c;保存后&#xff0c;将txt修改后缀名为html的格式 <!DOCTYPE…...

数据结构——二叉树经典习题讲解

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习java数据结构的二叉树 递归很重要的一些注意事项&#xff1a; 1&#xff1a;递归你能不能掌握在于&#xff1…...

centos 9 时间同步服务

在 CentOS 9 中&#xff0c;默认的时间同步服务是 chrony&#xff0c;而不是传统的 ntpd。 因此&#xff0c;建议使用 chrony 来配置和管理时间同步。 以下是使用 chrony 配置 NTP 服务的步骤&#xff1a; 1. 安装 chrony 首先&#xff0c;确保系统已安装 chrony。 在 CentOS…...

视觉应用工程师(面试)

视觉应用工程师&#xff08;面试&#xff09; 1.自我介绍、会的技能、项目 2.相机和机械手调试过程 检查硬件&#xff0c;看软件驱动是否链接&#xff0c;调节相机和镜头保证能够识别这个物料&#xff0c;看接口和通讯是否正常&#xff0c;如&#xff1a;波特率&#xff0c;数…...

macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能

macos sequoia默认ctrlenter会打开鼠标右键菜单&#xff0c;使得很多软件有冲突。关闭方法&#xff1a; end...

【后端基础】布隆过滤器原理

文章目录 一、Bloom Filter&#xff08;布隆过滤器&#xff09;概述1. Bloom Filter 的特点2. Bloom Filter 的工作原理 二、示例1. 添加与查询2. 假阳性 三、Bloom Filter 的操作1、假阳性概率2、空间效率3、哈希函数的选择 四、应用 Bloom Filter 是一种非常高效的概率型数据…...

cs*n 网页内容转为html 加入 onenote

csdn上有好用的内容&#xff0c;我们怎么将它们加到 onenote 里吃灰呢。 一、创建 新html create_html.py import sysdef create_html_file(filename):# 检查是否提供了文件名if not filename:print("请提供HTML文件名")return# 创建HTML内容html_content f"…...

输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路

详细前端代码写于上一篇&#xff1a;输入搜索、分组展示选项、下拉选取&#xff0c;el-select 实现&#xff1a;即输入关键字检索&#xff0c;返回分组选项&#xff0c;选取跳转到相应内容页 —— VUE项目-全局模糊检索 【效果图】&#xff1a;分组展示选项 【去界面操作体验】…...

蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)

Day 3&#xff1a;岛屿数量、二叉树路径和&#xff08;区分DFS与回溯&#xff09; &#x1f4d6; 一、深度优先搜索&#xff08;DFS&#xff09;简介 深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09;是一种用于遍历或搜索树或图的算法。它会沿着树的分…...

【论文阅读】SAM-CP:将SAM与组合提示结合起来的多功能分割

导言 近年来&#xff0c;视觉基础模型的快速发展推动了多模态理解的进步&#xff0c;尤其是在图像分割任务中。例如&#xff0c;Segment Anything模型&#xff08;SAM&#xff09;在图像Mask分割上表现出色&#xff0c;但在语义及实例分割方面仍存在局限。本文提出的SAM-CP&am…...

JUC并发—9.并发安全集合四

大纲 1.并发安全的数组列表CopyOnWriteArrayList 2.并发安全的链表队列ConcurrentLinkedQueue 3.并发编程中的阻塞队列概述 4.JUC的各种阻塞队列介绍 5.LinkedBlockingQueue的具体实现原理 6.基于两个队列实现的集群同步机制 4.JUC的各种阻塞队列介绍 (1)基于数组的阻塞…...

爱普生 SG-8101CE 可编程晶振在笔记本电脑的应用

在笔记本电脑的精密架构中&#xff0c;每一个微小的元件都如同精密仪器中的齿轮&#xff0c;虽小却对整体性能起着关键作用。如今的笔记本电脑早已不再局限于简单的办公用途&#xff0c;其功能愈发丰富多样。从日常轻松的文字处理、网页浏览&#xff0c;到专业领域中对图形处理…...

k8s网络插件详解(flannel)

1、介绍 Flannel 是一个轻量级、易于配置的网络插件&#xff0c;旨在简化 Kubernetes 集群中 Pod 网络的管理。Flannel 的核心功能是提供一个虚拟的网络&#xff0c;允许每个 Pod 获取一个独立的 IP 地址&#xff0c;并实现不同节点间的 Pod 之间的通信 2、网络模式 vxlan&am…...

基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,医生,科室信息,就诊信息,医院概况,挂号信息,诊断信息,取消挂号 开题报告内容 基于FlaskVue框架的医院预约挂号系统开题报告 一、研究背景与意义 随着医疗技术的不断进步和人们健康意识的日益增强&#xff0c;医院就诊量逐年增加。传统的现场…...

JUC并发—8.并发安全集合一

大纲 1.JDK 1.7的HashMap的死循环与数据丢失 2.ConcurrentHashMap的并发安全 3.ConcurrentHashMap的设计介绍 4.ConcurrentHashMap的put操作流程 5.ConcurrentHashMap的Node数组初始化 6.ConcurrentHashMap对Hash冲突的处理 7.ConcurrentHashMap的并发扩容机制 8.Concu…...

Linux 内核网络设备驱动编程:私有协议支持

一、struct net_device的通用性与私有协议的使用 struct net_device是Linux内核中用于描述网络设备的核心数据结构,它不仅限于TCP/IP协议,还可以用于支持各种类型的网络协议,包括私有协议。其原因如下: 协议无关性:struct net_device的设计是通用的,它本身并不依赖于任何…...

机器学习的数学基础(三)——概率与信息论

目录 1. 随机变量2. 概率分布2.1 离散型变量和概率质量函数2.2 连续型变量和概率密度函数 3. 边缘概率4. 条件概率5. 条件概率的链式法则6. 独立性和条件独立性7. 期望、方差和协方差7.1 期望7.2 方差7.3 协方差 8. 常用概率分布8.1 均匀分布 U ( a , b ) U(a, b) U(a,b)8.2 Be…...

使用Docker Desktop部署GitLab

1. 环境准备 确保Windows 10/11系统支持虚拟化技术&#xff08;需在BIOS中开启Intel VT-x/AMD-V&#xff09;内存建议≥8GB&#xff0c;存储空间≥100GB 2. 安装Docker Desktop 访问Docker官网下载安装包安装时勾选"Use WSL 2 instead of Hyper-V"&#xff08;推荐…...

推理模型时代:大语言模型如何从对话走向深度思考?

一、对话模型和推理模型的区别概述 对话模型是专门用于问答交互的语言模型,符合人类的聊天方式,返回的内容可能仅仅只是一个简短的答案,一般模型名称后面会带有「chat」字样。 推理模型是比较新的产物,没有明确的定义,一般是指输出过程中带有<think>和</think&…...

GESP2024年3月认证C++七级( 第三部分编程题(1)交流问题)

参考程序&#xff1a; #include <iostream> #include <vector> #include <unordered_map> using namespace std;// 深度优先搜索&#xff0c;给每个节点染色&#xff0c;交替染色以模拟两校同学的划分 void dfs(vector<vector<int>>& graph…...

DeepSeek:AI商业化的新引擎与未来蓝图

摘要 在人工智能迅猛发展的浪潮中&#xff0c;DeepSeek以其卓越的技术实力和高超的商业化能力崭露头角。作为一款现象级AI产品&#xff0c;它不仅在算法性能上位居行业前列&#xff0c;还通过灵活的定制解决方案渗透到金融、医疗、零售等多个领域。DeepSeek以创新的商业模式和场…...

2025年度福建省职业院校技能大赛中职组“网络建设与运维”赛项规程模块三

模块三&#xff1a;服务搭建与运维 任务描述&#xff1a; 随着信息技术的快速发展&#xff0c;集团计划把部分业务由原有的 X86 服 务器上迁移到ARM 架构服务器上&#xff0c;同时根据目前的部分业务需求进行 了部分调整和优化。 一、X86 架构计算机操作系统安装与管理 1&…...

Python----数据结构(队列,顺序队列,链式队列,双端队列)

一、队列 1.1、概念 队列(Queue)&#xff1a;也是一种基本的数据结构&#xff0c;在队列中的插入和删除都遵循先进先出&#xff08;First in First out&#xff0c;FIFO&#xff09;的原则。元素可以在任何时刻从队尾插入&#xff0c;但是只有在队列最前面 的元素才能被取出或…...

【自学笔记】Spring Boot框架技术基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Spring Boot框架技术基础知识点总览一、Spring Boot简介1.1 什么是Spring Boot&#xff1f;1.2 Spring Boot的主要特性 二、Spring Boot快速入门2.1 搭建Spring Boo…...

神经网络剪枝技术的重大突破:sGLP-IB与sTLP-IB

神经网络剪枝技术的重大突破:sGLP-IB与sTLP-IB 在人工智能飞速发展的今天,深度学习技术已经成为推动计算机视觉、自然语言处理等领域的核心力量。然而,随着模型规模的不断膨胀,如何在有限的计算资源和存储条件下高效部署这些复杂的神经网络模型,成为了研究者们亟待解决的…...

Django-Vue 学习-VUE

主组件中有多个Vue组件 是指在Vue.js框架中&#xff0c;主组件是一个父组件&#xff0c;它包含了多个子组件&#xff08;Vue组件&#xff09;。这种组件嵌套的方式可以用于构建复杂的前端应用程序&#xff0c;通过拆分功能和视图&#xff0c;使代码更加模块化、可复用和易于维…...

【Gin】2:快速上手Gin框架(模版、cookie、session)

本文目录 一、模版渲染二、自定义模版函数三、cookie四、Session五、cookie、session区别六、会话攻击 一、模版渲染 在 Gin 框架中&#xff0c;模板主要用于动态生成 HTML 页面&#xff0c;结合 Go 语言的模板引擎功能&#xff0c;实现数据与视图的分离。 模板渲染是一种动态…...

Linux修改主机名称

hostnamectl set-hostname 主机名称 exit 退出登录重新进入即可...

亲测Windows部署Ollama+WebUI可视化

一. Ollama下载 登录Ollama官网(Ollama)点击Download进行下载 如果下载很慢可用以下地址下载&#xff1a; https://github.com/ollama/ollama/releases/download/v0.5.7/OllamaSetup.exe 在DeepSeek官网上&#xff0c;你可以直接点击【model】 到达这个界面之后&#xff0c;…...

Java四大框架深度剖析:MyBatis、Spring、SpringMVC与SpringBoot

目录 前言&#xff1a; 一、MyBatis框架 1. 概述 2. 核心特性 3. 应用场景 4. 示例代码 二、Spring框架 1. 概述 2. 核心模块 3. 应用场景 4. 示例代码 三、SpringMVC框架 1. 概述 2. 核心特性 3. 应用场景 4. 示例代码 四、SpringBoot框架 1. 概述 2. 核心…...

ubuntu部署小笔记-采坑

ubuntu部署小笔记 搭建前端控制端后端前端nginx反向代理使用ubuntu部署nextjs项目问题一 如何访问端口号配置后台运行该进程pm2 问题二 包体过大生产环境下所需文件 问题三 部署在vercel时出现的问题需要魔法访问后端api时&#xff0c;必须使用https协议电脑端访问正常&#xf…...

23. AI-大语言模型-DeepSeek简介

文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本1. 类型2. 版本3. 参数规模与模型能力 3. 特征4. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文…...

基于SpringBoot的智慧家政服务平台系统设计与实现的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

Java NIO与传统IO性能对比分析

Java NIO与传统IO性能对比分析 在Java中&#xff0c;I/O&#xff08;输入输出&#xff09;操作是开发中最常见的任务之一。传统的I/O方式基于阻塞模型&#xff0c;而Java NIO&#xff08;New I/O&#xff09;引入了非阻塞和基于通道&#xff08;Channel&#xff09;和缓冲区&a…...

基于YOLO11深度学习的果园苹果检测与计数系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

基于SpringBoot畅购行汽车购票系统

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...

基于 Spring Boot + 微信小程序的短文写作竞赛管理系统设计与实现(源码+文档)

大家好&#xff0c;今天要和大家聊的是一款基于 Spring Boot 微信小程序的“短文写作竞赛管理系统”的设计与实现。项目源码以及部署相关事宜请联系我&#xff0c;文末附上联系方式。 项目简介 基于 Spring Boot 微信小程序的“短文写作竞赛管理系统”设计与实现的主要使用…...

pytest运行用例的常见方式及参数

标题pytest运行用例方式及参数 用例结构目录 “”" 在最外层目录下执行所有的用例 参数说明&#xff1a; -s:显示用例的打印信息 -v:显示用例执行的详细信息 –alluredir:指定allure报告的路径 –clean-alluredir:清除allure报告的路径 -n:指定并发的进程数 -x:出现一条用…...

Miniconda + VSCode 的Python环境搭建

目录&#xff1a; 安装 VScode 安装 miniconda 在VScode 使用conda虚拟环境 运行Python程序 1.安装 vscode 编辑器 官网链接&#xff1a;Visual Studio Code - Code Editing. Redefined 下载得到&#xff1a;&#xff0c;双击安装。 安装成功…...

图解MySQL【日志】——Redo Log

Redo Log&#xff08;重做日志&#xff09; 为什么需要 Redo Log&#xff1f; 1. 崩溃恢复 数据库崩溃时&#xff0c;系统通过 Redo Log 来恢复尚未写入磁盘的数据。Redo Log 记录了所有已提交事务的操作&#xff0c;系统在重启后会重做这些操作&#xff0c;以保证数据不会丢…...

Trae AI驱动开发实战:30分钟从0到1实现Django REST天气服务

目录 一、Trae 安装 1、Trae 介绍 2、Trae 安装 二、项目构建 1、项目背景与技术选型 2、开发环境准备 三、需求分析 1、功能模块设计 2、数据库设计 四、功能实现 1、用户系统开发 2、天气服务实现 3、测试用例编写 五、Trae 体验总结 随着人工智能技术的迅猛发…...

【Linux网络编程】IP协议格式,解包步骤

目录 解析步骤 1.版本字段&#xff08;大小&#xff1a;4比特位&#xff09; 2.首部长度&#xff08;大小&#xff1a;4比特位&#xff09;&#xff08;单位&#xff1a;4字节&#xff09; &#x1f35c;细节解释&#xff1a; 3.服务类型&#xff08;大小&#xff1a;8比特…...

中诺CHINO-E G076大容量录音电话产品使用注意事项

•本机需插上随机配置的电源适配器才能正常工作&#xff0c;切勿插入其它的适配器&#xff0c;以免损坏话机&#xff1b; •当本机出现异常时&#xff0c;请按“Δ/上查”键3秒&#xff0c;屏幕弹出确定恢复&#xff0c;按“设置”键恢复出厂设置&#xff1b; 注&#xff1a;…...

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法&#xff08;Snow Geese Algorithm&#xff0c;SGA&#xff09;是2024年提出的一种新型元启发式算法&#xff0c;其灵感来源于雪雁的迁徙行为&#xff0c;特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…...

✨ 索引有哪些缺点以及具体有哪些索引类型

索引的定义与原理 索引是数据库中用于提高数据检索效率的数据结构。它就像是书籍的目录&#xff0c;通过目录可以快速定位到所需内容的页码&#xff0c;而在数据库中&#xff0c;索引可以帮助数据库系统快速找到符合查询条件的数据行&#xff0c;而不必对整个表进行扫描。 其…...

Promptic:Python 中的 LLM 应用开发利器

Promptic 是一个基于 Python 的轻量级库,旨在简化与大型语言模型(LLMs)的交互。它通过提供简洁的装饰器 API 和强大的功能,帮助开发者高效地构建 LLM 应用程序。Promptic 的设计理念是提供 90% 的 LLM 应用开发所需功能,同时保持代码的简洁和易用性。 1. Promptic 的核心…...

本地部署DeepSeek R1大模型

一、安装软件 1.1 安装Ollama 你可以访问Ollama的官方网站https://ollama.com/download&#xff0c;选择适合你操作系统的安装包进行下载。老周这里是Mac系统&#xff0c;所以选择下载macOS系统。 1.2 安装cherry studio 前往官网https://cherry-ai.com/download下载对应操…...