Prompt Engineering 提示工程

一、什么是提示工程(Prompt Engineering)

  Prompt 就是发给大模型的指令,比如讲个笑话、用 Python 编个贪吃蛇游戏等;大模型只接受一种输入,那就是 prompt。本质上,所有大模型相关的工程工作,都是围绕 prompt 展开的;提示工程门槛低天花板高。高质量prompt的核心要点:具体、丰富、少歧义

1.1、prompt的典型构成

角色:给AI定义一个最匹配任务角色,比如:你是一位数学老师,你是一名软件工程师等
指示:对任务进行描述
上下文:给出与任务相关的其它背景信息
例子:必要时给出举例
输入:任务的输入信息
输出:输出的格式描述

1.2、对话系统的基本模块和思路

1、把输入的自然语音对话,转成结构化的信息NLU
2、用传统软件手段处理结构化信息,得到处理策略
3、把策略转成自然语言输出NLG
在这里插入图片描述
对话流程举例:
在这里插入图片描述
改变习惯,优先用prompt解决问题,用好prompt可以减轻后续处理的工作量和复杂度。
重点:我们发给大模型的prompt,不会改变大模型的权重

1.3、用prompt实现逐步调优

# 导入依赖库
from openai import OpenAI
# 初始化 OpenAI 客户端
client = OpenAI(api_key="sk-...",base_url='https:....')# 默认使用环境变量中的 OPENAI_API_KEY 和 OPENAI_BASE_URLdef get_completion(prompt, response_format="text", model="gpt-3.5-turbo"):messages = [{"role": "user", "content": prompt}]    # 将 prompt 作为用户输入response = client.chat.completions.create(model=model,messages=messages,temperature=0,                                  # 模型输出的随机性,0 表示随机性最小response_format={"type": response_format},     # 返回消息的格式,text 或 json_object)return response.choices[0].message.content          # 返回模型生成的文本# 任务描述
instruction = """
你的任务是识别用户对手机流量套餐产品的选择条件。
每种流量套餐产品包含三个属性:名称,月费价格,月流量。
根据用户输入,识别用户在上述三种属性上的需求是什么。
"""
# 用户输入
input_text = """
办个100G的套餐。
"""
# prompt 模版。instruction 和 input_text 会被替换为上面的内容
prompt = f"""
{instruction}用户输入:
{input_text}
"""
# 调用大模型
response = get_completion(prompt)
print(response)

在这里插入图片描述

# 输出格式
output_format = """
以 JSON 格式输出
"""
# 稍微调整下咒语,加入输出格式
prompt = f"""
{instruction}
{output_format}
用户输入:
{input_text}
"""
# 调用大模型
response = get_completion(prompt, response_format="json_object")
print(response)

在这里插入图片描述

1.实现一个NLU
# 任务描述
instruction = """
你的任务是识别用户对手机流量套餐产品的选择条件。
每种流量套餐产品包含三个属性:名称,月费价格,月流量。
根据用户输入,识别用户在上述三种属性上的需求是什么。
"""
# 用户输入
input_text = """
办个100G的套餐。
"""
# prompt 模版。instruction 和 input_text 会被替换为上面的内容
prompt = f"""
{instruction}
用户输入:
{input_text}
"""
# 调用大模型
response = get_completion(prompt)
print(response)

在这里插入图片描述

2.约定输出格式
# 任务描述增加了字段的英文标识符
instruction = """
你的任务是识别用户对手机流量套餐产品的选择条件。
每种流量套餐产品包含三个属性:名称(name),月费价格(price),月流量(data)。
根据用户输入,识别用户在上述三种属性上的需求是什么。
"""# 输出格式增加了各种定义、约束
output_format = """
以JSON格式输出。
1. name字段的取值为string类型,取值必须为以下之一:经济套餐、畅游套餐、无限套餐、校园套餐 或 null;
2. price字段的取值为一个结构体 或 null,包含两个字段:
(1) operator, string类型,取值范围:'<='(小于等于), '>=' (大于等于), '=='(等于)
(2) value, int类型
3. data字段的取值为取值为一个结构体 或 null,包含两个字段:
(1) operator, string类型,取值范围:'<='(小于等于), '>=' (大于等于), '=='(等于)
(2) value, int类型或string类型,string类型只能是'无上限'
4. 用户的意图可以包含按price或data排序,以sort字段标识,取值为一个结构体:
(1) 结构体中以"ordering"="descend"表示按降序排序,以"value"字段存储待排序的字段
(2) 结构体中以"ordering"="ascend"表示按升序排序,以"value"字段存储待排序的字段
输出中只包含用户提及的字段,不要猜测任何用户未直接提及的字段,不输出值为null的字段。
"""input_text = "办个100G以上的套餐"
# input_text = "有没有便宜的套餐"prompt = f"""
{instruction}
{output_format}
用户输入:
{input_text}
"""
response = get_completion(prompt, response_format="json_object")
print(response)

在这里插入图片描述

3.把输出格式定义更精细
examples = """
便宜的套餐:{"sort":{"ordering"="ascend","value"="price"}}
有没有不限流量的:{"data":{"operator":"==","value":"无上限"}}
流量大的:{"sort":{"ordering"="descend","value"="data"}}
100G以上流量的套餐最便宜的是哪个:{"sort":{"ordering"="ascend","value"="price"},"data":{"operator":">=","value":100}}
月费不超过200的:{"price":{"operator":"<=","value":200}}
就要月费180那个套餐:{"price":{"operator":"==","value":180}}
经济套餐:{"name":"经济套餐"}
土豪套餐:{"name":"无限套餐"}
"""
input_text = "有没有土豪套餐"
# input_text = "办个200G的套餐"
# input_text = "有没有流量大的套餐"
# input_text = "200元以下,流量大的套餐有啥"
# input_text = "你说那个10G的套餐,叫啥名字"
# 有了例子
prompt = f"""
{instruction}
{output_format}
例如:
{examples}
用户输入:
{input_text}
"""
response = get_completion(prompt, response_format="json_object")
print(response)

在这里插入图片描述

4.加入例子

例子可以让输出更稳定:答错的,一定给例子;答对了,也给例子,能更稳定。

instruction = """
你的任务是识别用户对手机流量套餐产品的选择条件。
每种流量套餐产品包含三个属性:名称(name),月费价格(price),月流量(data)。
根据对话上下文,识别用户在上述三种属性上的需求是什么。识别结果要包含整个对话的信息。
"""# 输出描述
output_format = """
以JSON格式输出。
1. name字段的取值为string类型,取值必须为以下之一:经济套餐、畅游套餐、无限套餐、校园套餐 或 null;2. price字段的取值为一个结构体 或 null,包含两个字段:
(1) operator, string类型,取值范围:'<='(小于等于), '>=' (大于等于), '=='(等于)
(2) value, int类型3. data字段的取值为取值为一个结构体 或 null,包含两个字段:
(1) operator, string类型,取值范围:'<='(小于等于), '>=' (大于等于), '=='(等于)
(2) value, int类型或string类型,string类型只能是'无上限'4. 用户的意图可以包含按price或data排序,以sort字段标识,取值为一个结构体:
(1) 结构体中以"ordering"="descend"表示按降序排序,以"value"字段存储待排序的字段
(2) 结构体中以"ordering"="ascend"表示按升序排序,以"value"字段存储待排序的字段输出中只包含用户提及的字段,不要猜测任何用户未直接提及的字段。不要输出值为null的字段。
"""# 多轮对话的例子
examples = """
客服:有什么可以帮您
用户:100G套餐有什么
{"data":{"operator":">=","value":100}}
客服:有什么可以帮您
用户:100G套餐有什么
客服:我们现在有无限套餐,不限流量,月费300元
用户:太贵了,有200元以内的不
{"data":{"operator":">=","value":100},"price":{"operator":"<=","value":200}}
客服:有什么可以帮您
用户:便宜的套餐有什么
客服:我们现在有经济套餐,每月50元,10G流量
用户:100G以上的有什么{"data":{"operator":">=","value":100},"sort":{"ordering"="ascend","value"="price"}}客服:有什么可以帮您
用户:100G以上的套餐有什么
客服:我们现在有畅游套餐,流量100G,月费180元
用户:流量最多的呢
{"sort":{"ordering"="descend","value"="data"},"data":{"operator":">=","value":100}}
"""
input_text = "哪个便宜"
# input_text = "无限量哪个多少钱"
# input_text = "流量最大的多少钱"
# 多轮对话上下文
context = f"""
客服:有什么可以帮您
用户:有什么100G以上的套餐推荐
客服:我们有畅游套餐和无限套餐,您有什么价格倾向吗
用户:{input_text}
"""
prompt = f"""
{instruction}
{output_format}
{examples}
{context}
"""
response = get_completion(prompt, response_format="json_object")
print(response)

在这里插入图片描述

5.实现对话策略和NLG
import json
import copy
from openai import OpenAIinstruction = """
你的任务是识别用户对手机流量套餐产品的选择条件。
每种流量套餐产品包含三个属性:名称(name),月费价格(price),月流量(data)。
根据用户输入,识别用户在上述三种属性上的需求是什么。
"""# 输出格式
output_format = """
以JSON格式输出。
1. name字段的取值为string类型,取值必须为以下之一:经济套餐、畅游套餐、无限套餐、校园套餐 或 null;2. price字段的取值为一个结构体 或 null,包含两个字段:
(1) operator, string类型,取值范围:'<='(小于等于), '>=' (大于等于), '=='(等于)
(2) value, int类型3. data字段的取值为取值为一个结构体 或 null,包含两个字段:
(1) operator, string类型,取值范围:'<='(小于等于), '>=' (大于等于), '=='(等于)
(2) value, int类型或string类型,string类型只能是'无上限'4. 用户的意图可以包含按price或data排序,以sort字段标识,取值为一个结构体:
(1) 结构体中以"ordering"="descend"表示按降序排序,以"value"字段存储待排序的字段
(2) 结构体中以"ordering"="ascend"表示按升序排序,以"value"字段存储待排序的字段输出中只包含用户提及的字段,不要猜测任何用户未直接提及的字段。
DO NOT OUTPUT NULL-VALUED FIELD! 确保输出能被json.loads加载。
"""examples = """
便宜的套餐:{"sort":{"ordering"="ascend","value"="price"}}
有没有不限流量的:{"data":{"operator":"==","value":"无上限"}}
流量大的:{"sort":{"ordering"="descend","value"="data"}}
100G以上流量的套餐最便宜的是哪个:{"sort":{"ordering"="ascend","value"="price"},"data":{"operator":">=","value":100}}
月费不超过200的:{"price":{"operator":"<=","value":200}}
就要月费180那个套餐:{"price":{"operator":"==","value":180}}
经济套餐:{"name":"经济套餐"}
土豪套餐:{"name":"无限套餐"}
"""class NLU:def __init__(self):self.prompt_template = f"""{instruction}\n\n{output_format}\n\n{examples}\n\n用户输入:\n__INPUT__"""def _get_completion(self, prompt, model="gpt-3.5-turbo"):messages = [{"role": "user", "content": prompt}]response = client.chat.completions.create(model=model,messages=messages,temperature=0,  # 模型输出的随机性,0 表示随机性最小response_format={"type": "json_object"},)semantics = json.loads(response.choices[0].message.content)return {k: v for k, v in semantics.items() if v}def parse(self, user_input):prompt = self.prompt_template.replace("__INPUT__", user_input)return self._get_completion(prompt)class DST:def __init__(self):passdef update(self, state, nlu_semantics):if "name" in nlu_semantics:state.clear()if "sort" in nlu_semantics:slot = nlu_semantics["sort"]["value"]if slot in state and state[slot]["operator"] == "==":del state[slot]for k, v in nlu_semantics.items():state[k] = vreturn stateclass MockedDB:def __init__(self):self.data = [{"name": "经济套餐", "price": 50, "data": 10, "requirement": None},{"name": "畅游套餐", "price": 180, "data": 100, "requirement": None},{"name": "无限套餐", "price": 300, "data": 1000, "requirement": None},{"name": "校园套餐", "price": 150, "data": 200, "requirement": "在校生"},]def retrieve(self, **kwargs):records = []for r in self.data:select = Trueif r["requirement"]:if "status" not in kwargs or kwargs["status"] != r["requirement"]:continuefor k, v in kwargs.items():if k == "sort":continueif k == "data" and v["value"] == "无上限":if r[k] != 1000:select = Falsebreakif "operator" in v:if not eval(str(r[k])+v["operator"]+str(v["value"])):select = Falsebreakelif str(r[k]) != str(v):select = Falsebreakif select:records.append(r)if len(records) <= 1:return recordskey = "price"reverse = Falseif "sort" in kwargs:key = kwargs["sort"]["value"]reverse = kwargs["sort"]["ordering"] == "descend"return sorted(records, key=lambda x: x[key], reverse=reverse)class DialogManager:def __init__(self, prompt_templates):self.state = {}self.session = [{"role": "system","content": "你是一个手机流量套餐的客服代表,你叫小智。可以帮助用户选择最合适的流量套餐产品。"}]self.nlu = NLU()self.dst = DST()self.db = MockedDB()self.prompt_templates = prompt_templatesdef _wrap(self, user_input, records):if records:prompt = self.prompt_templates["recommand"].replace("__INPUT__", user_input)r = records[0]for k, v in r.items():prompt = prompt.replace(f"__{k.upper()}__", str(v))else:prompt = self.prompt_templates["not_found"].replace("__INPUT__", user_input)for k, v in self.state.items():if "operator" in v:prompt = prompt.replace(f"__{k.upper()}__", v["operator"]+str(v["value"]))else:prompt = prompt.replace(f"__{k.upper()}__", str(v))return promptdef _call_chatgpt(self, prompt, model="gpt-3.5-turbo"):session = copy.deepcopy(self.session)session.append({"role": "user", "content": prompt})response = client.chat.completions.create(model=model,messages=session,temperature=0,)return response.choices[0].message.contentdef run(self, user_input):# 调用NLU获得语义解析semantics = self.nlu.parse(user_input)print("===semantics===")print(semantics)# 调用DST更新多轮状态self.state = self.dst.update(self.state, semantics)print("===state===")print(self.state)# 根据状态检索DB,获得满足条件的候选records = self.db.retrieve(**self.state)# 拼装prompt调用chatgptprompt_for_chatgpt = self._wrap(user_input, records)print("===gpt-prompt===")print(prompt_for_chatgpt)# 调用chatgpt获得回复response = self._call_chatgpt(prompt_for_chatgpt)# 将当前用户输入和系统回复维护入chatgpt的sessionself.session.append({"role": "user", "content": user_input})self.session.append({"role": "assistant", "content": response})return response

加入垂直知识:加入指定情况夏的回答模板,话术更专业。

prompt_templates = {"recommand": "用户说:__INPUT__ \n\n向用户介绍如下产品:__NAME__,月费__PRICE__元,每月流量__DATA__G。","not_found": "用户说:__INPUT__ \n\n没有找到满足__PRICE__元价位__DATA__G流量的产品,询问用户是否有其他选择倾向。"
}dm = DialogManager(prompt_templates)
# 两轮对话
print("# Round 1")
response = dm.run("300太贵了,200元以内有吗")
print("===response===")
print(response)print("# Round 2")
response = dm.run("流量大的")
print("===response===")
print(response)

在这里插入图片描述
增加约束:改变语气、口吻等风格

# 定义语气要求。"NO COMMENTS. NO ACKNOWLEDGEMENTS."是常用 prompt,表示「有事儿说事儿,别 bb」
ext = "很口语,亲切一些。不用说“抱歉”。直接给出回答,不用在前面加“小瓜说:”。NO COMMENTS. NO ACKNOWLEDGEMENTS."
prompt_templates = {k: v+ext for k, v in prompt_templates.items()}
dm = DialogManager(prompt_templates)response = dm.run("300太贵了,200元以内有吗")
response = dm.run("流量大的")
print("===response===")
print(response)

在这里插入图片描述
实现统一口径,用例子实现。

ext = "\n\n遇到类似问题,请参照以下回答:\n问:流量包太贵了\n答:亲,我们都是全省统一价哦。"
prompt_templates = {k: v+ext for k, v in prompt_templates.items()}
dm = DialogManager(prompt_templates)response = dm.run("这流量包太贵了")
print("===response===")
print(response)

在这里插入图片描述

6.纯api实现
import json
from openai import OpenAIdef print_json(data):"""打印参数。如果参数是有结构的(如字典或列表),则以格式化的 JSON 形式打印;否则,直接打印该值。"""if hasattr(data, 'model_dump_json'):data = json.loads(data.model_dump_json())if (isinstance(data, (list, dict))):print(json.dumps(data,indent=4,ensure_ascii=False))else:print(data)# 定义消息历史。先加入 system 消息,里面放入对话内容以外的 prompt
messages = [{"role": "system","content": """
你是一个手机流量套餐的客服代表,你叫小瓜。可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括:
经济套餐,月费50元,10G流量;
畅游套餐,月费180元,100G流量;
无限套餐,月费300元,1000G流量;
校园套餐,月费150元,200G流量,仅限在校生。
"""}
]def get_completion(prompt, model="gpt-3.5-turbo"):# 把用户输入加入消息历史messages.append({"role": "user", "content": prompt})response = client.chat.completions.create(model=model,messages=messages,temperature=0.7,)msg = response.choices[0].message.content# 把模型生成的回复加入消息历史。很重要,否则下次调用模型时,模型不知道上下文messages.append({"role": "assistant", "content": msg})return msg
get_completion("流量最大的套餐是什么?")
get_completion("多少钱?")
get_completion("给我办一个")
print_json(messages)

在这里插入图片描述

1.4、进阶技巧

(1)思维链
1.让 AI 生成更多相关的内容,构成更丰富的上文,从而提升下文正确的概率
2.对涉及计算和逻辑推理等复杂问题,尤为有效
方法:提示词中加入如:请一步一步分析以下对话;请仔细一步步想想等。
(2)自洽性
一种对抗幻觉的手段。就像我们做数学题,要多次验算一样。
同样 prompt 跑多次,通过投票选出最终结果。

from openai import OpenAIdef get_completion(prompt, model="gpt-3.5-turbo"):messages = [{"role": "user", "content": prompt}]response = client.chat.completions.create(model=model,messages=messages,temperature=0.9,    # 必须加大随机性)return response.choices[0].message.contentinstruction = """
给定一段用户与手机流量套餐客服的对话,。
你的任务是判断客服介绍产品信息的准确性:当向用户介绍流量套餐产品时,客服人员必须准确提及产品名称、月费价格和月流量总量。上述信息缺失一项或多项,或信息与实时不符,都算信息不准确已知产品包括:经济套餐:月费50元,月流量10G
畅游套餐:月费180元,月流量100G
无限套餐:月费300元,月流量1000G
校园套餐:月费150元,月流量200G,限在校学生办理
"""# 输出描述
output_format = """
如果信息准确,输出:Y
如果信息不准确,输出:N
"""context = """
用户:你们有什么流量大的套餐
客服:您好,我们现在正在推广无限套餐,每月300元就可以享受1000G流量,您感兴趣吗
"""cot = "请一步一步分析以下对话"prompt = f"""
{instruction}{output_format}{cot}对话记录:
{context}
"""# 连续调用 5 次
for _ in range(5):print(f"------第{_+1}次------")response = get_completion(prompt)print(response)

在这里插入图片描述

二、提示工程经验总结

1、别急着上代码,先尝试用 prompt 解决;
2、别迷信 prompt,合理组合传统方法提升确定性,减少幻觉;
3、定义角色、给例子是最常用的技巧;
4、必要时上思维链,结果更准确;
5、防御 prompt 攻击非常重要,但很难。

三、OpenAI API 的几个重要参数

def get_chat_completion(session, user_prompt, model="gpt-3.5-turbo"):session.append({"role": "user", "content": user_prompt})response = client.chat.completions.create(model=model,messages=session,# 以下默认值都是官方默认值temperature=1,          # 生成结果的多样性。取值 0~2 之间,越大越发散,越小越收敛seed=None,              # 随机数种子。指定具体值后,temperature 为 0 时,每次生成的结果都一样stream=False,           # 数据流模式,一个字一个字地接收response_format={"type": "text"},  # 返回结果的格式,json_object 或 texttop_p=1,                # 随机采样时,只考虑概率前百分之多少的 token。不建议和 temperature 一起使用n=1,                    # 一次返回 n 条结果max_tokens=100,         # 每条结果最多几个 token(超过截断)presence_penalty=0,     # 对出现过的 token 的概率进行降权frequency_penalty=0,    # 对出现过的 token 根据其出现过的频次,对其的概率进行降权logit_bias={},          # 对指定 token 的采样概率手工加/降权,不常用)msg = response.choices[0].message.contentreturn msg

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫指南——初学者避坑篇

目录 Python爬虫初学者学习指南一、学习方向二、Python爬虫知识点总结三、具体知识点详解和实现步骤1. HTTP请求和HTML解析2. 正则表达式提取数据3. 动态内容爬取4. 数据存储5. 反爬虫应对措施 四、完整案例&#xff1a;爬取京东商品信息1. 导入库和设置基本信息2. 获取网页内容…

微搭低代码入门01变量

目录 1 变量的定义2 变量的赋值3 变量的类型4 算术运算符5 字符串的连接6 模板字符串7 检查变量的类型8 解构赋值8.1 数组的解构赋值8.2 对象的解构赋值 9 类型转换9.1 转换为字符串9.2 转换为数字9.3 转换为布尔值 总结 好些零基础的同学&#xff0c;在使用低代码的时候&#…

FPGA学习笔记#5 Vitis HLS For循环的优化(1)

本笔记使用的Vitis HLS版本为2022.2&#xff0c;在windows11下运行&#xff0c;仿真part为xcku15p_CIV-ffva1156-2LV-e&#xff0c;主要根据教程&#xff1a;跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 从这一篇开始正式进入HLS对C代码的优化笔记 学习笔记&#xff1a;《…

每日OJ题_牛客_JZ38字符串的排列_DFS_C++_Java

目录 牛客_JZ38字符串的排列_DFS 题目解析 C代码 Java代码 牛客_JZ38字符串的排列_DFS 字符串的排列_牛客题霸_牛客网 描述&#xff1a; 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入…

markdown常用语法

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

CSS教程(二)- CSS选择器

1. 作用 匹配文档中的某些元素为其应用样式。根据不同需求把不同的标签选出来。 2. 分类 分类 基础选择器 包含 标签选择器、ID选择器、类选择器、通用选择器等 复合选择器 包含 后代选择器、子代选择器、伪类选择器等 1 标签选择器 介绍 又称为元素选择器&#xff0c;根…

第二十周学习周报

目录 摘要abstractTheory behind GANGAN训练目标GAN训练技巧 总结 摘要 本周的学习内容是GAN的基本理论&#xff0c;在训练GAN的时候&#xff0c;Generator的目标是希望生成的数据与真实的数据越相似越好&#xff0c;而Discriminator的目标是尽量将生成的数据与真实的数据区分…

2024年CRM系统对比:国内外十大CRM热门选择

在数字化转型的大潮中&#xff0c;CRM系统是企业提升客户关系管理、优化销售流程的重要工具。本文将从系统功能、优势、劣势、总体评价四个方面&#xff0c;对2024年国内外十大热门CRM系统进行全方位对比&#xff0c;帮助企业找到最适合的CRM解决方案。 1.纷享销客CRM 系统功…

VideoChat:开源的数字人实时对话系统,支持自定义数字人的形象和音色

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

[CKS] TLS Secrets创建与挂载

目前的所有题目为2024年10月后更新的最新题库&#xff0c;考试的k8s版本为1.31.1 BackGround 您必须使用存储在TLS Secret中的SSL文件&#xff0c;来保护Web 服务器的安全访问。 Task 在clever-cactus namespace中为名为clever-cactus的现有Deployment创建名为clever-cactu…

使用 wxPython 开发 Python 桌面应用程序的完整教程

使用 wxPython 开发 Python 桌面应用程序的完整教程 引言 在当今的软件开发领域&#xff0c;桌面应用程序仍然占据着重要的位置。Python 作为一种灵活且易于学习的编程语言&#xff0c;结合 wxPython 库&#xff0c;可以快速构建跨平台的桌面应用程序。本文将深入探讨 wxPyth…

自动驾驶系列—自动驾驶环境感知:Radar数据的应用与实践

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

DimensionX:从单张图片生成高度逼真的 3D 和 4D 场景

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

蓝桥杯备考——算法

一、排序 冒泡排序、选择排序、插入排序、 快速排序、归并排序、桶排序 二、枚举 三、二分查找与二分答案 四、搜索&#xff08;DFS&#xff09; DFS&#xff08;DFS基础、回溯、剪枝、记忆化&#xff09; 1.DFS算法&#xff08;深度优先搜索算法&#xff09; 深度优先搜…

【网络面试篇】其他面试题——Cookie、Session、DNS、CDN、SSL/TLS、加密概念

目录 一、HTTP 相关问题 1. Cookie 和 Session 是什么&#xff1f; &#xff08;1&#xff09;Cookie &#xff08;2&#xff09;Session 2. Cookie 的工作原理&#xff1f; 3. Session 的工作原理&#xff1f; 4. Cookie 和 Session 有什么区别&#xff1f; 二、其他问…

隧道论文阅读2-采用无人融合扫描数据的基于深度学习的垂直型隧道三维数字损伤图

目前存在的问题&#xff1a; 需要开发新的无人测量系统测量垂直隧道图像数据量巨大&#xff0c;基于深度学习完成损伤评估跟踪获取图像位置的困难&#xff0c;对大型基础设施感兴趣区域(roi)的2d和3d地图建立进行了研究&#xff0c;对整个目标结构的损伤定位仍然具有挑战性。为…

CCF-A类 HPCA 2025 重磅揭晓:录取数据公布

近日&#xff0c;第31届国际计算机体系结构领域顶级会议HPCA (International Symposium on High Performance Computer Architecture) 正式发布了2025年会议的录用通知&#xff01;本届会议共收到了534 篇提交论文&#xff0c;其中&#xff0c;112篇论文被接收&#xff0c;整体…

Linux应用——线程池

1. 线程池要求 我们创建线程池的目的本质上是用空间换取时间&#xff0c;而我们选择于 C 的类内包装原生线程库的形式来创建&#xff0c;其具体实行逻辑如图 可以看到&#xff0c;整个线程池其实就是一个大型的 CP 模型&#xff0c;接下来我们来完成它 2. 整体模板 #pragma …

IDM扩展添加到Edge浏览器

IDM扩展添加到Edge浏览器 一般情况下&#xff0c;当安装IDM软件后&#xff0c;该软件将会自动将IDM Integration Module浏览器扩展安装到Edge浏览器上&#xff0c;但在某些情况下&#xff0c;需要我们手动安装&#xff0c;以下为手动安装步骤 手动安装IDM扩展到Edge浏览器 打…

docker 拉取MySQL8.0镜像以及安装

目录 一、docker安装MySQL镜像 搜索images 拉取MySQL镜像 二、数据挂载 在/root/mysql/conf中创建 *.cnf 文件 创建容器,将数据,日志,配置文件映射到本机 检查MySQL是否启动成功&#xff1a; 三、DBeaver数据库连接 问题一、Public Key Retrieval is not allowed 问题…