LangChain【6】之输出解析器:结构化LLM响应的关键工具

news2025/6/10 13:58:15

文章目录

  • 一 LangChain输出解析器概述
    • 1.1 什么是输出解析器?
    • 1.2 主要功能与工作原理
    • 1.3 常用解析器类型
  • 二 主要输出解析器类型
    • 2.1 Pydantic/Json输出解析器
    • 2.2 结构化输出解析器
    • 2.3 列表解析器
    • 2.4 日期解析器
    • 2.5 Json输出解析器
    • 2.6 xml输出解析器
  • 三 高级使用技巧
    • 3.1 自定义解析逻辑
    • 3.2 重试与错误处理
    • 3.3 多模式解析
  • 四 实际应用示例
    • 4.1 构建问答系统
    • 4.2 性能优化建议
  • 五 总结

一 LangChain输出解析器概述

  • LangChain输出解析器是LangChain框架中的核心组件,主要用于将大型语言模型(LLM)生成的非结构化文本转换为结构化数据格式。它允许开发者定义期望的输出结构,并通过提示工程指导LLM生成符合该格式的响应。输出解析器在验证和转换模型输出时发挥着关键作用,确保数据能够无缝集成到应用程序的工作流程中。

1.1 什么是输出解析器?

输出解析器是LangChain框架中的一类组件,专门负责两大功能:

  1. 指令格式化:指导LLM如何格式化其输出
  2. 结果解析:将LLM的文本响应转换为结构化格式
    与直接使用原始API调用相比,输出解析器提供了更可靠、更可预测的结果处理方式,极大简化了后续的数据处理流程。

1.2 主要功能与工作原理

  • 输出解析器通过两个核心机制实现功能:首先通过get_format_instructions方法生成格式化指令,明确告知LLM输出应遵循的结构;然后通过parse方法将LLM的原始响应解析为目标数据结构。这种双重机制既保证了输出的规范性,又提供了灵活的数据转换能力。典型的应用场景包括将文本转换为JSON对象、列表、枚举值或特定领域对象等结构化数据。

1.3 常用解析器类型

  • LangChain提供了丰富的内置解析器,包括ListParser(列表解析器)、DatetimeParser(日期时间解析器)、EnumParser(枚举解析器)和PydanticOutputParser(JSON解析器)等。其中PydanticOutputParser特别强大,它基于Pydantic模型定义数据结构,可以处理嵌套复杂的JSON格式,并自动生成对应的格式指令。此外还有StructuredOutputParser用于处理自定义类结构,Auto-FixingParser可自动修复格式错误。

二 主要输出解析器类型

LangChain提供了多种输出解析器,适用于不同场景:

2.1 Pydantic/Json输出解析器

    • Pydantic/Json解析器允许您定义严格的输出模式,确保LLM响应符合预期的数据结构,非常适合需要强类型验证的场景。
from langchain.output_parsers import PydanticOutputParser
from pydantic import Field, BaseModel

class UserProfile(BaseModel):
    name: str = Field(description="用户全名")
    age: int = Field(description="用户年龄")
    hobbies: list[str] = Field(description="用户爱好列表")

parser = PydanticOutputParser(pydantic_object=UserProfile)
  • 完整案例:
import os
from langchain_core.output_parsers import PydanticOutputParser
# from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import Field, BaseModel

# 配置 API 易环境
os.environ["OPENAI_API_KEY"] = "hk-xxx"
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"

model=ChatOpenAI(model="gpt-4",temperature=0)

# 定义期望的数据结构
class Joke(BaseModel):
    setup:str =Field(description="设置笑话的问题")
    punchline:str =Field(description="解决笑话的答案")

# 用于提示语言模型填充数据结构的查询意图
joke_query="告诉我一个笑话"
# 设置解析器+将指令注入提示模板
# parser=JsonOutputParser(pydantic_object=Joke)
parser=PydanticOutputParser(pydantic_object=Joke)
prompt=PromptTemplate(
    template="回答用户的查询。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions":parser.get_format_instructions()}
)
print(parser.get_format_instructions())
  • 输出结果:
"""
The output should be formatted as a JSON instance that conforms to the JSON schema below.

As an example, for the schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]}
the object {"foo": ["bar", "baz"]} is a well-formatted instance of the schema. The object {"properties": {"foo": ["bar", "baz"]}} is not well-formatted.
     
Here is the output schema:
{"properties": {"setup": {"description": "设置笑话的问题", "title": "Setup", "type": "string"}, "punchline": {"description": "解决笑话的答案", "title": "Punchline", "type": "string"}}, "required": ["setup", "punchline"]}
"""
chain=prompt|model|parser
response=chain.invoke({"query":joke_query})
print(response)
"""
{'setup': '为什么计算机不能得感冒?', 'punchline': '因为它们有防火墙!'}
"""

2.2 结构化输出解析器

  • 当需要灵活定义输出结构而不想引入Pydantic依赖时,结构化输出解析器是理想选择。
from langchain.output_parsers import StructuredOutputParser, ResponseSchema

response_schemas = [
    ResponseSchema(name="answer", description="问题的答案"),
    ResponseSchema(name="source", description="答案来源")
]

parser = StructuredOutputParser.from_response_schemas(response_schemas)
  • 完整代码
import os
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# 配置 API 易环境
os.environ["OPENAI_API_KEY"] = "hk-xxx"
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"

model=ChatOpenAI(model="gpt-4",temperature=0)

response_schemas = [
    ResponseSchema(name="answer", description="问题的答案"),
    ResponseSchema(name="source", description="答案来源")
]

# 设置解析器+将指令注入提示模板
parser = StructuredOutputParser.from_response_schemas(response_schemas)

prompt=PromptTemplate(
    template="回答用户的查询。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions":parser.get_format_instructions()}
)
print(parser.get_format_instructions())
"""
The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":


{
	"answer": string  // 问题的答案
	"source": string  // 答案来源
}

"""
chain=prompt|model|parser
# 用于提示语言模型填充数据结构的查询意图
joke_query="告诉我一个笑话"
response=chain.invoke({"query":joke_query})

print(response)
"""
{'answer': '为什么数学书总是很忧伤?因为它有太多的问题!', 'source': '常见幽默笑话'}
"""

2.3 列表解析器

  • 简单高效地将逗号分隔的列表响应转换为Python列表,适用于简单的枚举场景。
from langchain.output_parsers import CommaSeparatedListOutputParser

parser = CommaSeparatedListOutputParser()

2.4 日期解析器

  • 专门处理日期时间字符串,将其转换为Python datetime对象,省去了手动解析的麻烦。
from langchain.output_parsers import DatetimeOutputParser

parser = DatetimeOutputParser()

2.5 Json输出解析器

  • JSON作为现代API和Web应用中最常用的数据交换格式,LangChain提供了专门的JSON输出解析器来简化处理流程。

import os

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import Field, BaseModel

# 配置 API 易环境
os.environ["OPENAI_API_KEY"] = "hk-xxx"
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"

model=ChatOpenAI(model="gpt-4",temperature=0)

# 定义期望的数据结构
class Joke(BaseModel):
    setup:str =Field(description="设置笑话的问题")
    punchline:str =Field(description="解决笑话的答案")

# 用于提示语言模型填充数据结构的查询意图
joke_query="告诉我一个笑话"
# 设置解析器+将指令注入提示模板
parser=JsonOutputParser(pydantic_object=Joke)
prompt=PromptTemplate(
    template="回答用户的查询。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions":parser.get_format_instructions()}
)
print(parser.get_format_instructions())
"""
The output should be formatted as a JSON instance that conforms to the JSON schema below.

As an example, for the schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]}
the object {"foo": ["bar", "baz"]} is a well-formatted instance of the schema. The object {"properties": {"foo": ["bar", "baz"]}} is not well-formatted.

Here is the output schema:

{"properties": {"setup": {"description": "设置笑话的问题", "title": "Setup", "type": "string"}, "punchline": {"description": "解决笑话的答案", "title": "Punchline", "type": "string"}}, "required": ["setup", "punchline"]}

"""
chain=prompt|model|parser
response=chain.invoke({"query":joke_query})
for s in chain.stream({"query":joke_query}):
    print(s)

"""
{}
{'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': '因为它们有很多字节(bytes'}
{'setup': '为什么电脑很好吃?', 'punchline': '因为它们有很多字节(bytes)'}
{'setup': '为什么电脑很好吃?', 'punchline': '因为它们有很多字节(bytes)!'}
"""

2.6 xml输出解析器

  • LangChain的XML输出解析器为这些场景提供了专业支持。

import os

from langchain_core.output_parsers import  XMLOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# 配置 API 易环境
os.environ["OPENAI_API_KEY"] = "hk-xxx"
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"

model=ChatOpenAI(model="gpt-4",temperature=0)

# 用于提示语言模型填充数据结构的查询意图
actor_query="生成周星驰的简化电影作品列表,按照最新的时间降序"

# 设置解析器+将指令注入提示模板
parser=XMLOutputParser(tags=["movies","actor","film","name","genre"])
prompt=PromptTemplate(
    template="回答用户的查询。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions":parser.get_format_instructions()}
)
print(parser.get_format_instructions())
  • 执行输出:
"""
The output should be formatted as a XML file.
1. Output should conform to the tags below.
2. If tags are not given, make them on your own.
3. Remember to always open and close all the tags.

As an example, for the tags ["foo", "bar", "baz"]:
1. String "<foo>
   <bar>
      <baz></baz>
   </bar>
</foo>" is a well-formatted instance of the schema.
2. String "<foo>
   <bar>
   </foo>" is a badly-formatted instance.
3. String "<foo>
   <tag>
   </tag>
</foo>" is a badly-formatted instance.

Here are the output tags:

['movies', 'actor', 'film', 'name', 'genre']
"""
chain=prompt|model
response=chain.invoke({"query":actor_query})
xml_output=parser.parse(response.content)
print(response.content)
"""
```xml
<movies>
   <actor>
      <name>周星驰</name>
      <film>
         <name>美人鱼</name>
         <genre>喜剧</genre>
         <year>2016</year>
      </film>
      <film>
         <name>西游降魔篇</name>
         <genre>喜剧</genre>
         <year>2013</year>
      </film>
      <film>
         <name>长江七号</name>
         <genre>科幻</genre>
         <year>2008</year>
      </film>
      <film>
         <name>功夫</name>
         <genre>动作</genre>
         <year>2004</year>
      </film>
      <film>
         <name>少林足球</name>
         <genre>喜剧</genre>
         <year>2001</year>
      </film>
   </actor>
</movies>

这是一个简化的电影作品列表,列出了周星驰的一些电影,包括电影名称、类型和年份。这个列表是按照最新的时间降序排列的。
"""

三 高级使用技巧

3.1 自定义解析逻辑

  • 通过继承BaseOutputParser,可以创建完全自定义的解析逻辑,处理特殊响应格式。
from langchain.output_parsers import BaseOutputParser

class BooleanParser(BaseOutputParser[bool]):
    def parse(self, text: str) -> bool:
        cleaned = text.strip().lower()
        if cleaned in ("yes", "true", "1"):
            return True
        elif cleaned in ("no", "false", "0"):
            return False
        raise ValueError(f"无法解析为布尔值: {text}")

    @property
    def _type(self) -> str:
        return "boolean_parser"

3.2 重试与错误处理

  • 当初始解析失败时,重试解析器会自动尝试修正错误,显著提高系统鲁棒性。
from langchain.output_parsers import RetryWithErrorOutputParser

retry_parser = RetryWithErrorOutputParser.from_llm(
    parser=parser,
    llm=chat_llm
)

3.3 多模式解析

  • 输出修正解析器可以检测并尝试自动修复格式错误的响应,特别适合生产环境中提高可靠性。
from langchain.output_parsers import OutputFixingParser

fixing_parser = OutputFixingParser.from_llm(parser=parser, llm=chat_llm)

四 实际应用示例

4.1 构建问答系统

import os

from langchain_core.output_parsers import JsonOutputParser
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field

# 配置 API 环境
os.environ["OPENAI_API_KEY"] = "hk-xxx"
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"


template = """根据上下文回答问题,并按照要求格式化输出。
上下文: {context}
问题: {question}
{format_instructions}"""

prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI(model="gpt-4")

# 定义输出数据结构
class Answer(BaseModel):
    answer: str = Field(description="根据上下文回答问题")
    confidence: float = Field(description="回答的置信度")

# 创建解析器
parser = JsonOutputParser(pydantic_model=Answer)

chain = prompt | model | parser

result = chain.invoke({
    "context": "LangChain是一个LLM应用开发框架...",
    "question": "LangChain是什么?",
    "format_instructions": parser.get_format_instructions()
})

print(result)

4.2 性能优化建议

  1. 清晰的指令:在提示中明确说明输出格式要求。
  2. 渐进式解析:复杂结构可分步解析。
  3. 错误回退:实现备用解析策略。
  4. 缓存机制:对相同输入缓存解析结果。
  5. 监控指标:跟踪解析成功率,及时发现模式问题。

五 总结

  • LangChain的输出解析器组件为LLM应用开发提供了关键的结构化数据处理能力。通过合理选择和使用各种解析器,开发者可以:
    • 确保数据的一致性和可靠性
    • 减少胶水代码和手动解析工作
    • 构建更健壮的生产级应用
    • 专注于业务逻辑而非数据清洗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…

在Zenodo下载文件 用到googlecolab googledrive

方法&#xff1a;Figshare/Zenodo上的数据/文件下载不下来&#xff1f;尝试利用Google Colab &#xff1a;https://zhuanlan.zhihu.com/p/1898503078782674027 参考&#xff1a; 通过Colab&谷歌云下载Figshare数据&#xff0c;超级实用&#xff01;&#xff01;&#xff0…

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。

2024 年&#xff0c;高端封装市场规模为 80 亿美元&#xff0c;预计到 2030 年将超过 280 亿美元&#xff0c;2024-2030 年复合年增长率为 23%。 细分到各个终端市场&#xff0c;最大的高端性能封装市场是“电信和基础设施”&#xff0c;2024 年该市场创造了超过 67% 的收入。…

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭&#xff01;_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …

高抗扰度汽车光耦合器的特性

晶台光电推出的125℃光耦合器系列产品&#xff08;包括KL357NU、KL3H7U和KL817U&#xff09;&#xff0c;专为高温环境下的汽车应用设计&#xff0c;具备以下核心优势和技术特点&#xff1a; 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计&#xff0c;确保在…

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项&#xff0c;设置文件夹共享为总是启用&#xff0c;点击添加&#xff0c;可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download&#xff08;这是我共享的文件夹&#xff09;&…