LangChain-输出解析器 (Output Parsers)
输出解析器是LangChain的重要组件,用于将语言模型的原始文本输出转换为结构化数据。本文档详细介绍了输出解析器的类型、功能和最佳实践。
概述
语言模型通常输出自然语言文本,但在应用开发中,我们经常需要将这些文本转换为结构化的数据格式,如列表、字典或对象。输出解析器实现了这一关键功能,提供了:
- 结构化数据提取:将自然语言转换为特定数据结构
- 格式一致性保证:确保输出符合预期格式
- 容错处理:处理模型输出不符合要求的情况
- 模型指导:向模型提供正确输出格式的指导
基础解析器
1. 字符串解析器 (StrOutputParser)
最简单的解析器,用于提取模型返回的原始文本:
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate# 创建简单链
model = ChatOpenAI()
prompt = ChatPromptTemplate.from_template("解释{topic}是什么?")
parser = StrOutputParser()# 组合组件
chain = prompt | model | parser# 调用链
result = chain.invoke({"topic": "量子计算"})# result 是一个字符串,包含模型对量子计算的解释
2. 列表解析器 (CommaSeparatedListOutputParser)
将逗号分隔的文本转换为Python列表:
from langchain_core.output_parsers import CommaSeparatedListOutputParser# 创建列表解析器
list_parser = CommaSeparatedListOutputParser()# 创建带格式说明的提示模板
format_instructions = list_parser.get_format_instructions()
list_prompt = ChatPromptTemplate.from_template("列出{topic}的五个最重要特点。\n{format_instructions}"
)# 组合组件
list_chain = list_prompt | model | list_parser# 调用链
topic_features = list_chain.invoke({"topic": "人工智能", "format_instructions": format_instructions
})# 结果是一个Python列表: ['特点1', '特点2', '特点3', '特点4', '特点5']
3. JSON解析器 (JsonOutputParser)
将JSON格式文本转换为Python字典或列表:
from langchain_core.output_parsers import JsonOutputParser# 创建JSON解析器
json_parser = JsonOutputParser()# 创建带格式说明的提示模板
json_format_instructions = json_parser.get_format_instructions()
json_prompt = ChatPromptTemplate.from_template("生成一个包含{person}基本信息的JSON。应包括姓名、职业、年龄和技能列表。\n{format_instructions}"
)# 组合组件
json_chain = json_prompt | model | json_parser# 调用链
person_info = json_chain.invoke({"person": "爱因斯坦","format_instructions": json_format_instructions
})# 结果是一个Python字典,包含爱因斯坦的信息
高级解析器
1. Pydantic解析器 (PydanticOutputParser)
使用Pydantic模型定义输出结构:
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field, validator
from typing import List# 定义Pydantic模型
class Movie(BaseModel):title: str = Field(description="电影标题")director: str = Field(description="导演姓名")year: int = Field(description="上映年份")genre: List[str] = Field(description="电影类型")rating: float = Field(description="评分(1-10)")@validator("rating")def rating_must_be_valid(cls, v):if v < 1 or v > 10:raise ValueError("评分必须在1到10之间")return v# 创建Pydantic解析器
pydantic_parser = PydanticOutputParser(pydantic_object=Movie)# 创建带格式说明的提示模板
format_instructions = pydantic_parser.get_format_instructions()
pydantic_prompt = ChatPromptTemplate.from_template("生成一部{genre}电影的信息。\n{format_instructions}"
)# 组合组件
pydantic_chain = pydantic_prompt | model | pydantic_parser# 调用链
movie_data = pydantic_chain.invoke({"genre": "科幻","format_instructions": format_instructions
})# 结果是一个Movie对象,包含电影信息
2. XML解析器 (XMLOutputParser)
解析XML格式的输出:
from langchain_core.output_parsers import XMLOutputParser# 创建XML解析器
xml_parser = XMLOutputParser()# 创建带格式说明的提示模板
xml_format = """<analysis><sentiment>positive or negative</sentiment><language>detected language</language><summary>brief summary</summary>
</analysis>"""xml_prompt = ChatPromptTemplate.from_template("分析以下文本的情感、语言和内容:\n{text}\n\n以下面的XML格式输出:\n{xml_format}"
)# 组合组件
xml_chain = xml_prompt | model | xml_parser# 调用链
xml_result = xml_chain.invoke({"text": "人工智能正在迅速发展,为各行各业带来革命性变化。","xml_format": xml_format
})# 结果是一个包含解析XML数据的字典
3. 自定义解析器
创建自定义输出解析器:
from langchain_core.output_parsers import BaseOutputParser
from typing import Dict, Anyclass CustomKeyValueParser(BaseOutputParser[Dict[str, Any]]):"""解析形如'key: value'的文本"""def parse(self, text: str) -> Dict[str, Any]:"""从文本中解析键值对"""result = {}lines = text.strip().split('\n')for line in lines:if ':' in line:key, value = line.split(':', 1)result[key.strip()] = value.strip()return resultdef get_format_instructions(self) -> str:"""提供格式指导给模型"""return """请以'键: 值'的格式返回信息,每行一个键值对。
例如:
名称: 爱因斯坦
职业: 物理学家
贡献: 相对论"""# 使用自定义解析器
custom_parser = CustomKeyValueParser()custom_prompt = ChatPromptTemplate.from_template("提供关于{person}的基本信息。\n{format_instructions}"
)custom_chain = custom_prompt | model | custom_parserresult = custom_chain.invoke({"person": "牛顿","format_instructions": custom_parser.get_format_instructions()
})
组合解析器
1. 多重解析 (RouterOutputParser)
根据内容选择不同的解析器:
from langchain_core.output_parsers import RouterOutputParser
from langchain_core.output_parsers.openai_tools import PydanticToolsParserclass Person(BaseModel):name: strage: intclass Company(BaseModel):name: strindustry: stremployees: int# 创建组合解析器
router_parser = PydanticToolsParser(tools=[Person,Company
])# 创建提示模板
router_prompt = ChatPromptTemplate.from_template("根据查询决定是返回人物信息还是公司信息。\n查询: {query}"
)# 组合组件
router_chain = router_prompt | model.bind_tools([Person, Company]) | router_parser# 人物查询
person_result = router_chain.invoke({"query": "告诉我关于比尔盖茨的信息"})
# 返回Person对象# 公司查询
company_result = router_chain.invoke({"query": "告诉我关于微软的信息"})
# 返回Company对象
2. 错误处理与重试 (OutputFixingParser)
处理解析错误并尝试修复:
from langchain_core.output_parsers import OutputFixingParser# 创建基础解析器(容易出错的格式)
base_parser = PydanticOutputParser(pydantic_object=Movie)# 创建带修复功能的解析器
fixing_parser = OutputFixingParser.from_llm(parser=base_parser,llm=ChatOpenAI()
)# 即使模型输出不完全符合格式要求,也能尝试修复并解析
try_chain = prompt | model | fixing_parser
构建复杂解析策略
1. 结构化提取与转换
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import PydanticOutputParser, StrOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.runnables import RunnablePassthrough, RunnableBranch
from typing import List, Optional# 定义多级数据结构
class Author(BaseModel):name: str = Field(description="作者姓名")background: Optional[str] = Field(description="作者背景", default=None)class Book(BaseModel):title: str = Field(description="书名")year: int = Field(description="出版年份")author: Author = Field(description="作者信息")genres: List[str] = Field(description="图书类型")summary: str = Field(description="内容简介")# 创建解析器和提示
book_parser = PydanticOutputParser(pydantic_object=Book)
instructions = book_parser.get_format_instructions()book_prompt = ChatPromptTemplate.from_template("提供关于{book_title}的详细信息,包括作者、出版年份、类型和简介。\n{format_instructions}"
)# 处理结果的函数
def process_book(book: Book) -> dict:# 计算出版至今年数import datetimecurrent_year = datetime.datetime.now().yearyears_since_pub = current_year - book.yearreturn {"book": book,"years_since_publication": years_since_pub,"is_classic": years_since_pub > 50}# 组合处理链
book_chain = book_prompt | model | book_parser | process_book# 调用链
result = book_chain.invoke({"book_title": "战争与和平","format_instructions": instructions
})
2. 条件解析逻辑
from langchain_core.runnables import RunnableBranch
from langchain_core.output_parsers import JsonOutputParser, XMLOutputParser# 创建多格式解析器
def is_json(text):return text.strip().startswith('{')def is_xml(text):return text.strip().startswith('<')# 创建条件分支解析器
multi_format_parser = RunnableBranch((is_json, JsonOutputParser()),(is_xml, XMLOutputParser()),StrOutputParser() # 默认解析器
)# 在链中使用
flexible_chain = prompt | model | multi_format_parser
输出格式化技巧
1. 明确的格式指令
提供详细的格式说明,帮助模型生成可解析的输出:
from langchain_core.output_parsers.json import JsonOutputParserjson_parser = JsonOutputParser()
instructions = json_parser.get_format_instructions()detailed_prompt = """生成一个包含电影信息的JSON对象。必须包含以下字段:
- title: 电影标题 (字符串)
- director: 导演姓名 (字符串)
- year: 上映年份 (整数)
- genres: 电影类型 (字符串数组)
- rating: 评分,1-10之间 (数值){format_instructions}电影: {movie}"""prompt = ChatPromptTemplate.from_template(detailed_prompt)
chain = prompt | model | json_parserresult = chain.invoke({"movie": "黑客帝国", "format_instructions": instructions})
2. 使用Enum限制选项
使用枚举类型限制可能的值:
from enum import Enum
from langchain_core.pydantic_v1 import BaseModel, Fieldclass Sentiment(str, Enum):POSITIVE = "positive"NEUTRAL = "neutral"NEGATIVE = "negative"class SentimentAnalysis(BaseModel):text: str = Field(description="分析的文本")sentiment: Sentiment = Field(description="文本情感 (positive, neutral, negative)")confidence: float = Field(description="置信度 (0.0-1.0)")class Config:use_enum_values = True# 创建解析器
sentiment_parser = PydanticOutputParser(pydantic_object=SentimentAnalysis)
3. 分步解析复杂输出
对于复杂任务,先将输出分解为简单部分:
from langchain_core.output_parsers import StrOutputParser# 第一步:生成文本分析
analysis_prompt = ChatPromptTemplate.from_template("分析以下文本: {text}")
analysis_chain = analysis_prompt | model | StrOutputParser()# 第二步:从分析中提取结构化数据
structure_prompt = ChatPromptTemplate.from_template("""基于下面的分析,提取主要观点和情感评分(1-10),以JSON格式返回:分析: {analysis}JSON格式:{{"main_points": ["观点1", "观点2", ...],"sentiment_score": 评分}}"""
)
structure_chain = structure_prompt | model | JsonOutputParser()# 组合两个步骤
full_chain = {"analysis": analysis_chain} | structure_chainresult = full_chain.invoke({"text": "这个产品质量很好,但价格有点贵。客服态度也不错,总体来说是不错的购物体验。"})
解析器验证与错误处理
1. 使用验证逻辑
Pydantic模型中添加验证器:
from langchain_core.pydantic_v1 import BaseModel, Field, validator
from typing import Listclass Product(BaseModel):name: str = Field(description="产品名称")price: float = Field(description="产品价格")features: List[str] = Field(description="产品特点列表")rating: int = Field(description="产品评分(1-5)")@validator("price")def price_must_be_positive(cls, v):if v <= 0:raise ValueError("价格必须为正数")return v@validator("rating")def rating_must_be_valid(cls, v):if v < 1 or v > 5:raise ValueError("评分必须在1到5之间")return v
2. 错误处理策略
from langchain_core.output_parsers import OutputFixingParser
from langchain_core.runnables import RunnablePassthrough# 创建基础解析器
base_parser = PydanticOutputParser(pydantic_object=Product)# 添加错误处理
robust_parser = OutputFixingParser.from_llm(parser=base_parser,llm=ChatOpenAI()
)# 实现错误捕获逻辑
def safe_parse(text):try:return robust_parser.parse(text)except Exception as e:return {"error": str(e), "raw_text": text}# 在链中使用安全解析
robust_chain = prompt | model | RunnablePassthrough.assign(parsed_output=lambda x: safe_parse(x.content)
)
与其他组件集成
1. 在智能体中使用解析器
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain.tools import tool# 定义工具函数
@tool
def search_products(query: str) -> str:"""搜索产品数据库"""# 假设实现return "找到3个产品..."# 定义输出格式
class SearchResult(BaseModel):products: List[str] = Field(description="产品列表")top_pick: Optional[str] = Field(description="最佳推荐")reason: Optional[str] = Field(description="推荐理由")search_parser = PydanticOutputParser(pydantic_object=SearchResult)# 创建智能体
tools = [search_products]
agent = create_openai_tools_agent(model, tools, """你是一位产品专家,帮助用户查找产品。最终输出必须是JSON格式,包含产品列表和推荐。{format_instructions}""".format(format_instructions=search_parser.get_format_instructions())
)
agent_executor = AgentExecutor(agent=agent, tools=tools)# 处理用户查询
response = agent_executor.invoke({"input": "查找价格低于100元的手机配件"})
structured_result = search_parser.parse(response["output"])
2. 与检索系统集成
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings# 假设已经有一个向量数据库
vector_db = Chroma(embedding_function=OpenAIEmbeddings())
retriever = vector_db.as_retriever()# 定义输出格式
class RetrievalSummary(BaseModel):question: str = Field(description="用户问题")sources: List[str] = Field(description="信息来源")answer: str = Field(description="基于来源的回答")confidence: float = Field(description="置信度 (0.0-1.0)")# 创建解析器
rag_parser = PydanticOutputParser(pydantic_object=RetrievalSummary)# 格式化检索文档
def format_docs(docs):return "\n\n".join([f"来源 {i+1}: {doc.page_content}" for i, doc in enumerate(docs)])# 创建RAG链
rag_chain = {"question": lambda x: x["question"],"sources": lambda x: format_docs(retriever.get_relevant_documents(x["question"]))
} | ChatPromptTemplate.from_template("""基于以下来源回答问题。如果来源中没有答案,就说你不知道。问题: {question}来源:{sources}{format_instructions}"""
) | model | rag_parser
最佳实践
- 提供清晰的格式指南:明确告诉模型预期的输出格式
- 使用枚举和验证:限制可能的值范围,提高输出一致性
- 实施错误处理:针对解析失败的情况有备份策略
- 逐步处理复杂输出:将复杂解析任务分解为多个步骤
- 考虑格式的复杂性:在详细结构和容错性之间找到平衡
- 测试不同的提示形式:找到最能产生一致可解析输出的提示方式
常见陷阱与解决方案
-
模型忽略格式指南
- 解决方案:将格式指南放在提示的最后,添加明显的分隔符
-
嵌套数据结构解析失败
- 解决方案:将复杂结构分解为多个简单步骤,逐步构建
-
不一致的格式
- 解决方案:使用OutputFixingParser自动修复轻微格式问题
-
无法处理长输出
- 解决方案:实现分块处理策略,将长输出分段解析
总结
输出解析器是LangChain中的关键组件,它们将语言模型的自然语言输出转换为结构化数据,使其可以被应用程序有效处理。通过选择合适的解析器和实施适当的格式提示,可以显著提高语言模型输出的一致性和可用性。
无论是简单的列表和字典,还是复杂的嵌套结构,输出解析器都提供了强大的工具集来处理各种数据类型和格式需求。通过与LangChain的其他组件(如模型、提示模板和链)结合,输出解析器成为构建高效可靠的LLM应用程序的基石。
后续学习
- 提示模板 - 学习如何设计有效的提示来配合解析器
- 模型输入输出 - 了解更多关于模型交互的信息
- 链 - 探索如何将解析器集成到更复杂的工作流中
相关文章:
LangChain-输出解析器 (Output Parsers)
输出解析器是LangChain的重要组件,用于将语言模型的原始文本输出转换为结构化数据。本文档详细介绍了输出解析器的类型、功能和最佳实践。 概述 语言模型通常输出自然语言文本,但在应用开发中,我们经常需要将这些文本转换为结构化的数据格式…...
wsl2+ubuntu22.04安装blenderproc教程
本章教程,介绍如何在windows操作系统上通过wsl2+Ubuntu22.04上安装blenderproc。 一、pipi安装方式 推荐使用minconda3安装Python环境。 pip install Blenderproc二、源码安装 1、下载源码 git clone https://github.com/DLR-RM/BlenderProc2、安装依赖 cd BlenderProc &am…...
矩阵热图】】
一、基础热图绘制 import matplotlib.pyplot as plt import numpy as np# 模拟数据生成 matching_history [np.random.randint(0, 2, (5, 3)) for _ in range(4)] # 5个UE,3个边缘服务器,4次迭代# 绘制最终匹配矩阵 plt.figure(figsize(10, 6)) plt.i…...
opencv人脸性别年龄检测
一、引言 在计算机视觉领域,人脸分析是一个热门且应用广泛的研究方向。其中,人脸性别年龄检测能够自动识别图像或视频流中人脸的性别和年龄信息,具有诸多实际应用场景,如市场调研、安防监控、用户个性化体验等。OpenCV 作为一个强…...
idea里面不能运行 node 命令 cmd 里面可以运行咋回事啊
idea里面不能运行 node 命令 cmd 里面可以运行咋回事啊 在 IntelliJ IDEA(或其他 JetBrains 系列 IDE)中无法运行某些命令,但在系统的命令提示符(CMD)中可以正常运行,这种情况通常是由于以下原因之一导致的…...
【ROS】软件包后期添加依赖
【ROS】软件包后期添加依赖 前言整体思路修改 package.xml1. 构建依赖(build_depend)2. 构建导出依赖(build_export_depend)3. 运行依赖(exec_depend)如何修改 修改 CMakeLists.txt修改 find_package其他修…...
十三届蓝桥杯Java省赛 B组(持续更新..)
目录 十三届蓝桥杯Java省赛 B组第一题:星期计算第二题:山第三题:字符统计第四题:最少刷题数第五题:求阶乘第六题:最大子矩阵第七题:数组切分第八题:回忆迷宫第九题:红绿灯…...
生成式人工智能的价值回归:重塑技术、社会与个体的发展轨迹
在数字化浪潮的席卷之下,生成式人工智能(Generative AI)正以前所未有的速度重塑人类社会的面貌。这项技术不仅被视为人工智能发展的新阶段,更被赋予了推动生产力跃升、加速社会形态变革的历史使命。生成式人工智能的价值回归,不仅体现在技术本身的革新与突破,更在于其对个…...
【工具开发教程】通过批量OCR识别PDF扫描件中的文本,给PDF批量重命名,基于WPF和阿里云的实现方案,超详细
以下是基于WPF和阿里云实现批量OCR识别PDF扫描件中的文本,并给PDF批量重命名的项目方案,包含项目背景、界面设计、代码步骤和开发总结。 一、项目背景 在日常办公或学习中,处理大量PDF扫描件时,常常需要手动提取文件中的文本内容并重命名文件。这种方式效率低下且容易出错…...
AI 重构 Java 遗留系统:从静态方法到 Spring Bean 注入的自动化升级
在当今快速发展的软件行业中,许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法,随着业务的不断发展,其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具,为 Java 遗留系统的重构提供了…...
JS—同源策略:2分钟掌握同源策略
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–什么是“同源”?三–同源策略的限制范围四–允许跨源的场景五–如何绕过同源策略(安全方式)六–同源策略的安全意义七–总结 二. 什么是“同源”? …...
【C++】关于scanf是否需要使用的快速记忆
在 C 语言中,scanf 函数用于从标准输入读取数据并存储到变量中。scanf 函数需要知道变量的内存地址,以便将输入的数据存储到正确的内存位置。这就是为什么在大多数情况下需要使用 & 符号的原因。 1. 为什么需要使用& & 符号用于获取变量的内…...
BUUCTF-web刷题篇(19)
28.CheckIn 源码: #index.php <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&q…...
国家优青ppt美化_青年科学基金项目B类ppt案例模板
国家优青 国家优青,全称“国家优秀青年基金获得者”。2025改名青年科学基金B类。 作为自然基金人才资助类型,支持青年学者在基础研究方面自主选择研究方向开展创新研究。它是通往更高层次科研荣誉的重要阶梯,是准杰青梯队。 / WordinPPT /…...
【HTML】动态背景效果前端页面
下面是一个带有多种动态背景效果的现代化前端页面,包含粒子效果、渐变波浪和星空背景三种可选动态背景。直接上代码!! <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name&quo…...
前端面试宝典---创建对象的配置
Object.create 对整个对象的多个属性值进行配置 创建对象 不可更改属性值 // 创建对象 不可更改属性值 let obj Object.create({}, {name: {value: lisi,writable: false,},age: {value: 20,writable: true,} })console.log(初始化obj, obj) obj.name wangwu console.log(…...
Linux重启命令(Linux Restart Command)
Linux重启命令:深入了解reboot、shutdown、init和systemctl 在Linux系统中,重启系统是一个常见的操作,可以通过多种命令来实现。以下是一些常用的重启命令及其区别: reboot 这是一个非常通用的命令,用于重启系统。 它…...
UML-饮料自助销售系统(饮料已售完)序列图
一、题目: 在饮料自动销售系统中,顾客选择想要的饮料。系统提示需要投入的金额,顾客从机器的前端钱币口投入钱币,钱币到达钱币记录仪,记录仪更新自己的选择。正常时记录仪通知分配器分发饮料到机器前端,但可…...
第7课:智能体安全与可靠性保障
智能体安全与可靠性保障:从攻击防御到隐私保护的全栈实践 一、引言:当智能体走向开放世界:安全为何成为协作的“生命线” 随着多智能体系统(MAS)在金融、医疗、自动驾驶等关键领域的落地,安全风险呈指数级…...
前端性能优化核弹级方案:CSS分层渲染+Wasm,首屏提速300%!
前端性能优化核弹级方案:CSS分层渲染Wasm实现首屏提速300%的终极指南 在当今Web应用日益复杂的背景下,性能优化已成为前端开发的核心竞争力。本文将深入剖析两种革命性的前端性能优化技术——CSS分层渲染与WebAssembly(Wasm)的协同应用,揭示…...
有一个服务器能做什么?
服务器对于程序员来说就是一个超级便利的机器,可以用自己的知识来做出许多的使用场景。 搭建网站和应用程序 个人网站:可以创建个人博客、作品集网站或简历网站等,用于展示个人才华、分享经验和知识。 企业网站:为企业搭建官方…...
华为RH2288H V3服务器极速重装:从RedHat到openEuler 24超详细重装指南
1 登录iBMC口 2 配置启动项 点击:配置,点击:系统启动项 点击:单次有效,选择:光驱,点击:保存 3 进Remote Contro 点击:远程控制,进入如下界面 点击࿱…...
AI集群设计
关键要素 硬件选型 计算节点:通常选用配备高性能 GPU(如 NVIDIA A100、H100 等)的服务器,以提供强大的并行计算能力,加速深度学习模型的训练和推理过程。网络设备:采用高速网络,如 InfiniBand …...
NginxWebUI:可视化 Nginx 配置管理工具,告别繁琐命令行!
文章目录 📌前言1. NginxWebUI 是什么?2. NginxWebUI 核心功能3. 如何安装 NginxWebUI?3.1 Docker 安装(推荐)3.2 Java Jar 运行 4. NginxWebUI 基本使用教程4.1 登录与初始化4.2 配置反向代理4.3 管理 SSL 证书4.4 查…...
深入理解 GLOG_minloglevel 与 GLOG_v:原理与使用示例
文章目录 深入理解 GLOG_minloglevel 与 GLOG_v:原理与使用示例1. GLOG_minloglevel:最低日志等级控制2. GLOG_v:控制 VLOG() 的详细输出等级3. GLOG_minloglevel 与 GLOG_v 的优先级关系4. 使用示例4.1 基础示例:不同日志等级4.2…...
移动端六大语言速记:第12部分 - 测试与优化
移动端六大语言速记:第12部分 - 测试与优化 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在测试与优化方面的特性,帮助开发者理解和掌握各语言的测试框架和性能优化技巧。 12. 测试与优化 12.1 单元测试框架对比 各语言单元测试框架…...
ubuntu2204安装显卡驱动+多版本的cuda+cudnn+多版本tensorRT
cuda的版本更新速度很快,这也带动TensorRT的更新速度。TensorRT SDK的更新直接从版本8升级到版本10(其实有版本9,和8相比没有大的改变)。tensorRT部署模型的很多接口都发生了较大的改变。为了体验不同版本的cuda和tensorRT的推理,本文考虑在u…...
从One-Hot到TF-IDF:NLP词向量演进解析与业务实战指南
从One-Hot到TF-IDF:词向量演进之路 开场白: 想象一下,你试图用Excel表格分析《红楼梦》的情感倾向——每个字词都是孤立的单元格,计算机看到的只有冰冷的0和1,而“黛玉葬花”的凄美意境却消失得无影无踪。这就是NLP工…...
Ubuntu下载火狐浏览器
在 Ubuntu 中卸载 Firefox 浏览器的方法取决于其安装方式(通过 APT 包管理器 或 Snap)。以下是详细的步骤: 1. 确认 Firefox 的安装方式 首先检查 Firefox 是通过哪种方式安装的: # 检查 Snap 版本 snap list | grep firefox# 检…...
C++ - 数据容器之 unordered_map(声明与初始化、插入元素、访问元素、遍历元素、删除元素、查找元素)
一、unordered_map unordered_map 是 C STL 中的一个关联容器,它有如下特点 unordered_map 存储键值对,使用哈希表实现 unordered_map 的每个键在容器中只能出现一次 unordered_map 的存储的键值对是无序的 平均情况下,查找、插入、删除都…...
什么是具身智能?其发展五大趋势预测
3月29-30日,由中国人工智能学会主办的第二届中国具身智能大会(CEAI 2025)在北京海淀成功召开。中国科学院院士、南京大学党委书记谭铁牛在大会作题为“具身智能:学科交叉的新前站”的主题演讲。他表示,具身智能是发展人…...
智能指针的使用及其原理(C++)
1. 智能指针的使用场景分析 通过下面的例子来分析: double Divide(int a, int b) {// 当b 0时抛出异常if (b 0){throw "Divide by zero condition!";}else{return (double)a / (double)b;} }void Func() {int* array1 new int[10];int* array2 new …...
使用 react-three-fiber 快速重构 Three.js 场景⚛️
不明白的知识先放在一边,激发兴趣是第一步,所以不必纠结代码的细节,相信我你很快就会爱上这种感觉!!! 今天,我们将更进一步,将上一篇中vite npm传统 Three.js 原生代码完整 重构为 …...
索尼相机视频文件格式规格
XAVC,作为Sony所独有的一种视频编码格式,具有其独特的压缩技术。其中,L代表的是Long GOP压缩方式,这种方式在视频编码中,侧重于实现帧间的高效压缩,以提升整体的编码效率。而I则对应着Intra压缩方式&#x…...
Audacity命令:“文件”菜单相关命令
1 Audacity命令:“文件”菜单相关命令 文件菜单提供用于创建、打开和保存 Audacity 项目以及导入和导出音频文件的命令。 1.1 文件菜单命令列表 文件菜单一级菜单的命令列表 Scripting IdActionParameters描述New:New无创建一个新的空白项目窗口,用于处…...
chrome提示https不安全, 不能记住账号密码怎么办? 可以利用js输入账号
背景: 在内网搭建的服务, 由于https证书问题, 可能会被chrome浏览器提示不安全 此时, 默认的记住账号密码功能就无法使用, 那么此时只能手动输入了吗? 想到了几种方案 1.利用外置软件, 模拟按键输入(比如按键精灵, 缺点是依赖外部软件, 运行速度也慢, 且执行时占用了输入焦…...
ubuntu18.04安装miniforge3
1.下载安装文件 略(注:从同事哪里拖来的安装包) 2.修改安装文件权限 chmod x Miniforge3-Linux-x86_64.sh 3.将它安装到指定位置 micromamba activate /home/xxx/fxp/fromDukto/miniforge3 4.激活 /home/xxx/fxp/fromDukto/miniforge3…...
Flutter容器组件深度解析
引言 在 Flutter 开发中,容器组件是构建用户界面的基石。它们为开发者提供了强大而灵活的方式来组织和布局界面元素。通过使用容器组件,开发者可以轻松地控制子组件的大小、位置、边距、背景等属性,从而创建出美观、易用且响应式的界面。本文…...
Java 实现 List<String> 与 String 互转
在 Java 开发过程中,有时需要将 List<String> 转为 String 存储,后续使用时再还原回去。此时就需要 Java 实现 List<String> 与 String 互转。以下是一种互转方式。 采用如下工具包实现。 <dependency><groupId>org.apache.com…...
无人设备遥控器之数据分析与处理篇
无人设备遥控器的数据分析与处理是提升设备智能化水平和操作效率的关键环节。以下从数据采集、预处理、分析方法、处理技术、应用场景五个方面展开分析: 一、数据采集 无人设备遥控器通过多种方式采集数据,主要包括: 控制信号数据…...
【Django】教程-14-验证码+登录页
【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...
flask实现上传文件与下载文件
以下是一个使用Python Flask实现的文件上传和下载服务的完整步骤及代码示例:供参 功能说明: 上传文件: POST请求到/upload端点 需要包含一个名为file的文件参数 支持的文件类型包括:txt, pdf, png, jpg, jpeg, gif, doc, docx, xlsx, zip 返回上传成功信息和下载链接 下载…...
用Java写一个MVCC例子
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于数据库管理系统中处理并发访问数据的技术。它允许事务在查询时看到数据的一个快照版本,而不是直接查看最新的提交数据。这种方法不仅提高了并发性能,…...
【遥感科普】卫星影像产品处理等级有哪些?
遥感数据等级划分是指将卫星遥感原始数据按处理深度分为不同等级,用户可快速匹配需求:初级数据适合算法开发,高级产品可直接用于分析。分级体系促进数据标准化,降低使用门槛,提升跨机构协作效率;同时便于质…...
第十二天 - Flask/Django基础 - REST API开发 - 练习:运维管理后台API
从零开始用Flask/Django构建运维管理后台API(实战指南) 前言:为什么选择Python Web框架? 在运维自动化领域,构建管理后台是每个运维工程师的必修课。本文将通过Flask和Django两个主流框架,手把手教你构建…...
计算机视觉与深度学习 | 视觉里程计(Visual Odometry, VO)学习思路总结
视觉里程计(Visual Odometry, VO)学习思路总结 视觉里程计(VO)是通过摄像头捕获的图像序列估计相机运动轨迹的技术,广泛应用于机器人、自动驾驶和增强现实等领域。以下是一个系统的学习路径,涵盖基础理论、核心算法、工具及实践建议:一、基础理论与数学准备 核心数学工具…...
解决vite.config.ts 引入scss 预处理报错
版本号: "sass": "^1.86.3","sass-loader": "^16.0.5","vite": "^6.2.0" 报错图片: vite.config.ts 一开始文件错误 修改之后:完美解决报错(不过我还没搞懂为什么…...
Design Compiler:中断命令/脚本的执行
相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 中断命令的执行 如果在使用命令时输入了错误的选项或输入了错误的命令,可以使用CtrlC手动中断命令的执行并返回到dc_shell中,此时终端…...
图灵逆向——题十七-字体加密
十七题是一个很经典的字体加密案例,很适合新手入门~ 目录列表 过程分析代码实现 过程分析 打开开发者工具直接看请求,发现它请求的没有加密参数,以为万事大吉的你迫不及待的点击了响应,然后就会发现依托。。。 返回的数据中字体…...
uniapp微信小程序图片生成水印
整体思路: 用户通过uni.chooseImage选择图片后,获得图片文件的path和size。通过path调用uni.getImageInfo获取图片信息,也就是图片宽高。图片宽高等比缩放至指定大小,不然手机处理起来非常久,因为手机随便拍拍就很大。…...