LangChain-2-Model
可以把对模型的使用过程拆解成三块: 输入提示(Format)、调用模型(Predict)、输出解析(Parse)1.提示模板: LangChain的模板允许动态选择输入根据实际需求调整输入内容适用于各种特定任务和应用。2.语言模型: LangChain 提供通用接口调用不同类型的语言模型提升了灵活性和使用便利性。3.输出解析: 利用 LangChain 的输出解析功能精准提取模型输出中所需信息避免处理冗余数据同时将非结构化文本转换为可处理的结构化数据提高信息处理效率。这三块形成了一个整体在LangChain中这个过程被统称为Model I/O。针对每块环节LangChain都提供了模板和工具可以帮助快捷的调用各种语言模型的接口大模型按照模型功能的不同非对话模型LLMs、Text Model对话模型Chat Models嵌入模型Embedding ModelsLLMs(非对话模型)LLMs也叫Text Model、非对话模型是许多语言模型应用程序的支柱。主要特点如下 输入接受文本字符串或 PromptValue 对象 输出总是返回文本字符串Chat Models(对话模型)ChatModels也叫聊天模型、对话模型底层使用LLMs。 大语言模型调用以 ChatModel 为主 主要特点如下 输入接收消息列表 List[BaseMessage] 或 PromptValue 每条消息需指定角色如 SystemMessage、HumanMessage、AIMessage 输出总是返回带角色的 消息对象 BaseMessage 子类通常是 AIMessageLangChain有一些内置的消息类型SystemMessage 设定AI行为规则或背景信息。比如设定AI的初始状态、行为模式或对话的总 体目标。比如“作为一个代码专家”或者“返回json格式”。通常作为输入消息序列中的第一个 传递。HumanMessage 表示来自用户输入。比如“实现 一个快速排序方法”AIMessage 存储AI回复的内容。这可以是文本也可以是调用工具的请求ChatMessage 可以自定义角色的通用消息类型FunctionMessage/ToolMessage 函数调用/工具消息用于函数调用结果的消息类型Embedding Model(嵌入模型)Embedding Model也叫文本嵌入模型这些模型将文本作为输入并返回浮点数列表 也就是 Embedding。常配合向量数据库使用这里不做多解释RAG部分会重点说明模型调用OpenAI的GPT系列奠定了大模型的技术范式与接口标准。因此无论是Qwen还是ChatGLM等模型在调用方式与函数设计上都基本遵循OpenAI的规范差异很小。这使得各类开源项目可以通过统一的接口兼容并调用不同模型例如利用LangChain实现通用API接入推荐此方式提示词模板在LangChain的Model I/O中提示模板是其组成之一,语言模型的提示是用户提供的一组指令或输入用于指导模型的响应帮助模型理解上下文并生成相关且连贯的基于语言的输出例如回答问题、完成句子或参与某项活动、对话1.PromptTemplate定义这是最基础的提示词模板类允许你定义带有变量的提示模板然后通过填充这些变量来生成具体的提示。特点简单灵活适用于大多数需要动态生成提示的场景。使用场景当你有一个固定结构的提示只是其中某些部分需要根据不同情况进行替换时可以使用PromptTemplate。2.ChatPromptTemplate定义专门为聊天场景设计的提示词模板。它可以处理多轮对话中的不同角色如人类、AI的消息并根据这些消息生成适合聊天模型的提示。特点能够自然地处理对话上下文适合构建聊天机器人等交互性应用。使用场景在构建基于聊天模型的应用如智能客服、聊天助手时使用ChatPromptTemplate可以方便地管理对话流程。消息模板包括ChatMessagePromptTemplate、HumanMessagePromptTemplate、AIlMessagePromptTemplate、SystemMessagePromptTemplate等3.FewShotPromptTemplate定义用于提供少量示例few - shot的提示模板。它允许你在提示中包含一些示例输入和输出帮助模型更好地理解任务要求。特点通过示例引导模型能让模型更好地学习任务模式提高生成结果的质量。使用场景当任务比较复杂需要向模型展示一些示例来明确任务的执行方式时使用FewShotPromptTemplate很合适比如文本分类、问答等任务。4. FewShotChatMessagePromptTemplate定义它是结合了少样本学习和聊天场景特点的提示词模板类。该模板在为聊天模型构建提示时不仅能像FewShotPromptTemplate那样提供少量示例输入输出还能以符合聊天交互的消息格式呈现这些示例以及用户输入专门用于模拟多轮对话的上下文。特点通过少样本引导以聊天消息对象如HumanMessage和AIMessage的形式组织提示内容能够很好地处理多轮对话的上下文信息使用场景复杂聊天任务特定风格对话多轮对话引导。PromptTemplatePromptTemplate是一个基础类用于创建带有可替换变量的提示模板。它允许你定义一个包含占位符的字符串模板然后在运行时将这些占位符替换为实际的值。代码示例from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI llm ChatOpenAI( api_key, base_urlhttps://api.baichuan-ai.com/v1, modelBaichuan3-Turbo ) prompt PromptTemplate.from_template(你是一个广告标语专家请帮我写一个关于{product}的广告语) #链式调佣 chain prompt | llm resp chain.invoke({product: 橘子酒店}) print(resp) #得到输入提示 input prompt.format(product苹果) print(input) #直接使用 output llm.invoke(input) print(output)可以使用字符串拼接的方式构建提示词from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI llm ChatOpenAI( api_key, base_urlhttps://api.baichuan-ai.com/v1, modelBaichuan3-Turbo ) prompt (PromptTemplate.from_template(你是一个开场白专家请帮我写一个{topic}的开场白) 要求简单一些不要超过{maxLength}个字 需要激情一些能带动大家情绪) chain prompt | llm result chain.invoke({topic: 公司年会, maxLength: 200}) print(result.content)ChatPromptTemplateChatPromptTemplate是专门为聊天场景设计的提示模板。它考虑了不同角色如用户、系统、助手的消息格式能够更方便地构建多轮对话的提示。ChatPromptTemplate有两个重要的方法from_template该方法接收一个字符串模板模板中可以包含变量占位符用于后续填充具体的值。它通常适用于单个模板的情况将整个提示信息以一个字符串的形式进行定义。和PromptTemplate使用方式一样from_messages此方法接收一个消息模板列表列表中的每个元素通常是SystemMessagePromptTemplate、FunctionCallMessage、HumanMessagePromptTemplate或AIMessagePromptTemplate等消息模板实例。这种方式允许你分别定义不同角色如系统、方法调用、人类、AI的消息模板更适合处理多轮对话和复杂的聊天场景。LangChain有一些内置的消息类型SystemMessage 设定AI行为规则或背景信息。比如设定AI的初始状态、行为模式或对话的总 体目标。比如“作为一个代码专家”或者“返回json格式”。通常作为输入消息序列中的第一个 传递。HumanMessage 表示来自用户输入。比如“实现 一个快速排序方法”AIMessage 存储AI回复的内容。这可以是文本也可以是调用工具的请求 ChatMessage 可以自定义角色的通用消息类型FunctionMessage/ToolMessage 函数调用/工具消息用于函数调用结果的消息类型注意 FunctionMessage和ToolMessage分别是在函数调⽤和⼯具调⽤场景下才会使⽤的特殊消息类 型HumanMessage、AIMessage和SystemMessage才是最常⽤的消息类型。示例1from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI llm ChatOpenAI( api_key, base_urlhttps://api.baichuan-ai.com/v1, modelBaichuan3-Turbo ) prompt ChatPromptTemplate.from_messages([ {role: system, content: 你是一个广告标语专家}, {role: user, content: 请帮我写一个关于{product}的广告标语} ]) chain prompt | llm result chain.invoke({product: 苹果}) print(result.content)当调⽤此 ChatPromptTemplate 时将构造两个消息。 第⼀个是系统消息没有变量需要格式化。 第⼆个是 用户消息将由⽤⼾传⼊的 product变量进⾏格式化。示例2也可以写成元组from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI llm ChatOpenAI( api_key, base_urlhttps://api.baichuan-ai.com/v1, modelBaichuan3-Turbo ) prompt ChatPromptTemplate.from_messages([ (system, 你是一个会讲笑话的人), (user, 请帮给我讲一个关于{product}的笑话) ]) chain prompt | llm result chain.invoke({product: 狗}) print(result.content)当调⽤此 ChatPromptTemplate 时将构造两个消息。 第⼀个是系统消息没有变量需要格式化。 第⼆个是 用户消息将由⽤⼾传⼊的 topic 变量进⾏格式化。示例3guiji_llm ChatOpenAI( modelQwen/Qwen3-14B, #使用硅基流动千问大模型 api_keyGUIJI_API_KEY, #使用自己的api key base_urlGUIJI_BASE_URL # ) prompt_template ChatPromptTemplate.from_messages([你是一个翻译专家能将用户输入{input}翻译成{lang}]) chain prompt_template | guiji_llm | StrOutputParser() input_str input(要翻译的内容) lang input(要翻译成) resp chain.invoke({input: input_str, lang: lang})简化写法直接通过字符串构建消息示例4guiji_llm ChatOpenAI( modelQwen/Qwen3-14B, #使用硅基流动千问大模型 api_keyGUIJI_API_KEY, #使用自己的api key base_urlGUIJI_BASE_URL # ) human_prompt HumanMessagePromptTemplate.from_template({input}) system_prompt SystemMessagePromptTemplate.from_template(你是一个翻译助手能将用户输入的内容翻译成{lang}) prompt_template ChatPromptTemplate.from_messages([system_prompt, human_prompt]) chain prompt_template | guiji_llm | StrOutputParser() input_str input(要翻译的内容) lang input(要翻译成) resp chain.invoke({input: input_str, lang: lang})HumanMessagePromptTemplate这是 LangChain 中的一个类用于定义用户消息的提示模板。SystemMessagePromptTemplate这是 LangChain 中的一个类用于定义系统消息的提示模板。常见消息模板及区别1.HumanMessage定义代表人类用户发送的消息。在对话模拟中用于传递用户输入的内容。作用向模型提供用户的问题、指令或对话内容作为模型生成回复的依据。2.AIMessage定义代表AI模型生成的回复消息。在对话交互中存储模型针对用户消息给出的响应内容。作用记录模型的输出结果可用于后续的对话流程处理或展示给用户。3.SystemMessage定义用于设置对话的初始指令或背景信息对AI模型的回复风格、任务范围等进行全局的引导和约束。作用可以让模型在特定的语境和规则下进行回复例如要求模型以特定语言风格、特定身份进行回复等。4.FunctionCallMessage定义表示模型调用外部函数的请求消息。当模型认为需要调用特定函数来完成任务时会生成此类消息。作用实现模型与外部工具或服务的交互扩展模型的能力如查询数据库、调用API等。示例5human_prompt1 HumanMessagePromptTemplate.from_template(我对{topic}很感兴趣) human_prompt2 HumanMessagePromptTemplate.from_template(你能给我推荐一些相关书籍吗) #多条用户信息 prompt_template ChatPromptTemplate.from_messages([ human_prompt1, human_prompt2, ]) chain prompt_template | guiji_llm | StrOutputParser() topic input(请输入感兴趣的学科) resp chain.invoke({topic: topic}) print(翻译结果, resp)多条用户信息消息占位符在上⾯的 ChatPromptTemplate 中我们看到如何格式化两个消息每个消息都是⼀个字符串。 但是如果我们希望⽤⼾传⼊⼀个消息列表历史消息并将其插⼊到特定位置呢 这就是需要使⽤ MessagesPlaceholder。from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.messages import HumanMessage prompt_template ChatPromptTemplate.from_messages([ (system, 你是⼀个电视台⾼端访谈节⽬的主持⼈), MessagesPlaceholder(msgs) ]) prompt_template.invoke({msgs: [HumanMessage(content你好主持⼈!)]})使用占位符携带对话历史实现多轮对话案例from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.messages import HumanMessage, AIMessage deepseek_llm ChatOpenAI(modeldeepseek-reasoner, api_key”“, base_url”“) # 定义 Prompt 模板 prompt ChatPromptTemplate.from_messages([ (system, 你是一个计算助手能够回答数学问题。), MessagesPlaceholder(variable_namechat_history, optionalTrue), (human, {input}) ]) # 初始化聊天历史 chat_history [] # 构建链式调用 chain prompt | deepseek_llm # 多轮对话循环 while True: user_input input(你: ) if user_input.lower() in [退出, exit, q]: print(助手: 再见) break # 调用模型生成回复 response chain.invoke({ chat_history: chat_history, input: user_input }) # 将用户输入和助手回复添加到聊天历史中 chat_history.append(HumanMessage(contentuser_input)) chat_history.append(AIMessage(contentresponse.content)) print(f助手: {response.content})FewShotPromptTemplateFewShotPromptTemplate用于提供少量示例few-shot来引导语言模型的输出。它允许你在提示中包含一些输入 - 输出对让模型学习如何根据这些示例生成类似的结果。示例from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder, FewShotPromptTemplate, PromptTemplate from langchain_openai import ChatOpenAI llm ChatOpenAI( api_key, base_urlhttps://api.baichuan-ai.com/v1, modelBaichuan3-Turbo ) examples [ { question: 乾隆和曹操谁活得更久, answer: 这里是否需要跟进问题是的。 追问乾隆去世时几岁 中间答案乾隆去世时87岁。 追问曹操去世时几岁 中间答案曹操去世时66岁。 所以最终答案是乾隆 , }, { question: 小米手机的创始人什么时候出生, answer: 这里是否需要跟进问题是的。 追问小米手机的创始人是谁 中间答案小米手机由雷军创立。 跟进雷军什么时候出生 中间答案雷军出生于1969年12月16日。 所以最终的答案是1969年12月16日。 , }, { question: 乔治·华盛顿的外祖父是谁, answer: 这里是否需要跟进问题是的。 追问乔治·华盛顿的母亲是谁 中间答案乔治·华盛顿的母亲是玛丽·鲍尔·华盛顿。 追问玛丽·鲍尔·华盛顿的父亲是谁 中间答案玛丽·鲍尔·华盛顿的父亲是约瑟夫·鲍尔 , } ] prompt FewShotPromptTemplate( examplesexamples, #示例样本 example_promptPromptTemplate.from_template( question: {question}\nanswer: {answer}, ), # 示例的格式 prefix你是一个问答机器人你需要根据问题来回答。, #示例前置内容 suffix请根据以上的例子来回答问题{question}, #示例后置内容 input_variables[question]) #输入变量 chain prompt | llm result chain.invoke({question: 华为的创始人什么时候出生的}) print(result.content)FewShotChatMessagePromptTemplateFewShotChatMessagePromptTemplate是 LangChain 库中的一个类用于创建少样本Few - Shot提示模板专门处理聊天消息的提示。FewShotPromptTemplate适用于传统的文本生成任务例如文本摘要、问答系统等这些任务通常以单一的文本输入和输出为主不涉及多轮对话的交互场景。FewShotChatMessagePromptTemplate专门为聊天场景设计适用于处理多轮对话的情况。它可以更好地处理不同角色如用户和助手之间的消息交互模拟真实的聊天过程。示例from langchain_core.messages import HumanMessage from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate, MessagesPlaceholder, \ PromptTemplate deepseek_llm ChatOpenAI(modeldeepseek-reasoner, api_key”“, base_url”“) examples [ {input: 2 2, output: 4}, {input: 2 3, output: 6}, ] example_prompt ChatPromptTemplate.from_messages([ (human,{input}), (ai,{output}) ]) few_shot_prompt FewShotChatMessagePromptTemplate( examplesexamples, example_promptexample_prompt ) example_prompt ChatPromptTemplate.from_messages([ (system,你是智能机器人AI助手), few_shot_prompt, MessagesPlaceholder(msgs) ]) chain example_prompt | deepseek_llm print(chain.invoke({msgs:[HumanMessage(2 9 的结果是多少)]}))示例选择器当示例过多时为避免超出模型的上下文长度限制可以通过示例选择器选择较短的示例以此优化提示词并提升与大型语言模型交互的效果。以下是 LangChain 中一些常见的示例选择器LengthBasedExampleSelectorLengthBasedExampleSelector 会根据输入的长度以及预设的最大长度限制动态地选择合适长度的示例。当输入较长时它会倾向于选择较短的示例当输入较短时则可以选择更多或更长的示例。SemanticSimilarityExampleSelector此选择器借助向量数据库如 Chroma、FAISS 等和嵌入模型如 OpenAIEmbeddings来计算示例与输入之间的语义相似度。它会先将示例和输入文本转换为向量表示然后通过计算向量之间的距离如余弦相似度来确定它们的语义相似程度。最后选择与输入语义最相似的示例。MaxMarginalRelevanceExampleSelectorMaxMarginalRelevanceExampleSelector 结合了语义相似度和多样性的考量。它的目标是在选择与输入语义相似的示例的同时保证所选示例之间具有一定的多样性。具体做法是首先选择与输入语义最相似的示例然后在后续选择中会尽量选择既与输入相似又和已选示例有一定差异的示例。示例1from langchain_core.example_selectors import LengthBasedExampleSelector from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate from model.deepseek import deepseek_llm examples [ {input: happy, output: sad}, {input: tall, output: short}, {input: energetic, output: lethargic}, {input: sunny, output: cloudy}, {input: windy, output: calm} ] example_prompt PromptTemplate( input_variables[input, output], template原词: {input}\n反义词: {output}, ) example_selector LengthBasedExampleSelector( examplesexamples, example_promptexample_prompt, max_length10,# 最大长度 ) dynamic_prompt FewShotPromptTemplate( example_selectorexample_selector, example_promptexample_prompt, prefix给出输入词的反义词, suffix原词: {adjective}\n反义词: , input_variables[adjective], ) print(dynamic_prompt.format(adjectivebig)) chain dynamic_prompt | deepseek_llm result chain.invoke({adjective: big}) print(result.content)给出输入词的反义词 原词: happy 反义词: sad 原词: tall 反义词: short 原词: big 反义词: small Process finished with exit code 0示例2from langchain_community.vectorstores import Chroma from langchain_core.example_selectors import SemanticSimilarityExampleSelector from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate from langchain_openai import OpenAIEmbeddings from model.deepseek import deepseek_llm examples [ {input: happy, output: sad}, {input: tall, output: short}, {input: energetic, output: lethargic}, {input: sunny, output: cloudy}, {input: windy, output: calm} ] example_selector SemanticSimilarityExampleSelector.from_examples( examples, OpenAIEmbeddings(openai_api_key, openai_api_basehttps://api.34ku.com/v1/), Chroma, k1 #选择示例数量 ) example_prompt PromptTemplate( input_variables[input, output], template原词: {input}\n反义词: {output}, ) similar_example FewShotPromptTemplate( example_selectorexample_selector, example_promptexample_prompt, prefix给出每个输入词的反义词, suffix原词: {adjective}\n反义词: , input_variables[adjective], ) print(similar_example.format(adjectivebig)) chain similar_example | deepseek_llm result chain.invoke({adjective: big}) print(result.content)示例3from langchain_community.vectorstores import FAISS from langchain_core.example_selectors import MaxMarginalRelevanceExampleSelector from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate from langchain_openai import OpenAIEmbeddings from model.deepseek import deepseek_llm examples [ {input: happy, output: sad}, {input: tall, output: short}, {input: energetic, output: lethargic}, {input: sunny, output: cloudy}, {input: windy, output: calm} ] example_selector MaxMarginalRelevanceExampleSelector.from_examples( examples, OpenAIEmbeddings(openai_api_key, openai_api_basehttps://api.34ku.com/v1/), FAISS, k2 # 选择的示例数量 ) example_prompt PromptTemplate( input_variables[input, output], template原词: {input}\n反义词: {output}, ) similar_example FewShotPromptTemplate( example_selectorexample_selector, example_promptexample_prompt, prefix给出每个输入词的反义词, suffix原词: {adjective}\n反义词: , input_variables[adjective], ) print(similar_example.format(adjectivebig)) chain similar_example | deepseek_llm result chain.invoke({adjective: big}) print(result.content)给出每个输入词的反义词 原词: tall 反义词: short 原词: windy 反义词: calm 原词: big 反义词: smallhub提示词LangSmith Hub 是 LangChain 推出的一个用于存储和共享提示模板、链chains、代理agents等语言模型相关资源的平台。可以使用hub上一些开源的提示词模板也可以把自己的提示词模板上传到hub上import os from langchain import hub from langchain_core.prompts import PromptTemplate #使用langSmith os.environ[LANGCHAIN_TRACING_V2] true os.environ[LANGCHAIN_API_KEY] #获取hub上的模板 prompt hub.pull(hwchase17/react) print(prompt.template) prompt_template PromptTemplate.from_template( 你是一个非常有帮助的助手。 请用以下格式回答用户的问题 问题用户的问题 回答用中文回答用户的问题 示例 问题你好 回答你好我是一个非常有帮助的助手。 问题{input} 回答 ) #上传提示词模板到hub hub.push(my_assistant, prompt_template) #拉取提示词模板 my hub.pull(my_assistant) print(my.template)Chain的基本概念Chain链用于将多个组件提示模板、LLM模型、记忆、工具等连接起来形成可复用的 工作 流 完成复杂的任务。 Chain 的核心思想是通过组合不同的模块化单元实现比单一组件更强大的功能。比如 将 LLM 与 Prompt Template 提示模板结合 将 LLM 与 输出解析器 结合 将 LLM 与 外部数据 结合例如用于问答 将 LLM 与 长期记忆 结合例如用于聊天历史记录 通过将 第一个LLM 的输出作为 第二个LLM 的输入...将多个LLM按顺序结合在一起使用LCEL可以构造出结构最简单的Chain。 LangChain表达式语言LCELLangChain Expression Language是一种声明式方法可以轻松地 将多个组件链接成 AI 工作流。它通过Python原生操作符如管道符 | 将组件连接成可执行流程显 著简化了AI应用的开发。 LCEL的基本构成提示Prompt 模型Model 输出解析器OutputParserRunnableRunnable是LangChain定义的一个抽象接口Protocol它强制要求所有LCEL组件实现一组标准方法class Runnable(Protocol): def invoke(self, input: Any) - Any: ... # 单输入单输出 def batch(self, inputs: List[Any]) - List[Any]: ... # 批量处理 def stream(self, input: Any) - Iterator[Any]: ... # 流式输出 # 还有其他方法如 ainvoke异步等任何实现了这些方法的对象都被视为LCEL兼容组件。比如聊天模型、提示词模板、输出解析器、检索 器、代理(智能体)等。 每个 LCEL 对象都实现了 Runnable 接口该接口定义了一组公共的调用方法。这使得 LCEL 对象链也 自动支持这些调用成为可能。#分步调用 prompt_text prompt.invoke({topic: 猫}) # 方法1 model_out model.invoke(prompt_text) # 方法2 result parser.invoke(model_out) # 方法3 #LCEL管道式 chain prompt | model | parser # 用管道符组合 result chain.invoke({topic: 猫}) # 所有组件统一用invoke案例1没有使用chainfrom langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI template PromptTemplate.from_template(template给我讲一个关于{topic}话题的简短笑话) template_invoke template.invoke({topic: 蛤蟆}) llm ChatOpenAI( modelgpt-3.5-turbo, api_keysk-, base_urlhttps://api.34ku.com/v1/, temperature0.7, max_tokens200 ) out llm.invoke(template_invoke) parser StrOutputParser() resp parser.invoke(out) print(resp)案例2使用chainfrom langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI template PromptTemplate.from_template(template给我讲一个关于{topic}话题的简短笑话) llm ChatOpenAI( modelgpt-3.5-turbo, api_keysk-, base_urlhttps://api.34ku.com/v1/, temperature0.7, max_tokens200 ) parser StrOutputParser() chain template | llm | parser resp chain.invoke({topic: 蛤蟆}) print(resp)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2408417.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!