【大语言模型LangChain】 ModelsIO OutputParsers详解
【大语言模型LangChain】 ModelsIO OutputParsers详解
- 一、简介
- 二、OutputParsers 的优势
- 三、解析器类型
- 四、实战示例
- 1、String 解析器
- 2、Json 解析器
- 3、Pydantic 解析器
- 4、结构化输出解析器
- 5、OpenAI 函数输出解析器
- 5.1、JsonOutputFunctionsParser
- 5.2、JsonKeyOutputFunctionsParser
- 5.3、PydanticOutputFunctionsParser
- 5.4、PydanticAttrOutputFunctionsParser
一、简介
基于前边的章节,LangChain 已经可以轻松实现帮用户拿到大语言模型的输出,然而不难发现,前文介绍的模型调用,显示返回的内容通常是一个类(class)的实例,其中包含了 content 以及其他一些额外的参数。
对于模型调用者来说,他们可能只关心 content 的内容,也就是模型对输入内容的回答,或者希望得到一个可操作的数据结构,比如 JSON 格式的数据。
二、OutputParsers 的优势
LangChain 设计的初衷之一,旨在让用户更便捷地使用大模型,所以为了解决输出内容格式化的问题。
通过使用 LangChain 提供的解析器,用户可以更轻松地获取模型的输出,并直接处理或操作所需的内容,而无需进行额外的转换或处理。
三、解析器类型
根据业务需求,开发者通常需要大模型返回一个结构化的数据,方便后续的逻辑可以根据这个数据进行进一步的处理。
然而不同的输入结果可能需要相对应的解析器来做处理,LangChain 同样提供了几种常见的解析器类型:
- String 解析器
- Json 解析器
- Pydantic 解析器
- 结构化输出解析器
- OpenAI 函数输出解析器
四、实战示例
1、String 解析器
LangChain 提供了 StrOutputParser
,这是一个专门用来处理模型输出内容的解析器。当模型输出的内容是字符串格式的时候,StrOutputParser 能够直接返回模型输出的 content 字符串内容。
这使得用户无需进行复杂的数据解析操作,可以直接获取模型输出的内容字符串,从而更方便地进行后续处理或使用,代码示例如下所示:
# 定义模型
import osfrom langchain_core.messages import SystemMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain_openai import ChatOpenAIos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxxxxxx" # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxxxxxx"model = ChatOpenAI()
# 提示词模板
messages = ChatPromptTemplate.from_messages([SystemMessage(content="你是一个翻译各种语言的助手"),HumanMessagePromptTemplate.from_template("把 {poetry} 的原文诗翻译为英文")
])
# 输出解析器
parser = StrOutputParser()
# 调用链
chain_with_parser = messages | model | parser # 使用输出解析器
res_with_parser = chain_with_parser.invoke({"poetry": "静夜思"})
print(res_with_parser)
print(type(res_with_parser))print('---------------------不使用parser---------------------------------')chain_with_parser = messages | model
res_with_parser = chain_with_parser.invoke({"poetry": "静夜思"})
print(res_with_parser)
print(type(res_with_parser))
结果对比:
2、Json 解析器
当模型输出的内容是一个 JSON 格式时,LangChain 也提供了相应的解析器 JsonOutputParser
。该解析器能够根据 JSON 结构的内容,将其转换为 Python 对应的字典格式的数据,使得用户能够更方便地处理和操作模型输出的结果。代码示例如下所示:
import osfrom langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAIos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxxxx" # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxxxx"# 定义模型
model = ChatOpenAI()
# Json输出解析器
parser = JsonOutputParser()
# 模板提示,输出 json 格式的回答
prompt = PromptTemplate(template="根据用户的输入,给出一段中文宣传语 \n{format_instructions}\n{ads}\n",input_variables=["ads"],partial_variables={"format_instructions": parser.get_format_instructions()},
)
# 调用链 包含json输出解析器
chain_with_parser = prompt | model | parser
res_with_parser = chain_with_parser.invoke({"ads": "音乐节"})
print(res_with_parser)
print(type(res_with_parser))print('------------------------不加json解析器------------------------')# 调用链 包含json输出解析器
chain_with_parser = prompt | model
res_with_parser = chain_with_parser.invoke({"ads": "音乐节"})
print(res_with_parser)
print(type(res_with_parser))
3、Pydantic 解析器
除了支持解析 JSON 格式外,LangChain 还提供了对 Pydantic 模型的解析器 PydanticOutputParser
。
LangChain 的 Pydantic 解析器可以将模型输出的内容解析为 Pydantic 模型所定义的数据结构。这使得用户可以更加方便地使用 Pydantic 的功能,例如数据验证、序列化和反序列化等,代码示例如下:
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
import osos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx" # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"class Translation(BaseModel):origin_str: str = Field(description="原始输入的值")trans_str: str = Field(description="翻译后的值")# 定义一个模型
model = ChatOpenAI(temperature=0)
# 使用 pydantic 输出解析器解析 Translation 类
parser = PydanticOutputParser(pydantic_object=Translation)
# 提示模板
prompt = PromptTemplate(template="翻译用户输入的内容为英文\n{format_instructions}\n{query}\n",input_variables=["query"],partial_variables={"format_instructions": parser.get_format_instructions()},
)
# 包含解析器的调用链
chain_with_parser = prompt | model | parser
res_parser = chain_with_parser.invoke({"query": "赏花"})
# 输出返回的内容及类型
print(res_parser)
print(type(res_parser))
4、结构化输出解析器
LangChain 提供了一种自定义解析方案,即使用 schema 结构。用户可以根据需要定义自己的 schema,并使用 LangChain 的 StructuredOutputParser
类来解析符合该 schema 的数据。
这种方式让用户能够更灵活地处理各种类型的模型输出数据,而无需依赖特定的数据验证库或框架。StructuredOutputParser 为用户提供了一种通用的解析方式,使他们能够简单地将模型输出的数据转换为符合自定义 schema 的数据对象。
代码示例如下:
from langchain.output_parsers import ResponseSchema, StructuredOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAIimport osos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxxxx" # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxxxx"response_schemas = [ResponseSchema(name="slogan", description="宣传语内容"),ResponseSchema(name="req", description="宣传语限制在10个字符内"),
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
prompt = PromptTemplate(template="根据用户输入的商品给出宣传语\n{format_instructions}\n{goods}",input_variables=["goods"],partial_variables={"format_instructions": output_parser.get_format_instructions()},
)model = ChatOpenAI(temperature=0)
chain_with_parser = prompt | model | output_parser
res_with_parser = chain_with_parser.invoke({"goods": "音乐节"})
print(res_with_parser)
print(type(res_with_parser))print('-----------------不加解析器-----------------------')model = ChatOpenAI(temperature=0)
chain_with_parser = prompt | model
res_with_parser = chain_with_parser.invoke({"goods": "音乐节"})
print(res_with_parser)
print(type(res_with_parser))
5、OpenAI 函数输出解析器
LangChain 支持解析 OpenAI 提供的函数调用,并提供了以下四种形式来处理输出结果:
- JsonOutputFunctionsParser:生成 JSON 格式的结果。
- JsonKeyOutputFunctionsParser:指定 JSON 中某个 key 对应的 value。
- PydanticOutputFunctionsParser:解析 Pydantic 模型的结构。
- PydanticAttrOutputFunctionsParser:直接输出模型中某个参数的值。
5.1、JsonOutputFunctionsParser
# 调用大模型
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers.openai_functions import JsonOutputFunctionsParserimport osos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx" # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"model = ChatOpenAI()
# 提示词模板
prompt = ChatPromptTemplate.from_template("出给一个关于 {goods} 的广告宣传语")
# 自定义函数
functions = [{"name": "advertisement","description": "一段广告词","parameters": {"type": "object","properties": {"goods": {"type": "string", "description": "要进行广告的产品"},"ads": {"type": "string", "description": "广告词"},},"required": ["goods", "ads"],},}
]# todo JsonOutputFunctionsParser# 创建调用链 包含输出解析器
chain_json_with_parser = prompt | model.bind(function_call={"name": "advertisement"},functions=functions) | JsonOutputFunctionsParser()
res_json_with_parser = chain_json_with_parser.invoke({"goods": "冰淇淋"})
print(res_json_with_parser)
print(type(res_json_with_parser))print("---------------------------不加JsonOutputFunctionsParser---------------------------")chain_json_with_parser = prompt | model.bind(function_call={"name": "advertisement"},functions=functions)
res_json_with_parser = chain_json_with_parser.invoke({"goods": "冰淇淋"})
print(res_json_with_parser)
print(type(res_json_with_parser))
5.2、JsonKeyOutputFunctionsParser
# 调用大模型
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers.openai_functions import JsonKeyOutputFunctionsParser
import osos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx" # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"model = ChatOpenAI()
# 提示词模板
prompt = ChatPromptTemplate.from_template("出给一个关于 {goods} 的广告宣传语")
# 自定义函数
functions = [{"name": "advertisement","description": "一段广告词","parameters": {"type": "object","properties": {"goods": {"type": "string", "description": "要进行广告的产品"},"ads": {"type": "string", "description": "广告词"},},"required": ["goods", "ads"],},}
]# todo JsonOutputFunctionsParser# 创建调用链 包含输出解析器
chain_key_parser = prompt | model.bind(function_call={"name": "advertisement"},functions=functions) | JsonKeyOutputFunctionsParser(key_name='ads')
res_key_parser = chain_key_parser.invoke({"goods": "摩托车"})
print(res_key_parser)
print(type(res_key_parser))print("---------------------------不加JsonKeyOutputFunctionsParser---------------------------")chain_key_parser = prompt | model.bind(function_call={"name": "advertisement"},functions=functions)
res_key_parser = chain_key_parser.invoke({"goods": "摩托车"})
print(res_key_parser)
print(type(res_key_parser))
5.3、PydanticOutputFunctionsParser
# 调用大模型
from langchain_core.output_parsers.openai_functions import PydanticOutputFunctionsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.utils.function_calling import convert_to_openai_function
from langchain_openai import ChatOpenAI
import osfrom pydantic import BaseModel,Fieldos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx" # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"class Advertisement(BaseModel):origin_str: str = Field(description="原始输入的值")trans_str: str = Field(description="翻译后的值")# 自定义函数
functions = [{"name": "advertisement","description": "一段广告词","parameters": {"type": "object","properties": {"goods": {"type": "string", "description": "要进行广告的产品"},"ads": {"type": "string", "description": "广告词"},},"required": ["goods", "ads"],},}
]model = ChatOpenAI()
# 提示词模板
prompt = ChatPromptTemplate.from_template("出给一个关于 {goods} 的广告宣传语")
# 定义解析器
parser = PydanticOutputFunctionsParser(pydantic_schema=Advertisement)
# 调用函数
openai_functions = [convert_to_openai_function(Advertisement)]
# 创建调用链
chain_pydantic_parser = prompt | model.bind(functions=openai_functions) | parser
# 输出大模型执行结果
res_pydantic_parser = chain_pydantic_parser.invoke({"goods": "饮料"})
print(res_pydantic_parser)
print(type(res_pydantic_parser))
5.4、PydanticAttrOutputFunctionsParser
# 调用大模型
from langchain_core.output_parsers.openai_functions import PydanticOutputFunctionsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.utils.function_calling import convert_to_openai_function
from langchain_openai import ChatOpenAI
import osfrom pydantic import BaseModel,Fieldos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx" # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"class Advertisement(BaseModel):origin_str: str = Field(description="原始输入的值")trans_str: str = Field(description="翻译后的值")# 自定义函数
functions = [{"name": "advertisement","description": "一段广告词","parameters": {"type": "object","properties": {"goods": {"type": "string", "description": "要进行广告的产品"},"ads": {"type": "string", "description": "广告词"},},"required": ["goods", "ads"],},}
]model = ChatOpenAI()
# 提示词模板
prompt = ChatPromptTemplate.from_template("出给一个关于 {goods} 的广告宣传语")print('---------------------------------PydanticAttrOutputFunctionsParser--------------------------------')from langchain_core.output_parsers.openai_functions import PydanticAttrOutputFunctionsParser# 定义 pydantic 参数输出解析器,传入 Pydantic 模型和需要输出的属性名
parser = PydanticAttrOutputFunctionsParser(pydantic_schema=Advertisement, attr_name='trans_str')
# 调用函数
openai_functions = [convert_to_openai_function(Advertisement)]
# 创建调用链 包含输出解析器
chain_pydantic_parser = prompt | model.bind(functions=openai_functions) | parser
# 传入参数执行
res_pydantic_parser = chain_pydantic_parser.invoke({"goods": "饮料"})
print(res_pydantic_parser)
print(type(res_pydantic_parser))
相关文章:
【大语言模型LangChain】 ModelsIO OutputParsers详解
【大语言模型LangChain】 ModelsIO OutputParsers详解 一、简介二、OutputParsers 的优势三、解析器类型四、实战示例1、String 解析器2、Json 解析器3、Pydantic 解析器4、结构化输出解析器5、OpenAI 函数输出解析器5.1、JsonOutputFunctionsParser5.2、JsonKeyOutputFunction…...
PaddleSpeech本地部署文档
windows安装paddlespeech步骤: 1. 安装vs c编译环境 对于 Windows 系统,需要安装 Visual Studio 来完成 C 编译环境的安装。 Microsoft C Build Tools - Visual Studio 2. 安装conda conda create -y -p paddlespeech python3.8 conda activate pad…...
Android 第三方框架:RxJava:源码分析:责任链模式
文章目录 责任链模式RxJava中的责任链总结 责任链模式 RxJava中的责任链 链式调用的使用过程中形成了两个单向链表 第一个单向链表是Observable链表 它的形成过程: 1.首先调用Observable的静态方法创建第一个Observable对象,作为Observable链表的表…...
网络安全 与 加密算法
计算机中的网络安全 在本篇中介绍了以下几个方面: 机密性 密码学 对称加密算法(DES, 3DES, AES) 公开秘钥算法 RSA大素数的获取 完整性 散列函数(MD5, SHA-1, 并没有提及算法实现) 报文鉴别(MAC) 数字签名 端点鉴别 应用 SSL(TCP网络安全) 运行时安全 防火墙的基本知识 …...
UE4_贴花_贴花基础知识二
五、多表面投射 在本示例中,你将了解贴花如何在多个表面上进行投射。请注意,如果表面朝向与投射方向较为平行,贴花投射时必然会产生一些拉伸。另外,请记住,贴花可以在包括骨骼网格体在内的静态和动态网格体上进行投射。…...
ElasticSearch 搜索、排序、分页功能
一、DSL 查询文档 ElasticSearch 的查询依然是基于 json 风格的 DSL 来实现的。 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl.html 1.1 DSL 查询分类 常见的查询类型包括: 查询所有:查询出所有数…...
MySQL-9.1.0 实现最基础的主从复制
目录 1 实验介绍 2 实验准备 2.1 创建目录为MySQL挂载使用 2.2 编写 docker-compose.yml 文件 2.3 启动容器 3 主从复制操作 3.1 MASTER 操作指令 3.2 SLAVE1 操作指令 3.3 SLAVE2 操作指令 4 验证是否实现主从 4.1 导入sql脚本查看是否正常主从复制 4.2 检验从库是否看见复制…...
Java中的“泛型“
泛型(Generics)是Java中的一种重要特性,它允许在定义类、接口和方法时使用类型参数(type parameters)。泛型的主要目的是提高代码的类型安全性和重用性。下面我将详细讲解Java中的泛型。 1. 泛型的基本概念 泛型允许我…...
前端(五)css属性
css属性 文章目录 css属性一、字体属性二、文本属性三、背景属性四、盒子模型 一、字体属性 font-weight:文字粗细,在100到900之间,normal(400),bord(700),inherit(继承父类) font-style:文字风格,normal表示正常(默认…...
总结拓展十七:SAP 采购订单行项目“交货“页签解析
《 SAP采购订单行项目“交货”页签字段解析》 在 SAP 系统的采购流程中,采购订单行项目的“交货”页签承载着关键的信息,其中的字段更是对整个交货环节的精准描述和把控的重要元素。理解和正确解析这些字段,对于确保采购流程的顺利进行、优化…...
分布式日志系统设计
一、分布式日志系统定义 分布式日志系统是一种用于收集、存储和分析大规模分布式系统日志的系统。它可以帮助开发人员和系统管理员实时监控和调试系统,提高系统可靠性和可用性,同时也可以用于日志分析和故障排查。 二、简单设计思路 日志收集ÿ…...
DApp开发如何平衡性能与去中心化?
DApp的核心价值在于信任、透明和去中心化,但这些特点往往伴随着性能的瓶颈和高成本。在DApp开发中,如何在保证去中心化的前提下提升性能,成为开发者面临的重要挑战。如何实现性能与去中心化的平衡是一个重要课题。 一、为什么去中心化影响性…...
RK3588开发笔记-Buildroot编译Qt5WebEngine-5.15.10
目录 前言 一、Qt5WebEngine简介 二、Qt5WebEngine编译 总结 前言 Rockchip RK3588是一款强大的多核处理器,广泛应用于边缘计算、人工智能、嵌入式系统等领域。为了在RK3588上运行自定义的Linux系统,并使用Qt5WebEngine进行Web内容渲染,Buildroot是一个非常合适的工具。本…...
2024年12月GESPC++三级真题解析
一、单选题(每题2分,共30分) 题目123456789101112131415答案 B D A A D B C A A D D C D C A 1.下列二进制表示的十进制数值分别是( )[10000011]原( ) [10000011]补ÿ…...
vue-router路由传参的两种方式(params 和 query )
一、vue-router路由传参问题 1、概念: A、vue 路由传参的使用场景一般应用在父路由跳转到子路由时,携带参数跳转。 B、传参方式可划分为 params 传参和 query 传参; C、而 params 传参又可分为在 url 中显示参数和不显示参数两种方式&#x…...
Asp.net 做登录验证码(MVC)
public class ValidateCode{/// <summary>/// 创建随机数/// </summary>/// <param name"num"></param>/// <returns></returns>public string CreateRandom(int num){string str "ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpq…...
在 Chrome中直接调用大型语言模型的API
AI 时代的高速发展,我们都习惯了使用 ChatGPT、Claude、Gemini 和其他 AI 工具来询问各种问题,目前大部分的 AI 应用都是通过服务端 API 来实现的。 如果想要在 Web 上使用 AI 功能往往需要靠服务器来处理一些非常大的模型。这在制作一些生成内容的 AI …...
微信小程序调用腾讯地图-并解读API文档 JavaScript SDK和 WebService API
搜索:腾讯位置服务 找到API文档: 入门中第一步:申请开发者密钥key 前往控制台: 创建应用并获取key: 设置key的时候,还需要小程序的APPID。所以要前往微信公众平台中获取小程序的APPID: 限制要求:…...
WPF 控件
<div id"content_views" class"htmledit_views"><p id"main-toc"><strong>目录</strong></p> WPF基础控件 按钮控件: Button:按钮 RepeatButton:长按按钮 RadioButton:单选按钮 数据显示控件 Te…...
VScode执行任务
背景 在vscode 中 如果执行命令需要传递进来参数,那么直接通过命令行终端的方式不太方便。通过task 任务的方式来进行启动执行,降低反复输入参数等繁琐工作。 首先可以查看vscode 官方文档 task 启动 crtl shift p .vscode/task.json 示例 执行cp…...
MySQL(数据类型)
目录 1. 数值类型 2. bit类型 3.小数类型 3. 字符串类型 4 日期和时间类型 5. enum和set 1. 数值类型 对标C语言: tinyint->char(1字节): 有符号:127 ~ 255 无符号:0 ~ -128。 smalli…...
pytorch中的tqdm库
tqdm 是一个 Python 的进度条库,名字来源于阿拉伯语 "taqaddum"(意思是“进步”)。它以简单易用、高效著称,常用于循环操作中显示进度信息。 基本用法 1. 普通循环 tqdm 可以轻松为 for 循环添加进度条: …...
NoSQL大数据存储技术测试(5)MongoDB的原理和使用
单项选择题 第1题 关于 MongoDB 集群部署下面说法不正确的是() 已经不使用主从复制的模式 在实际应用场景中, Mongodb 集群结合复制集和分片机制 MongoDB 支持自动分片, 不支持手动切分 (我的答案) 每…...
【Golang】Go语言编程思想(六):Channel,第四节,Select
使用 Select 如果此时我们有多个 channel,我们想从多个 channel 接收数据,谁来的快先输出谁,此时应该怎么做呢?答案是使用 select: package mainimport "fmt"func main() {var c1, c2 chan int // c1 and …...
Vue2简介
一、官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/ 二、介绍与描述 动态构建用户界面的渐进式 JavaScript 框架 作者: 尤雨溪 三、Vue 的特点 遵循 MVVM 模式 编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发 它本身只关注 UI, 也可以引入其它第三…...
EasyPlayer.js播放器如何在iOS上实现低延时直播?
随着流媒体技术的迅速发展,H5流媒体播放器已成为现代网络视频播放的重要工具。其中,EasyPlayer.js播放器作为一款功能强大的H5播放器,凭借其全面的协议支持、多种解码方式以及跨平台兼容性,赢得了广泛的关注和应用。 那么要在iOS上…...
ChatGPT Pro是什么
ChatGPT Pro 和 ChatGPT Plus 的区别主要体现在功能范围、适用场景和目标用户上。 ChatGPT Plus 功能 • 价格:20美元/月。 • 目标用户:针对个人用户设计。 • 主要特点: • 在高峰期响应速度更快。 • 使用高级模型(如 GPT-4…...
基于Springboot汽车资讯网站【附源码】
基于Springboot汽车资讯网站 效果如下: 系统主页面 汽车信息页面 系统登陆页面 汽车信息推荐页面 经销商页面 留言反馈页面 用户管理页面 汽车信息页面 研究背景 随着信息技术的快速发展和互联网的普及,互联网已成为人们查找信息的重要场所。汽车资讯…...
MySQL-DQL之数据表操作
文章目录 零. 准备工作一. 简单查询1.查询所有的商品.2.查询商品名和商品价格.3.查询结果是表达式(运算查询):将所有商品的价格10元进行显示. 二. 条件查询1. 比较查询2. 范围查询3. 逻辑查询4. 模糊查询5. 非空查询 三. 排序查询四. 聚合查询…...
Luckysheet 实现 excel 多人在线协同编辑(全功能实现增强版)
前言 感谢大家对 Multi person online edit(多人在线编辑器) 项目的支持,mpoe 项目使用 quill、luckysheet、canvas-editor 实现的 md、excel、word 在线协同编辑,欢迎大家Fork 代码,多多 Start哦~ Multi person online edit 多人协同编辑器…...
昆明网上房地产官网/百度惠生活怎么优化排名
0x01 起因及想法 起因:好久没更新博客了,我在乌云社区看到一篇代码审计的整体学习思想如下: 学习代码审计目标:能独立完成对一个CMS代码安全的监测 思路: A、通读全文代码,从功能函数代码开始阅读,例如incl…...
药理学网站建设方案/大数据精准营销系统
使用贝塞尔曲线, // 小于四个角 圆角 -(void)setbor{NSString *str " couldnt fit this all in a comment to lomanfs answer. So Im adding it as an answer.";//计算字符高度[Corner layoutHeightWithLable:self.label text:str];/*1.使用空白 view ad…...
自己的网站怎么做跳转/廊坊网络推广公司
网易这回良心了: 7月16日,网易公司旗下云服务商网易数帆宣布开源一款名为 Curve 的高性能分布式存储系统,官方称其性能可达 Ceph 的 1.84 倍。 据官方介绍,Curve 的定位是提供一个高性能、低延迟的存储底座,基于这个…...
wordpress加特效/网站seo分析常用的工具是
请点击查看我的有道云笔记 http://note.youdao.com/noteshare?id50ba601bc935913962c6f025aec59cf2&sub0F4F897E6B2B48BD9535A34807C0F17F...
wordpress卸载 数据库/seo整站优化服务教程
点击蓝字关注我们UDExpo-Display2月28日消息 2020 年 6 月 19 日,三星电子向 WIPO(世界知识产权局)申请了一项名为 “包括子显示屏及其操作方法的电子设备”的专利,描述了一种手机,其前置摄像头部分可通过切换屏幕分层进行隐藏。该专利已于 1…...
外贸企业官网建站/2345导网址导航下载
在mfc中嵌入cef全文介绍如何使用MFC在一对话框中嵌入另一对话框.全文介绍如何使用MFC在内部中嵌入另一部分。 代码如下:代码如下: static MyInDlg inDlg; // 需嵌入的对话框 inDlg.Create( IDD_DIALOG, AfxGetApp()->m_pMainWnd); CRect rc; // 嵌入…...