Langchain 提示词(Prompt)

news2025/3/30 4:04:23

基本用法

1. 基本概念

提示词模板 是一个字符串模板,其中包含一些占位符(通常是 {variable} 形式的),这些占位符可以在运行时被实际值替换。LangChain 提供了多种类型的提示词模板,以适应不同的使用场景。

2. 主要类型

2.1 基础提示词模板 (Base Prompt Template)
  • 简介:最简单的提示词模板,直接定义一个字符串并支持变量替换。
  • 使用频率:非常高。

示例

from langchain.prompts import PromptTemplate

# 定义一个基础提示词模板
template = "你是一名专业的 {role},请回答以下问题:{question}"
prompt = PromptTemplate(
    input_variables=["role", "question"],
    template=template
)

# 使用模板生成具体的提示词
final_prompt = prompt.format(role="医生", question="感冒了怎么办?")
print(final_prompt)

输出

你是一名专业的 医生,请回答以下问题:感冒了怎么办?
2.2 多提示词模板 (Few Shot Prompt Template)
  • 简介:包含多个示例(shots),每个示例都是一对输入和输出。这种模板适用于需要通过示例来引导模型生成特定格式的输出。
  • 使用频率:中到高。

示例

from langchain.prompts import FewShotPromptTemplate
from langchain.prompts import PromptTemplate

# 定义示例
examples = [
    {"input": "你好", "output": "你好!有什么可以帮助你的吗?"},
    {"input": "再见", "output": "再见!祝你一天愉快!"}
]

# 定义每个示例的模板
example_template = """
用户: {input}
助手: {output}
"""

# 创建示例提示词模板
example_prompt = PromptTemplate(input_variables=["input", "output"], template=example_template)

# 创建多示例提示词模板
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="以下是一些对话示例:\n\n",
    suffix="\n\n用户: {input}\n助手:",
    input_variables=["input"],
    example_separator="\n\n"
)

# 使用模板生成具体的提示词
final_prompt = few_shot_prompt.format(input="谢谢")
print(final_prompt)

输出

以下是一些对话示例:

用户: 你好
助手: 你好!有什么可以帮助你的吗?

用户: 再见
助手: 再见!祝你一天愉快!

用户: 谢谢
助手:
2.3 动态提示词模板 (Dynamic Prompt Template)
  • 简介:允许在运行时动态生成提示词内容。可以结合其他逻辑或外部数据源。
  • 使用频率:中等。

示例

from langchain.prompts import DynamicPromptTemplate, PromptTemplate
from langchain.tools import BaseTool
from langchain.chains import LLMChain
from langchain.llms import OpenAI

# 定义一个动态提示词模板
class CustomPrompt(DynamicPromptTemplate):
    def format(self, **kwargs):
        # 动态生成提示词
        context = kwargs.get("context", "")
        if context:
            return f"根据以下上下文回答问题:{context}\n问题: {kwargs['question']}"
        else:
            return f"问题: {kwargs['question']}"

# 创建动态提示词模板实例
dynamic_prompt = CustomPrompt(
    input_variables=["context", "question"]
)

# 创建LLM链
llm = OpenAI(temperature=0.9)
chain = LLMChain(llm=llm, prompt=dynamic_prompt)

# 使用模板生成具体的提示词并执行链
response = chain.run({"context": "这是一个关于天气的问题", "question": "今天会下雨吗?"})
print(response)

输出

根据以下上下文回答问题:这是一个关于天气的问题
问题: 今天会下雨吗?

3. 高级用法

3.1 嵌套提示词模板 (Nested Prompt Templates)
  • 简介:可以在一个提示词模板中嵌套另一个提示词模板,从而实现更复杂的提示结构。
  • 使用频率:中等。

示例

from langchain.prompts import PromptTemplate

# 定义两个基础提示词模板
template1 = "你是一名专业的 {role},请回答以下问题:{question}"
prompt1 = PromptTemplate(
    input_variables=["role", "question"],
    template=template1
)

template2 = "以下是问题的详细描述:{description}"
prompt2 = PromptTemplate(
    input_variables=["description"],
    template=template2
)

# 嵌套提示词模板
nested_template = "{prompt1}\n{prompt2}"
nested_prompt = PromptTemplate(
    input_variables=["role", "question", "description"],
    template=nested_template
)

# 使用模板生成具体的提示词
final_prompt = nested_prompt.format(
    role="医生",
    question="感冒了怎么办?",
    description="患者有轻微的咳嗽和流鼻涕症状"
)
print(final_prompt)

输出

你是一名专业的 医生,请回答以下问题:感冒了怎么办?
以下是问题的详细描述:患者有轻微的咳嗽和流鼻涕症状

4. 总结

  • 基础提示词模板:适用于简单的提示词生成。
  • 多提示词模板:适用于通过示例来引导模型生成特定格式的输出。
  • 动态提示词模板:适用于需要在运行时动态生成提示词的情况。
  • 嵌套提示词模板:适用于更复杂的提示结构。

短期和长期记忆

好的,LangChain 的提示词模板(Prompt Templates)中,MessagesPlaceholder 以及短期记忆和长期记忆是非常重要的概念。它们可以帮助你更好地管理和利用对话的历史信息。下面我将详细介绍这些概念,并提供示例。

1. MessagesPlaceholder

MessagesPlaceholder 是 LangChain 中用于在提示词模板中插入消息列表的占位符。它通常与 ChatPromptTemplate 结合使用,可以动态地插入多条消息,从而生成更复杂的提示词。

使用频率
  • MessagesPlaceholder:中到高。特别是在需要处理多条消息或复杂对话结构的应用中非常重要。
示例
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.schema import SystemMessage, HumanMessage, AIMessage
from langchain.chat_models import ChatOpenAI

# 定义系统消息
system_message = SystemMessage(content="你是一名专业的医生。")

# 定义一个包含 MessagesPlaceholder 的提示词模板
prompt = ChatPromptTemplate.from_messages([
    system_message,
    MessagesPlaceholder(variable_name="chat_history"),
    HumanMessage(content="{input}")
])

# 创建聊天模型
llm = ChatOpenAI(temperature=0.9)

# 模拟一些历史消息
chat_history = [
    HumanMessage(content="你好,我感冒了。"),
    AIMessage(content="你好!请问你有哪些症状?"),
    HumanMessage(content="我有轻微的咳嗽和流鼻涕。")
]

# 生成具体的提示词
final_prompt = prompt.format_messages(chat_history=chat_history, input="还有其他建议吗?")
print(final_prompt)

输出

[<SystemMessage content='你是一名专业的医生。'>, <HumanMessage content='你好,我感冒了。'>, <AIMessage content='你好!请问你有哪些症状?'>, <HumanMessage content='我有轻微的咳嗽和流鼻涕。'>, <HumanMessage content='还有其他建议吗?'>]

2. 短期记忆(Short-Term Memory)

短期记忆通常用于存储最近几轮对话的信息。这对于保持对话的一致性和连贯性非常有用。LangChain 提供了几种不同类型的短期记忆实现,如 ConversationBufferMemoryConversationSummaryMemory

使用频率
  • 短期记忆:高。特别是在聊天机器人或客服助手等涉及连续交互的应用中非常重要。
示例
from langchain.memory import ConversationBufferMemory
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.chat_models import ChatOpenAI

# 定义系统消息
system_message = SystemMessage(content="你是一名专业的医生。")

# 定义一个包含 MessagesPlaceholder 的提示词模板
prompt = ChatPromptTemplate.from_messages([
    system_message,
    MessagesPlaceholder(variable_name="chat_history"),
    HumanMessage(content="{input}")
])

# 创建短期记忆实例
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

# 创建聊天模型
llm = ChatOpenAI(temperature=0.9)

# 创建LLM链
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt, memory=memory)

# 进行多轮对话
response1 = chain.predict(input="你好,我感冒了。")
print(response1)

response2 = chain.predict(input="我有轻微的咳嗽和流鼻涕。")
print(response2)

response3 = chain.predict(input="还有其他建议吗?")
print(response3)

输出

助手: 你好!请问你有哪些症状?
助手: 如果你有轻微的咳嗽和流鼻涕,建议多休息、多喝水,并可以考虑服用一些感冒药。如果症状严重,最好去看医生。
助手: 除了休息和喝水外,你可以吃一些富含维生素C的食物,比如柑橘类水果,这有助于增强免疫力。另外,保持室内空气流通也很重要。

3. 长期记忆(Long-Term Memory)

长期记忆用于存储较长时间内的对话信息或特定的知识库。这对于需要访问大量历史信息或知识的应用非常有用。LangChain 提供了一些长期记忆的实现,如 VectorStoreRetrieverMemory

使用频率
  • 长期记忆:中等。对于需要访问大量历史信息或知识的应用非常重要。
示例
from langchain.memory import VectorStoreRetrieverMemory
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.chat_models import ChatOpenAI

# 定义系统消息
system_message = SystemMessage(content="你是一名专业的医生。")

# 定义一个包含 MessagesPlaceholder 的提示词模板
prompt = ChatPromptTemplate.from_messages([
    system_message,
    MessagesPlaceholder(variable_name="chat_history"),
    HumanMessage(content="{input}")
])

# 创建嵌入模型
embeddings = OpenAIEmbeddings()

# 创建向量存储
vectorstore = FAISS.from_texts(["感冒的症状包括咳嗽、流鼻涕、发烧等。", "感冒的治疗方法包括多休息、多喝水、服用感冒药。"], embeddings)

# 创建长期记忆实例
retriever = vectorstore.as_retriever()
memory = VectorStoreRetrieverMemory(retriever=retriever, memory_key="chat_history")

# 创建聊天模型
llm = ChatOpenAI(temperature=0.9)

# 创建LLM链
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt, memory=memory)

# 进行对话
response = chain.predict(input="我感冒了,应该怎么办?")
print(response)

输出

助手: 如果你感冒了,建议多休息、多喝水,并可以考虑服用一些感冒药。如果症状严重,最好去看医生。

总结

  • MessagesPlaceholder:用于在提示词模板中插入消息列表,适用于处理多条消息或复杂对话结构。
  • 短期记忆:用于存储最近几轮对话的信息,保持对话的一致性和连贯性。
  • 长期记忆:用于存储较长时间内的对话信息或特定的知识库,适用于需要访问大量历史信息或知识的应用。

示例

在 LangChain 中,提示词中的示例(Examples in Prompts)是一种非常有用的技术,可以帮助模型更好地理解任务的要求。通过提供具体的示例,你可以指导模型生成更符合预期的输出。LangChain 提供了多种方式来实现这一点,包括使用 FewShotPromptTemplate 和手动构建示例。

1. FewShotPromptTemplate

FewShotPromptTemplate 是 LangChain 中专门用于处理示例提示词的类。它允许你定义一组示例,并将这些示例插入到提示词模板中。

使用频率
  • FewShotPromptTemplate:中到高。特别是在需要通过示例来指导模型的任务中非常重要。
示例
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelector
from langchain.chat_models import ChatOpenAI

# 定义示例
examples = [
    {"input": "你好", "output": "你好!有什么可以帮助你的吗?"},
    {"input": "我感冒了,怎么办?", "output": "如果你感冒了,建议多休息、多喝水,并可以考虑服用一些感冒药。如果症状严重,最好去看医生。"},
    {"input": "还有其他建议吗?", "output": "除了休息和喝水外,你可以吃一些富含维生素C的食物,比如柑橘类水果,这有助于增强免疫力。另外,保持室内空气流通也很重要。"}
]

# 定义每个示例的格式
example_template = """
输入: {input}
输出: {output}
"""

# 创建示例选择器
example_selector = LengthBasedExampleSelector(examples=examples, example_prompt=PromptTemplate(input_variables=["input", "output"], template=example_template), max_length=50)

# 定义基础提示词模板
base_template = """
你是一名专业的医生。
{examples}
输入: {input}
输出:
"""

# 创建 FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=PromptTemplate(input_variables=["input", "output"], template=example_template),
    prefix=base_template,
    suffix="",
    input_variables=["input"],
    example_separator="\n\n"
)

# 创建聊天模型
llm = ChatOpenAI(temperature=0.9)

# 生成具体的提示词
final_prompt = few_shot_prompt.format(input="我有轻微的咳嗽和流鼻涕。")
print(final_prompt)

输出

你是一名专业的医生。
输入: 你好
输出: 你好!有什么可以帮助你的吗?

输入: 我感冒了,怎么办?
输出: 如果你感冒了,建议多休息、多喝水,并可以考虑服用一些感冒药。如果症状严重,最好去看医生。

输入: 还有其他建议吗?
输出: 除了休息和喝水外,你可以吃一些富含维生素C的食物,比如柑橘类水果,这有助于增强免疫力。另外,保持室内空气流通也很重要。

输入: 我有轻微的咳嗽和流鼻涕。
输出:

2. 手动构建示例

除了使用 FewShotPromptTemplate,你也可以手动构建示例并将其插入到提示词模板中。这种方式更加灵活,但需要更多的手动工作。

使用频率
  • 手动构建示例:中等。适用于需要更多自定义和灵活性的情况。
示例
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI

# 定义示例
examples = [
    {"input": "你好", "output": "你好!有什么可以帮助你的吗?"},
    {"input": "我感冒了,怎么办?", "output": "如果你感冒了,建议多休息、多喝水,并可以考虑服用一些感冒药。如果症状严重,最好去看医生。"},
    {"input": "还有其他建议吗?", "output": "除了休息和喝水外,你可以吃一些富含维生素C的食物,比如柑橘类水果,这有助于增强免疫力。另外,保持室内空气流通也很重要。"}
]

# 将示例转换为字符串
example_strings = []
for example in examples:
    example_strings.append(f"输入: {example['input']}\n输出: {example['output']}")

examples_str = "\n\n".join(example_strings)

# 定义基础提示词模板
template = f"""
你是一名专业的医生。
{examples_str}
输入: {{input}}
输出:
"""

prompt = PromptTemplate(input_variables=["input"], template=template)

# 创建聊天模型
llm = ChatOpenAI(temperature=0.9)

# 生成具体的提示词
final_prompt = prompt.format(input="我有轻微的咳嗽和流鼻涕。")
print(final_prompt)

输出

你是一名专业的医生。
输入: 你好
输出: 你好!有什么可以帮助你的吗?

输入: 我感冒了,怎么办?
输出: 如果你感冒了,建议多休息、多喝水,并可以考虑服用一些感冒药。如果症状严重,最好去看医生。

输入: 还有其他建议吗?
输出: 除了休息和喝水外,你可以吃一些富含维生素C的食物,比如柑橘类水果,这有助于增强免疫力。另外,保持室内空气流通也很重要。

输入: 我有轻微的咳嗽和流鼻涕。
输出:

3. 动态示例选择

有时候,你可能希望根据输入的长度或其他条件动态选择示例。LangChain 提供了 LengthBasedExampleSelector 等工具来帮助你实现这一点。

使用频率
  • 动态示例选择:中等。适用于需要根据输入动态调整示例数量的情况。
示例
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelector
from langchain.chat_models import ChatOpenAI

# 定义示例
examples = [
    {"input": "你好", "output": "你好!有什么可以帮助你的吗?"},
    {"input": "我感冒了,怎么办?", "output": "如果你感冒了,建议多休息、多喝水,并可以考虑服用一些感冒药。如果症状严重,最好去看医生。"},
    {"input": "还有其他建议吗?", "output": "除了休息和喝水外,你可以吃一些富含维生素C的食物,比如柑橘类水果,这有助于增强免疫力。另外,保持室内空气流通也很重要。"}
]

# 定义每个示例的格式
example_template = """
输入: {input}
输出: {output}
"""

# 创建示例选择器
example_selector = LengthBasedExampleSelector(examples=examples, example_prompt=PromptTemplate(input_variables=["input", "output"], template=example_template), max_length=50)

# 定义基础提示词模板
base_template = """
你是一名专业的医生。
{examples}
输入: {input}
输出:
"""

# 创建 FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=PromptTemplate(input_variables=["input", "output"], template=example_template),
    prefix=base_template,
    suffix="",
    input_variables=["input"],
    example_separator="\n\n"
)

# 创建聊天模型
llm = ChatOpenAI(temperature=0.9)

# 生成具体的提示词
final_prompt = few_shot_prompt.format(input="我有轻微的咳嗽和流鼻涕。")
print(final_prompt)

输出

你是一名专业的医生。
输入: 你好
输出: 你好!有什么可以帮助你的吗?

输入: 我感冒了,怎么办?
输出: 如果你感冒了,建议多休息、多喝水,并可以考虑服用一些感冒药。如果症状严重,最好去看医生。

输入: 还有其他建议吗?
输出: 除了休息和喝水外,你可以吃一些富含维生素C的食物,比如柑橘类水果,这有助于增强免疫力。另外,保持室内空气流通也很重要。

输入: 我有轻微的咳嗽和流鼻涕。
输出:

4. 相似度示例

在 LangChain 中,使用相似度示例(Similarity Examples)是一种强大的技术,可以通过查找与输入最相似的历史示例来指导模型生成更准确的输出。这种技术通常结合向量存储和嵌入模型来实现。LangChain 提供了多种工具和类来支持这一功能,包括 VectorStoreRetrieverFewShotPromptTemplate

原理
  1. 嵌入模型:将文本转换为高维向量表示。
  2. 向量存储:存储这些向量,并提供高效的相似度搜索功能。
  3. 检索器:从向量存储中检索与输入最相似的示例。
  4. 提示词模板:将检索到的示例插入到提示词模板中,生成最终的提示词。
主要组件
  • 嵌入模型:如 OpenAIEmbeddingsHuggingFaceEmbeddings 等。
  • 向量存储:如 FAISSChromaPinecone 等。
  • 检索器:如 VectorStoreRetriever
  • 提示词模板:如 FewShotPromptTemplate
用法示例

下面是一个完整的示例,展示了如何在 LangChain 中实现基于相似度的示例提示词。

1. 安装必要的库

首先,确保你已经安装了必要的库:

pip install langchain openai faiss-cpu
2. 导入库
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
3. 创建嵌入模型和向量存储
# 创建嵌入模型
embeddings = OpenAIEmbeddings()

# 示例数据
examples = [
    {"input": "你好", "output": "你好!有什么可以帮助你的吗?"},
    {"input": "我感冒了,怎么办?", "output": "如果你感冒了,建议多休息、多喝水,并可以考虑服用一些感冒药。如果症状严重,最好去看医生。"},
    {"input": "还有其他建议吗?", "output": "除了休息和喝水外,你可以吃一些富含维生素C的食物,比如柑橘类水果,这有助于增强免疫力。另外,保持室内空气流通也很重要。"}
]

# 将示例转换为向量并存储
vectorstore = FAISS.from_texts([f"输入: {example['input']}\n输出: {example['output']}" for example in examples], embeddings)
4. 创建语义相似度示例选择器
# 创建语义相似度示例选择器
example_selector = SemanticSimilarityExampleSelector(vectorstore=vectorstore, k=2)

# 定义每个示例的格式
example_template = """
输入: {input}
输出: {output}
"""

# 创建 FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=PromptTemplate(input_variables=["input", "output"], template=example_template),
    prefix="你是一名专业的医生。\n{examples}",
    suffix="\n输入: {input}\n输出:",
    input_variables=["input"],
    example_separator="\n\n"
)
5. 创建聊天模型并生成提示词
# 创建聊天模型
llm = ChatOpenAI(temperature=0.9)

# 生成具体的提示词
final_prompt = few_shot_prompt.format(input="我有轻微的咳嗽和流鼻涕。")
print(final_prompt)
输出

假设 vectorstore 找到了两个最相似的示例,输出可能如下:

你是一名专业的医生。
输入: 我感冒了,怎么办?
输出: 如果你感冒了,建议多休息、多喝水,并可以考虑服用一些感冒药。如果症状严重,最好去看医生。

输入: 还有其他建议吗?
输出: 除了休息和喝水外,你可以吃一些富含维生素C的食物,比如柑橘类水果,这有助于增强免疫力。另外,保持室内空气流通也很重要。

输入: 我有轻微的咳嗽和流鼻涕。
输出:
详细解释
  1. 嵌入模型OpenAIEmbeddings 将文本转换为高维向量表示。
  2. 向量存储FAISS 存储这些向量,并提供高效的相似度搜索功能。
  3. 检索器SemanticSimilarityExampleSelectorFAISS 中检索与输入最相似的示例。
  4. 提示词模板FewShotPromptTemplate 将检索到的示例插入到提示词模板中,生成最终的提示词。
其他用法
1. 使用不同的向量存储

除了 FAISS,你还可以使用其他向量存储,如 ChromaPinecone。以下是使用 Chroma 的示例:

from langchain.vectorstores import Chroma

# 创建向量存储
vectorstore = Chroma.from_texts([f"输入: {example['input']}\n输出: {example['output']}" for example in examples], embeddings)
2. 使用不同的嵌入模型

除了 OpenAIEmbeddings,你还可以使用其他嵌入模型,如 HuggingFaceEmbeddings。以下是使用 HuggingFaceEmbeddings 的示例:

from langchain.embeddings import HuggingFaceEmbeddings

# 创建嵌入模型
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
3. 自定义示例选择逻辑

你可以自定义示例选择逻辑,例如根据特定条件选择示例。以下是一个简单的自定义示例选择器示例:

from langchain.prompts.example_selector.base import BaseExampleSelector

class CustomExampleSelector(BaseExampleSelector):
    def __init__(self, examples):
        self.examples = examples

    def select_examples(self, input_text):
        # 自定义选择逻辑
        selected_examples = [example for example in self.examples if "感冒" in example["input"]]
        return selected_examples

# 创建自定义示例选择器
custom_example_selector = CustomExampleSelector(examples=examples)

# 创建 FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
    example_selector=custom_example_selector,
    example_prompt=PromptTemplate(input_variables=["input", "output"], template=example_template),
    prefix="你是一名专业的医生。\n{examples}",
    suffix="\n输入: {input}\n输出:",
    input_variables=["input"],
    example_separator="\n\n"
)

# 生成具体的提示词
final_prompt = few_shot_prompt.format(input="我有轻微的咳嗽和流鼻涕。")
print(final_prompt)
总结
  • FewShotPromptTemplate:专门用于处理示例提示词,提供了自动选择和插入示例的功能。
  • 手动构建示例:通过手动构建示例并插入到提示词模板中,提供了更多的灵活性。
  • 动态示例选择:根据输入的长度或其他条件动态选择示例,使提示词更加灵活和适应性强。

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

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

相关文章

Axure RP 9.0教程: 基于动态面板的元件跟随来实现【音量滑块】

文章目录 引言I 音量滑块的实现步骤添加底层边框添加覆盖层基于覆盖层创建动态面板添加滑块按钮设置滑块拖动效果引言 音量滑块在播放器类APP应用场景相对较广,例如调节视频的亮度、声音等等。 I 音量滑块的实现步骤 添加底层边框 在画布中添加一个矩形框:500 x 32,圆…

WPF 与 C# 开发深度剖析

一、引言 在当今的软件开发领域&#xff0c;Windows 平台依旧占据着重要的地位。而 WPF&#xff08;Windows Presentation Foundation&#xff09;作为微软推出的一款强大的用户界面&#xff08;UI&#xff09;框架&#xff0c;为开发者提供了丰富的功能和灵活的设计方式&…

好消息!软航文档控件(NTKO WebOffice)在Chrome 133版本上提示扩展已停用的解决方案

软航文档控件现有版本依赖Manifest V2扩展技术支持才能正常运行&#xff0c;然而这个扩展技术到2025年6月在Chrome高版本上就彻底不支持了&#xff0c;现在Chrome 133开始的版本已经开始弹出警告&#xff0c;必须手工开启扩展支持才能正常运行。那么如何解决这个技术难题呢&…

通过仿真确定抗积分饱和策略的最佳系数

通过仿真确定抗积分饱和策略的最佳系数&#xff08;如PID参数 ( K_p, K_i, K_d ) 以及抗饱和参数 ( K_{\text{back}} )、积分限幅值等&#xff09;是一个系统化的过程。以下是具体步骤和示例&#xff1a; — 1. 建立仿真模型 1.1 模型组成 被控对象&#xff1a;例如电机、温…

消息队列(Kafka及RocketMQ等对比联系)

目录 消息队列 一、为什么使用消息队列&#xff1f;消息队列有什么优点/缺点&#xff1f;介绍下Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优点缺点&#xff0c;如何取舍&#xff1f; 1.公司业务场景是什么&#xff0c;这个业务场景有什么挑战&#xff0c;如果不用MQ有什么麻…

GitHub开源的容器管理面板-Dpanel

dpanel Docker安装部署二进制部署 GitHub官网 一块轻量化docker可视化管理面板&#xff0c;由国人开发&#xff0c;个人觉得是比较好用的&#xff0c;功能都很齐全&#xff0c;并且可以通过修改源码&#xff0c;自定义前端样式等。 Docker安装部署 官网 部署环境&#xff1…

【HarmonyOS Next】三天撸一个BLE调试精灵

【HarmonyOS Next】三天撸一个BLE调试精灵 一、功能介绍 BLE调试精灵APP属于工具类APP&#xff0c;在用户使用的过程中&#xff0c;负责调试BLE设备从机端&#xff0c;比如蓝牙耳机、低功耗设备、带有BLE的空调等设备&#xff0c;可以在页面中清晰看到设备的厂商&#xff0c;…

java 批量下载doc\excle\pdf

指定图片集合 下载到指定文件夹 import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.Arrays; import java.util.List;public class OfficeFileDownloader {/*** 需要下载的Office文档URL列表*/private static final List<Strin…

软件性能效率测试工具有哪些?专业第三方软件检测机构推荐

在软件开发的新时代&#xff0c;软件性能效率测试已经成为每个企业不可或缺的一部分。无论是在竞争激烈的市场中&#xff0c;还是在追求卓越用户体验的过程中&#xff0c;都需要进行有效的性能测试。 一、软件性能效率测试的目标   1、响应时间&#xff1a;确保用户请求的响…

使用flask_restful快速构建接口

Flask-RESTful 是一个用于快速构建 RESTful API 的 Flask 扩展。它简化了创建、管理和文档化 REST API 的过程。利用 Flask-RESTful&#xff0c;你可以更容易地将你的 Flask 应用程序组织成 RESTful 原则的风格 安装包 pip install flask_restful 快速构建接口 from flask im…

centos 7 部署FTP 服务用shell 搭建脚本,使用时稍微修改自己所需需求

#!/bin/bash # 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; then echo "此脚本需要以 root 用户身份运行。" exit 1 fi # 安装 vsftpd yum install vsftpd -y # 备份原始配置文件 cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd…

Hadoop集群搭建(hdfs、yarn)

Hadoop 是 Apache 软件基金会旗下的一个开源项目&#xff0c;是用于处理大数据的分布式系统基础架构&#xff0c;被广泛应用于大数据存储、处理和分析等场景。 一、核心组件 1、Hadoop 分布式文件系统&#xff08;HDFS&#xff09; 具有高容错性&#xff0c;能在低成本硬件上…

Keepalived 实现高可用方案

Keepalived简介 ‌Keepalived‌ 是一个基于 ‌VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;协议‌的高可用性解决方案&#xff0c;主要用于实现‌服务故障自动切换&#xff08;Failover&#xff09;和负载均衡‌。通过管理虚拟 IP&#xff08;VIP&#xf…

医学图像分割数据集肺分割数据labelme格式6299张2类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图像分辨率&#xff1a;1024x1024 图片数量(jpg文件个数)&#xff1a;6299 标注数量(json文件个数)&#xff1a;6299 标注类别数&#xff1a;2 标注类别名称:["leftl…

C语言复习笔记--函数递归

在学习了函数之后,函数递归是我们必然会接触到的课题,下面就让我们看下函数递归相关的知识. 递归是什么&#xff1f; 递归这个词看着就不那么好理解,那么什么是递归呢?递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数自己调用自己. 写⼀个史上最简单的C语⾔递归代码: …

husky的简介以及如果想要放飞自我的解决方案

husky 是一个 Git Hooks 管理工具&#xff0c;它的主要作用是 在 Git 提交&#xff08;commit&#xff09;、推送&#xff08;push&#xff09;等操作时执行自定义脚本&#xff0c;比如代码检查&#xff08;Lint&#xff09;、单元测试&#xff08;Test&#xff09;、格式化代码…

侯捷 C++ 课程学习笔记:现代 C++ 中的移动语义与完美转发深度解析

1. 前言&#xff1a;为什么我们需要移动语义&#xff1f; 在侯捷老师的《C11/14/17 新特性详解》课程中&#xff0c;移动语义&#xff08;Move Semantics&#xff09;被称作"C近十年来最重要的革新"。传统C中饱受诟病的深拷贝性能问题&#xff0c;在现代C中通过移动语…

23种设计模式-结构型模式-适配器

文章目录 简介场景问题解决方案建立中间转换层关键收益 总结 简介 使接口不兼容的类实现协同工作&#xff0c;通过引入中间层实现客户端接口和服务端接口的兼容。典型场景比如整合第三方类库或遗留系统时保持代码兼容。 场景 假设你正在开发一个股票监控程序。这个程序会下…

美亚科技业绩波动明显:现金流为负,四起未决诉讼涉金额1700万

《港湾商业观察》施子夫 近期&#xff0c;广东美亚旅游科技集团股份有限公司&#xff08;以下简称&#xff0c;美亚科技&#xff09;披露第二轮审核问询函的回复。从两轮问询函监管层提出的问题来看&#xff0c;有关美亚科技业绩增长的合理性、募投项目的必要性及合理性、经营…

PyTorch 深度学习实战(21):元强化学习与 MAML 算法

一、元强化学习原理 1. 元学习核心思想 元强化学习&#xff08;Meta-RL&#xff09;旨在让智能体快速适应新任务&#xff0c;其核心是通过任务分布学习共享知识。与传统强化学习的区别在于&#xff1a; 对比维度传统强化学习元强化学习目标解决单一任务快速适应任务分布中的…