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

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)

相关文章:

LangChain-2-Model

可以把对模型的使用过程拆解成三块: 输入提示(Format)、调用模型(Predict)、输出解析(Parse) 1.提示模板: LangChain的模板允许动态选择输入,根据实际需求调整输入内容,适用于各种特定任务和应用。 2.语言模型: LangChain 提供通用接口调用不同类型的语…...

Windows Server 2012 R2虚拟机安装全流程解析:从规划到激活

1. 虚拟机安装前的规划与准备 很多朋友一上来就急着点“新建虚拟机”,结果装到一半发现资源不够,或者版本选错了,搞得手忙脚乱。我刚开始玩虚拟机的时候也踩过这个坑,所以咱们第一步,得先把“地基”打好。安装 Windows…...

Liquor v1.4.0 深度解析:Java 动态编译如何实现运行时高效代码执行?

1. 从“写死”到“写活”:为什么我们需要动态编译? 大家好,我是老张,一个在Java和AI领域摸爬滚打了十多年的老码农。今天想和大家聊聊一个听起来有点“黑科技”,但实际上非常接地气的技术——Java动态编译。你可能写过…...

Jenkins Poll SCM实战:如何精准配置代码变更自动构建

1. 从“傻等”到“聪明查”:Poll SCM到底是什么? 如果你用过Jenkins,肯定遇到过这样的纠结:代码一提交,就想立刻看到构建结果,但总不能一直守在电脑前手动点“立即构建”吧?反过来,如…...

scrcpy——从零到一,解锁Android无线投屏与高效控制的奥秘

1. 从“线”到“无线”:为什么你需要scrcpy? 如果你是一名Android开发者,或者只是一个喜欢折腾手机、想把手机屏幕投到电脑大屏上操作的用户,那你大概率已经受够了那些臃肿、卡顿、带广告的第三方投屏软件。我以前也是这样&#x…...

告别手动切换!用Volta实现Node.js版本与包管理器的智能联动

1. 为什么我们需要一个更聪明的版本管理器? 如果你是一个前端开发者,或者经常和Node.js生态打交道,你一定对“版本地狱”这个词不陌生。我刚开始工作那会儿,接手了一个老项目,package.json里写着"node": &qu…...

零代码数据可视化:用Cursor与MCP Server Chart快速构建Netlify在线看板

1. 从晨会焦虑到分钟级响应:一个真实运营场景的破局 周一早上九点半,运营小张的电脑屏幕还停留在昨晚导出的那份密密麻麻的Excel表格上。数据是上周的用户行为日志,老板在十分钟后的晨会上,需要他快速讲清楚几个关键问题&#xff…...

GAMIT解算实战:从数据准备到关键配置文件优化

1. 数据准备:你的第一个GAMIT解算工程 很多朋友第一次接触GAMIT,看到那一堆文件就头大,感觉无从下手。我刚开始用的时候也一样,感觉这不像是个软件,倒像是个文件管理大师。但别怕,只要你把文件分门别类搞清…...

OpenHarmony HDF驱动实战:USB转串口芯片CH9344的HCS配置与内核适配详解

1. 从零开始:理解CH9344在OpenHarmony HDF框架下的适配本质 大家好,我是老张,一个在嵌入式圈子里摸爬滚打了十多年的老码农。最近在搞一个基于RK3568和OpenHarmony 4.0的工业网关项目,板子上的原生串口根本不够用,于是…...

【上采样】从原理到实战:最近邻/双线性/反卷积的深度解析与PyTorch实现

1. 上采样:为什么我们需要它? 如果你玩过图像处理或者正在捣鼓深度学习模型,尤其是像图像分割、超分辨率重建这类任务,那你肯定对“上采样”这个词不陌生。简单来说,上采样就是“放大”或“增加分辨率”的过程。想象一…...

SCIERC数据集:构建科学知识图谱的多任务实体与关系识别指南

1. 从SCIERC数据集开始:你的科学知识图谱构建第一站 如果你正在研究自然语言处理,特别是信息抽取和知识图谱构建,那你大概率听说过SCIERC数据集。我第一次接触它是在一个科研项目里,当时我们需要从计算机科学论文中自动提取关键信…...

UniApp中SVG的动态处理与颜色自定义实战

1. 为什么要在UniApp里折腾SVG&#xff1f; 如果你做过几个UniApp项目&#xff0c;肯定遇到过图标问题。UI给了一堆图标&#xff0c;有PNG&#xff0c;有JPG&#xff0c;偶尔还会甩过来几个SVG文件。PNG用起来简单&#xff0c;<image>标签一放&#xff0c;完事。但一到需…...

Qt 程序崩溃现场重建:从 DMP 文件生成到 VS/WinDbg 精准调试

1. 当你的Qt程序在用户电脑上“神秘消失”&#xff1a;崩溃现场重建的必要性 你有没有遇到过这种情况&#xff1f;自己电脑上跑得好好的Qt程序&#xff0c;发给用户或者部署到现场后&#xff0c;时不时就“闪退”了。用户反馈过来&#xff0c;往往只有一句“程序突然就没了”&a…...

ASP.NET Core实战:静态文件中间件UseStaticFiles的深度配置与应用

1. 静态文件中间件&#xff1a;不只是为了显示一张图片 很多刚开始接触ASP.NET Core WebApi开发的朋友&#xff0c;可能会有一个疑问&#xff1a;我开发的是后端接口&#xff0c;主要处理数据逻辑&#xff0c;为什么需要关心图片、CSS这些静态文件呢&#xff1f;这个想法很自然…...

LKT4304加密芯片在工业PLC控制器中的安全应用案例

在工业自动化领域&#xff0c;可编程逻辑控制器&#xff08;PLC&#xff09;作为产线核心控制单元&#xff0c;其运行的控制程序直接决定设备动作逻辑与生产安全。然而&#xff0c;PLC固件常面临被逆向破解、非法复制或恶意篡改的风险——攻击者可能植入后门指令导致设备异常停…...

Python实战:低周疲劳试验数据可视化与滞回环分析

1. 从数据文件到第一张图&#xff1a;快速上手 如果你手头有一份低周疲劳试验的原始数据&#xff0c;比如一个CSV文件&#xff0c;里面密密麻麻记录着时间、应力、应变&#xff0c;你的第一反应可能是&#xff1a;“这数据怎么看&#xff1f;” 别急&#xff0c;用Python把它变…...

NumPy弃用警告全解析:如何正确处理ndim>0数组到标量的转换

1. 从一条恼人的警告说起&#xff1a;你的NumPy代码可能正在“踩雷” 最近在升级Python环境或者运行一些老项目的时候&#xff0c;你是不是也经常在控制台看到下面这行黄字警告&#xff1f;它不报错&#xff0c;程序也能跑&#xff0c;但就是像蚊子一样嗡嗡作响&#xff0c;让人…...

从CPU龟速到GPU起飞:Ollama调用CUDA加速本地大模型实战

1. 从龟速到崩溃&#xff1a;我的本地大模型初体验 那天晚上&#xff0c;我盯着屏幕上那个缓慢蠕动的进度条&#xff0c;感觉时间都凝固了。事情是这样的&#xff0c;我好不容易在本地电脑上部署了一个AI翻译工具&#xff0c;想让它帮我处理一篇8页的科技论文。工具跑起来了&am…...

SG-TCP-Profibus (M) ModbusTCP 转 Profibus DP 网关:工业双协议无缝互联的高效解决方案

在工业自动化系统集成与升级中&#xff0c;ModbusTCP 与 Profibus DP 两大主流工业协议的设备互通&#xff0c;是产线组网、设备联动的核心痛点。SG-TCP-Profibus (M) ModbusTCP 转 Profibus DP 网关专为工业现场跨协议通信设计&#xff0c;以数据映射式工作实现两大协议的双向…...

SG-TCP-COE-210 Modbus TCP 转 CANOpen 网关:跨协议工业通信的无缝互联方案

在工业自动化系统组网中&#xff0c;Modbus TCP 与 CANOpen 两大协议的设备互通&#xff0c;是产线集成、设备联动的常见痛点。SG-TCP-COE-210 Modbus TCP 转 CANOpen 协议网关&#xff0c;专为工业现场跨协议通信设计&#xff0c;在 Modbus TCP 侧为从站、CANOpen 侧为主站&am…...

SG-HF40-IOL IO-Link 高频工业 RFID 读写器:工业自动化的智能识别核心

在工业 4.0 浪潮下&#xff0c;自动化生产线、智能物流、资产管理等场景对物品的自动识别、数据实时交互提出了更高要求。SG-HF40-IOL IO-Link 协议高频工业 RFID 读写器凭借工业级的硬件设计、灵活的工作模式、稳定的通信能力&#xff0c;成为破解工业现场智能识别难题的优质解…...

SG_HART_Mod HART 转 Modbus 网关:工业协议转换的高效解决方案

在工业自动化系统搭建与升级过程中&#xff0c;HART 协议智能仪表与 Modbus 控制系统的互联互通&#xff0c;是实现设备数据采集、远程监控的关键环节。但因协议不兼容形成的 “通信壁垒”&#xff0c;往往成为工业现场数据流转的痛点。SG_HART_Mod HART 转 Modbus 网关凭借专业…...

约束优化求解利器:从罚函数到乘子法的演进与实践

1. 约束优化&#xff1a;当你的目标遇到了“条条框框” 大家好&#xff0c;我是老张&#xff0c;在AI和算法这行摸爬滚打了十几年&#xff0c;今天想和大家聊聊一个听起来有点“硬核”&#xff0c;但实际上无处不在的技术话题——约束优化。咱们先别被名字吓到&#xff0c;我保…...

告别Visual Studio:在VSCode中搭建MSVC+CMake一体化C++开发与调试环境

1. 为什么我要从Visual Studio“搬家”到VSCode&#xff1f; 干了这么多年C开发&#xff0c;Visual Studio&#xff08;VS&#xff09;一直是我的主力“重型武器”。它功能强大&#xff0c;开箱即用&#xff0c;特别是对MSVC编译器和Windows平台的支持&#xff0c;可以说是亲儿…...

【实战指南】Arduino驱动土壤湿度传感器:从基础读取到智能灌溉

1. 从零开始&#xff1a;为什么你需要一个自动灌溉系统&#xff1f; 嘿&#xff0c;朋友们&#xff0c;我是老陈&#xff0c;一个在智能硬件和自动化领域折腾了十多年的“老创客”。今天我们不聊那些高大上的概念&#xff0c;就聊聊一个特别实际的问题&#xff1a;你养的花花草…...

Charge Pump Design: From Fundamentals to Advanced Applications in Modern Electronics

1. 电荷泵到底是什么&#xff1f;从“水桶接力”说起 如果你玩过水桶接力的游戏&#xff0c;那理解电荷泵就成功了一半。想象一下&#xff0c;你有两个水桶&#xff08;电容&#xff09;和一个水泵&#xff08;开关&#xff09;。第一个水桶从低处的水井&#xff08;输入电源&a…...

STM32F4实战:从零搭建轻量级人脸识别门禁

1. 为什么选择STM32F4做你的第一个AI门禁&#xff1f; 大家好&#xff0c;我是老张&#xff0c;一个在嵌入式领域摸爬滚打了十多年的工程师。这些年&#xff0c;我见过太多朋友对AI、人脸识别这些“高大上”的技术望而却步&#xff0c;总觉得那是需要强大电脑或者昂贵开发板才能…...

CentOS7环境下Hive的完整部署与MySQL元数据配置实战

1. 环境准备&#xff1a;从零开始的基石搭建 大家好&#xff0c;我是老张&#xff0c;在数据平台这块摸爬滚打了十来年&#xff0c;今天咱们来聊聊怎么在CentOS7上把Hive给稳稳当当地装起来&#xff0c;并且把它的“大脑”——元数据&#xff0c;从自带的那个不太给力的Derby数…...

2.4G无线音频传输模块:高保真与低延迟的完美结合

1. 无线音频的“高速公路”&#xff1a;为什么是2.4G&#xff1f; 如果你最近在挑选无线麦克风、游戏耳机或者想给家里的音响系统“剪掉尾巴”&#xff0c;那你一定绕不开“2.4G”这个关键词。它听起来像个技术参数&#xff0c;但其实&#xff0c;它更像是一条为声音数据专门修…...

SystemC实战:深入解析sc_event与sc_event_finder在时序建模中的关键差异

1. 从一次仿真报错说起&#xff1a;为什么我的时钟敏感事件挂了&#xff1f; 最近在做一个RTL模块的SystemC建模&#xff0c;场景挺典型的&#xff0c;就是一个带有时钟输入的模块&#xff0c;需要在时钟上升沿触发一个SC_METHOD。我像往常一样&#xff0c;在模块的构造函数里写…...