Langchain 提示词(Prompt)
基本用法
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 提供了几种不同类型的短期记忆实现,如 ConversationBufferMemory 和 ConversationSummaryMemory。
使用频率
- 短期记忆:高。特别是在聊天机器人或客服助手等涉及连续交互的应用中非常重要。
示例
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 提供了多种工具和类来支持这一功能,包括 VectorStoreRetriever 和 FewShotPromptTemplate。
原理
- 嵌入模型:将文本转换为高维向量表示。
- 向量存储:存储这些向量,并提供高效的相似度搜索功能。
- 检索器:从向量存储中检索与输入最相似的示例。
- 提示词模板:将检索到的示例插入到提示词模板中,生成最终的提示词。
主要组件
- 嵌入模型:如
OpenAIEmbeddings、HuggingFaceEmbeddings等。 - 向量存储:如
FAISS、Chroma、Pinecone等。 - 检索器:如
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的食物,比如柑橘类水果,这有助于增强免疫力。另外,保持室内空气流通也很重要。输入: 我有轻微的咳嗽和流鼻涕。
输出:
详细解释
- 嵌入模型:
OpenAIEmbeddings将文本转换为高维向量表示。 - 向量存储:
FAISS存储这些向量,并提供高效的相似度搜索功能。 - 检索器:
SemanticSimilarityExampleSelector从FAISS中检索与输入最相似的示例。 - 提示词模板:
FewShotPromptTemplate将检索到的示例插入到提示词模板中,生成最终的提示词。
其他用法
1. 使用不同的向量存储
除了 FAISS,你还可以使用其他向量存储,如 Chroma 或 Pinecone。以下是使用 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 BaseExampleSelectorclass CustomExampleSelector(BaseExampleSelector):def __init__(self, examples):self.examples = examplesdef 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:专门用于处理示例提示词,提供了自动选择和插入示例的功能。
- 手动构建示例:通过手动构建示例并插入到提示词模板中,提供了更多的灵活性。
- 动态示例选择:根据输入的长度或其他条件动态选择示例,使提示词更加灵活和适应性强。
相关文章:
Langchain 提示词(Prompt)
基本用法 1. 基本概念 提示词模板 是一个字符串模板,其中包含一些占位符(通常是 {variable} 形式的),这些占位符可以在运行时被实际值替换。LangChain 提供了多种类型的提示词模板,以适应不同的使用场景。 2. 主要类…...
什么是PHP伪协议
PHP伪协议是一种特殊的URL格式,允许开发者以不同于传统文件路径访问和操作资源。以下是一些常见的PHP伪协议及其详细介绍: 常见的PHP伪协议 1. **file://** - **用途**:访问本地文件系统。 - **示例**:file:///path/to/file.txt。…...
python脚本处理excel文件
1.对比perl和python 分别尝试用perl和python处理excel文件,发现perl的比较复杂,比如说read excel就有很多方式 Spreadsheet::Read use Spreadsheet::ParseExcel 不同的method,对应的取sheet的cell方式也不一样。更复杂的是处理含有中文内…...
【腾讯云架构师技术沙龙2025.03.22】
大模型技术演进与行业影响分析 日期:2025年3月22日 主讲人:李建忠 《DeepSeek实战驱动行业智变—AI应用寒武纪》 整理:飞书语音转化DeepSeek分析汇总 一、技术演进:从快思考到慢思考 1. 早期争议与能力局限(2022-202…...
【SOC 芯片设计 DFT 学习专栏 -- IDDQ 测试 与 Burn-In 测试】
文章目录 IDDQ 测试与 Burn-In 测试IDDQ 测试工作原理测试过程优点局限性示例 2. Burn-In 测试工作原理测试过程优点局限性示例 总结对比 IDDQ 测试和 Burn-in 测试: IDDQ 测试与 Burn-In 测试 本文将详细介绍 DFT 中 IDDQ测试 和 burn-in测试模式 IDDQ 测试 IDD…...
Axure RP 9.0教程: 基于动态面板的元件跟随来实现【音量滑块】
文章目录 引言I 音量滑块的实现步骤添加底层边框添加覆盖层基于覆盖层创建动态面板添加滑块按钮设置滑块拖动效果引言 音量滑块在播放器类APP应用场景相对较广,例如调节视频的亮度、声音等等。 I 音量滑块的实现步骤 添加底层边框 在画布中添加一个矩形框:500 x 32,圆…...
JS—call,apply,bind:1分钟掌握三者的区别
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–call三–apply四–bind五–三者对比 二. call 作用: 立即调用函数,显式指定this值,并逐个传递参数。 语法: func.call(thisArg, arg1, arg2, …) 特点&…...
Linux TTY设备汇总
目录 1. tty(终端设备统称) 2. ptm(伪终端主设备)与pts(伪终端从设备) 3. ttys(串行端口终端) 4. ttyACM(USB CDC ACM设备) 5. ttyGS(USB Gadget Serial设备) 主要联系 典型应用场景 TTY_CORE: drivers/tty/tty_io.c:tty_register_driver…...
WPF 与 C# 开发深度剖析
一、引言 在当今的软件开发领域,Windows 平台依旧占据着重要的地位。而 WPF(Windows Presentation Foundation)作为微软推出的一款强大的用户界面(UI)框架,为开发者提供了丰富的功能和灵活的设计方式&…...
好消息!软航文档控件(NTKO WebOffice)在Chrome 133版本上提示扩展已停用的解决方案
软航文档控件现有版本依赖Manifest V2扩展技术支持才能正常运行,然而这个扩展技术到2025年6月在Chrome高版本上就彻底不支持了,现在Chrome 133开始的版本已经开始弹出警告,必须手工开启扩展支持才能正常运行。那么如何解决这个技术难题呢&…...
通过仿真确定抗积分饱和策略的最佳系数
通过仿真确定抗积分饱和策略的最佳系数(如PID参数 ( K_p, K_i, K_d ) 以及抗饱和参数 ( K_{\text{back}} )、积分限幅值等)是一个系统化的过程。以下是具体步骤和示例: — 1. 建立仿真模型 1.1 模型组成 被控对象:例如电机、温…...
消息队列(Kafka及RocketMQ等对比联系)
目录 消息队列 一、为什么使用消息队列?消息队列有什么优点/缺点?介绍下Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优点缺点,如何取舍? 1.公司业务场景是什么,这个业务场景有什么挑战,如果不用MQ有什么麻…...
GitHub开源的容器管理面板-Dpanel
dpanel Docker安装部署二进制部署 GitHub官网 一块轻量化docker可视化管理面板,由国人开发,个人觉得是比较好用的,功能都很齐全,并且可以通过修改源码,自定义前端样式等。 Docker安装部署 官网 部署环境࿱…...
【HarmonyOS Next】三天撸一个BLE调试精灵
【HarmonyOS Next】三天撸一个BLE调试精灵 一、功能介绍 BLE调试精灵APP属于工具类APP,在用户使用的过程中,负责调试BLE设备从机端,比如蓝牙耳机、低功耗设备、带有BLE的空调等设备,可以在页面中清晰看到设备的厂商,…...
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…...
软件性能效率测试工具有哪些?专业第三方软件检测机构推荐
在软件开发的新时代,软件性能效率测试已经成为每个企业不可或缺的一部分。无论是在竞争激烈的市场中,还是在追求卓越用户体验的过程中,都需要进行有效的性能测试。 一、软件性能效率测试的目标 1、响应时间:确保用户请求的响…...
使用flask_restful快速构建接口
Flask-RESTful 是一个用于快速构建 RESTful API 的 Flask 扩展。它简化了创建、管理和文档化 REST API 的过程。利用 Flask-RESTful,你可以更容易地将你的 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 软件基金会旗下的一个开源项目,是用于处理大数据的分布式系统基础架构,被广泛应用于大数据存储、处理和分析等场景。 一、核心组件 1、Hadoop 分布式文件系统(HDFS) 具有高容错性,能在低成本硬件上…...
PyArrow 和 Parquet 的组合通过内存优化和高效存储,显著提升大数据处理的性能
PyArrow 和 Apache Parquet 是处理大规模数据的高效工具组合,它们结合了内存优化和列式存储的优势,适用于多种大数据场景。以下是对两者的详细解析及其协同工作的方式: ### 1. **PyArrow 的核心作用** - **Apache Arrow 实现**࿱…...
Oracle数据库服务器地址变更与监听配置修改完整指南
一、前言 在企业IT运维中,Oracle数据库服务器地址变更是常见的运维操作。本文将详细介绍如何安全、高效地完成Oracle数据库服务器地址变更及相关的监听配置修改工作,确保数据库服务在迁移后能够正常运行。 二、准备工作 1. 环境检查 确认新旧服务器I…...
2025.03.23【前沿工具】| CellPhoneDB:基因网络分析与可视化的利器
文章目录 1. CellPhoneDB工具简介2. CellPhoneDB的安装方法3. CellPhoneDB常用命令 1. CellPhoneDB工具简介 在单细胞生物学的迅猛发展中,理解细胞间的通讯机制对于揭示组织功能和疾病状态至关重要。CellPhoneDB工具,作为一个专门设计用来分析单细胞转录…...
Keepalived 实现高可用方案
Keepalived简介 Keepalived 是一个基于 VRRP(Virtual Router Redundancy Protocol)协议的高可用性解决方案,主要用于实现服务故障自动切换(Failover)和负载均衡。通过管理虚拟 IP(VIP…...
如何使用DeepSeek编写测试用例?
一、DeepSeek在测试用例设计中的定位 DeepSeek作为AI工具,并非直接替代测试设计,而是通过以下方式提升效率: 快速生成基础用例框架(等价类、边界值等) 智能补充易遗漏场景(如特殊字符、异常流) 自动化脚本片段生成(Python/pytest/JUnit等) 测试数据构造建议(符合业务…...
python暴力破解html表单
import requests import time# 目标URL url "http://192.168.3.101/pikachu/vul/burteforce/bf_form.php" # 请替换为实际的目标URL# 已知的用户名 username "admin"# 密码字典文件路径 password_file "passwords.txt"# 伪造请求头ÿ…...
医学图像分割数据集肺分割数据labelme格式6299张2类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图像分辨率:1024x1024 图片数量(jpg文件个数):6299 标注数量(json文件个数):6299 标注类别数:2 标注类别名称:["leftl…...
C语言复习笔记--函数递归
在学习了函数之后,函数递归是我们必然会接触到的课题,下面就让我们看下函数递归相关的知识. 递归是什么? 递归这个词看着就不那么好理解,那么什么是递归呢?递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数自己调用自己. 写⼀个史上最简单的C语⾔递归代码: …...
Day39 | 724. 寻找数组的中心下标、34. 在排序数组中查找元素的第一个和最后一个位置、922. 按奇偶排序数组 II、35. 搜索插入位置
724. 寻找数组的中心下标 题目链接:724. 寻找数组的中心下标 - 力扣(LeetCode) 题目难度:简单 代码: class Solution {public int pivotIndex(int[] nums) {int sum0;for(int i0;i<nums.length;i){sumnums[i];}…...
husky的简介以及如果想要放飞自我的解决方案
husky 是一个 Git Hooks 管理工具,它的主要作用是 在 Git 提交(commit)、推送(push)等操作时执行自定义脚本,比如代码检查(Lint)、单元测试(Test)、格式化代码…...
怎么查看linux是Ubuntu还是centos
要确定你的Linux系统是基于Ubuntu还是CentOS,可以通过几种不同的方法来进行判断。下面是一些常用的方法: 要快速判断 Linux 系统是 Ubuntu 还是 CentOS,可通过以下方法综合验证: 一、查看系统信息文件 1. /etc/os-release 文件…...
