大模型架构记录13【hr agent】

一  Function calling 函数调用

from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from openai import OpenAI
import jsonclient = OpenAI()# Example dummy function hard coded to return the same weather
# In production, this could be your backend API or an external API
def get_current_weather(location, unit="fahrenheit"): """Get the current weather in a given location"""if "tokyo" in location.lower():return json.dumps({"location": "Tokyo", "temperature": "10", "unit": unit})elif "san francisco" in location.lower():return json.dumps({"location": "San Francisco", "temperature": "72", "unit": unit})elif "paris" in location.lower():return json.dumps({"location": "Paris", "temperature": "22", "unit": unit})else:return json.dumps({"location": location, "temperature": "unknown"})def run_conversation():# Step 1: send the conversation and available functions to the modelmessages = [{"role": "user", "content": "What's the weather like in San Francisco, Tokyo, and Paris?"}]tools = [{"type": "function","function": {"name": "get_current_weather","description": "Get the current weather in a given location","parameters": {"type": "object","properties": {"location": {"type": "string","description": "The city and state, e.g. San Francisco, CA",},"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},},"required": ["location"],},},}]response = client.chat.completions.create(model="gpt-3.5-turbo-0125",messages=messages,tools=tools,tool_choice="auto",  # auto is default, but we'll be explicit)print(response)response_message = response.choices[0].messageprint(response_message)tool_calls = response_message.tool_callsprint(tool_calls)# Step 2: check if the model wanted to call a functionif tool_calls:# Step 3: call the function# Note: the JSON response may not always be valid; be sure to handle errorsavailable_functions = {"get_current_weather": get_current_weather,}  # only one function in this example, but you can have multiplemessages.append(response_message)  # extend conversation with assistant's reply# Step 4: send the info for each function call and function response to the modelfor tool_call in tool_calls:function_name = tool_call.function.namefunction_to_call = available_functions[function_name]function_args = json.loads(tool_call.function.arguments)function_response = function_to_call(location=function_args.get("location"),unit=function_args.get("unit"),)messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": function_response,})  # extend conversation with function responsesecond_response = client.chat.completions.create(model="gpt-3.5-turbo-0125",messages=messages,)  # get a new response from the model where it can see the function responsereturn second_response

result = run_conversation()
resultresult.choices[0].message.content
# 'The current weather in San Francisco is 72°F, in Tokyo it is 10°C, and in Paris it is 22°C.'

二 v3-Create-Custom-Agent

2.1 Load the LLM 加载LLM

from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from langchain_openai import ChatOpenAIllm = ChatOpenAI(model="gpt-4", temperature=0)

2.2 Define Tools 定义工具

from langchain.agents import toolimport time@tool
def generate_unique_timestamp():"""生成唯一的时间戳。输入始终为空字符串。Returns:int: 唯一的时间戳,以毫秒为单位。"""timestamp = int(time.time() * 1000)  # 获取当前时间的毫秒级时间戳return timestampimport os@tool
def create_folder(folder_name):"""根据给定的文件夹名创建文件夹。Args:folder_name (str): 要创建的文件夹的名称。Returns:str: 创建的文件夹的路径。"""try:os.makedirs(os.path.join("chat_history", folder_name))  # 创建文件夹return os.path.abspath(folder_name)  # 返回创建的文件夹的绝对路径except OSError as e:print(f"创建文件夹失败:{e}")return Noneimport shutil@tool
def delete_temp_folder():"""删除 chat_history 文件夹下的 temp 文件夹。输入始终为空字符串。Returns:bool: 如果成功删除则返回 True,否则返回 False。"""temp_folder = "chat_history/temp"  # temp 文件夹路径try:shutil.rmtree(temp_folder)  # 递归删除 temp 文件夹及其所有内容print("成功删除 temp 文件夹。")return Trueexcept Exception as e:print(f"删除 temp 文件夹失败:{e}")return False@tool
def copy_chat_history(interview_id: str) -> str:"""将 chat_history/temp 文件夹中的 chat_history.txt 文件复制到 chat_history 文件夹下的以 interview_id 命名的子文件夹中。如果面试ID文件夹不存在,则返回相应的提示字符串。参数:interview_id (str): 面试的唯一标识符。返回:str: 操作结果的提示信息。"""# 确定临时文件夹和面试文件夹路径temp_folder = os.path.join("chat_history", "temp")interview_folder = os.path.join("chat_history", interview_id)# 检查面试文件夹是否存在if not os.path.exists(interview_folder):return f"面试ID为 {interview_id} 的文件夹不存在。无法完成复制操作。"# 将 chat_history.txt 从临时文件夹复制到面试文件夹source_file = os.path.join(temp_folder, 'chat_history.txt')destination_file = os.path.join(interview_folder, 'chat_history.txt')shutil.copyfile(source_file, destination_file)return f"已将 chat_history.txt 复制到面试ID为 {interview_id} 的文件夹中。"@tool
def read_chat_history(interview_id: str) -> str:"""读取指定面试ID文件夹下的聊天记录(chat_history.txt)内容。参数:interview_id (str): 面试的唯一标识符。返回:str: 聊天记录的内容。"""# 确定面试文件夹路径interview_folder = os.path.join("chat_history", interview_id)# 检查面试文件夹是否存在if not os.path.exists(interview_folder):return f"面试ID为 {interview_id} 的文件夹不存在。无法读取聊天记录。"# 读取聊天记录文件内容chat_history_file = os.path.join(interview_folder, 'chat_history.txt')with open(chat_history_file, 'r', encoding='utf-8') as file:chat_history_content = file.read()return chat_history_content@tool
def generate_markdown_file(interview_id: str, interview_feedback: str) -> str:"""将给定的面试反馈内容生成为 Markdown 文件,并保存到指定的面试ID文件夹中。参数:interview_id (str): 面试的唯一标识符。interview_feedback (str): 面试反馈的内容。返回:str: 操作结果的提示信息。"""# 确定面试文件夹路径interview_folder = os.path.join("chat_history", interview_id)# 检查面试文件夹是否存在if not os.path.exists(interview_folder):return f"面试ID为 {interview_id} 的文件夹不存在。无法生成 Markdown 文件。"# 生成 Markdown 文件路径markdown_file_path = os.path.join(interview_folder, "面试报告.md")try:# 写入 Markdown 文件with open(markdown_file_path, 'w', encoding='utf-8') as file:# 写入标题和面试反馈file.write("# 面试报告\n\n")file.write("## 面试反馈:\n\n")file.write(interview_feedback)file.write("\n\n")# 读取 chat_history.txt 文件内容并写入 Markdown 文件chat_history_file_path = os.path.join(interview_folder, "chat_history.txt")if os.path.exists(chat_history_file_path):file.write("## 面试记录:\n\n")with open(chat_history_file_path, 'r', encoding='utf-8') as chat_file:for line in chat_file:file.write(line.rstrip('\n') + '\n\n')  # 添加换行符return f"已生成 Markdown 文件: {markdown_file_path}"except Exception as e:return f"生成 Markdown 文件时出错: {str(e)}"

2.3 执行

from utils import parse_cv_to_md
cv_file_path = "data/cv.txt"
result = parse_cv_to_md(llm, cv_file_path)
print(result)

2.4 加载数据

from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from utils import parse_md_file_to_docsfile_path = "data/cv.md"
docs = parse_md_file_to_docs(file_path)
print(len(docs))vectorstore = Chroma.from_documents(documents=docs, embedding=OpenAIEmbeddings())retriever = vectorstore.as_retriever(search_kwargs={"k": 1})retriever.get_relevant_documents("langchain")

retriever.get_relevant_documents("python")@tool
def find_most_relevant_block_from_cv(sentence: str) -> str:"""当你需要根据职位描述(JD)中的技能关键词去简历文本中找到相关内容时,就可以调用这个函数。参数:sentence (str): 包含技能关键词的句子。返回:str: 最相关的文本块。"""try:most_relevant_docs = retriever.get_relevant_documents(sentence)print(len(most_relevant_docs))if most_relevant_docs:most_relevant_texts = [doc.page_content for doc in most_relevant_docs]most_relevant_text = "\n".join(most_relevant_texts)return most_relevant_textelse:return "未找到相关文本块"except Exception as e:print(f"find_most_relevant_block_from_cv()发生错误:{e}")return "函数发生错误,未找到相关文本块"tools = [generate_unique_timestamp, create_folder, copy_chat_history, read_chat_history, generate_markdown_file, find_most_relevant_block_from_cv]

2.5 Create Prompt 创建提示

from utils import *jd_file_path = "data/jd.txt"
jd_json_file_path = parse_jd_to_json(llm, jd_file_path)
jd_json_file_path

jd_json_file_path = "data/jd.json"
jd_dict = read_json(jd_json_file_path)
jd_dict

job_title = jd_dict.get('基本信息').get('职位')
job_key_skills = jd_dict.get('专业技能/知识/能力')
print(f"职位:{job_title}")
print(f"专业技能/知识/能力:{job_key_skills}")"""职位:Python工程师 (AI应用方向)
专业技能/知识/能力:['Python', 'PyTorch', 'TensorFlow', 'Numpy', 'Redis', 'MySQL', 'openai', 'langchain', 'AI开发工具集', '向量数据库', 'Text-SQL', 'Python Web框架', 'FastAPI', 'ORM框架', 'Prompt提示词']"""
# 弃用
system_prompt = f"""
## Role and Goals
- 你是所招岗位“{job_title}”的技术专家,同时也作为技术面试官向求职者提出技术问题,专注于考察应聘者的专业技能、知识和能力。
- 这里是当前岗位所需的专业技能、知识和能力:“{job_key_skills}”,你应该重点围绕这些技术点提出你的问题。
- 你严格遵守面试流程进行面试。## Interview Workflow
1. 当应聘者说开始面试后,1.1 你要依据当前时间生成一个新的时间戳作为面试ID(只会在面试开始的时候生成面试ID,其他任何时间都不会)1.2 以该面试ID为文件夹名创建本地文件夹(只会在面试开始的时候创建以面试ID为名的文件夹,其他任何时间都不会)1.3 删除存储聊天记录的临时文件夹1.4 输出该面试ID给应聘者,并结合当前技术点、与技术点相关的简历内容,提出你的第一个基础技术问题。
2. 接收应聘者的回答后,2.1 检查应聘者的回答是否有效2.1.1 如果是对面试官问题的正常回答(无论回答的好不好,还是回答不会,都算正常回答),就跳转到2.2处理2.1.2 如果是与面试官问题无关的回答(胡言乱语、辱骂等),请警告求职者需要严肃对待面试,跳过2.2,再次向求职者提出上次的问题。2.2 如果应聘者对上一个问题回答的很好,就基于当前技术点和历史记录提出一个更深入一点的问题;如果应聘者对上一个问题回答的一般,就基于当前技术点和历史记录提出另一个角度的问题;如果应聘者对上一个问题回答的不好,就基于当前技术点和历史记录提出一个更简单一点的问题;如果应聘者对上一个问题表示不会、不懂、一点也回答不了,就换一个与当前技术点不同的技术点进行技术提问。
3. 当应聘者想结束面试或当应聘者想要面试报告,3.1 从临时文件夹里复制一份聊天记录文件到当前面试ID文件夹下。3.2 读取当前面试ID文件夹下的聊天记录,基于聊天记录、从多个角度评估应聘者的表现、生成一个详细的面试报告。3.3 调用工具生成一个面试报告的markdown文件到当前面试ID文件夹下3.4 告知应聘者面试已结束,以及面试报告的位置。## Output Constraints
- 你发送给应聘者的信息中,一定不要解答你提出的面试问题,只需要有简短的反馈和提出的新问题。
- 你每次提出的技术问题,都需要结合从JD里提取的技术点和与技术点相关的简历内容,当你需要获取`与技术点相关的简历内容`时,请调用工具。
- 再一次检查你的输出,你一次只会问一个技术问题。
"""
system_prompt = f"""
## Role and Goals
- 你是所招岗位“{job_title}”的技术专家,同时也作为技术面试官向求职者提出技术问题,专注于考察应聘者的专业技能、知识和能力。
- 这里是当前岗位所需的专业技能、知识和能力:“{job_key_skills}”,你应该重点围绕这些技术点提出你的问题。
- 你严格遵守面试流程进行面试。## Interview Workflow
1. 当应聘者说开始面试后,1.1 你要依据当前时间生成一个新的时间戳作为面试ID(只会在面试开始的时候生成面试ID,其他任何时间都不会)1.2 以该面试ID为文件夹名创建本地文件夹(只会在面试开始的时候创建以面试ID为名的文件夹,其他任何时间都不会)1.3 删除存储聊天记录的临时文件夹1.4 输出该面试ID给应聘者,并结合当前技术点、与技术点相关的简历内容,提出你的第一个基础技术问题。
2. 接收应聘者的回答后,2.1 检查应聘者的回答是否有效2.1.1 如果是对面试官问题的正常回答(无论回答的好不好,还是回答不会,都算正常回答),就跳转到2.2处理2.1.2 如果是与面试官问题无关的回答(胡言乱语、辱骂等),请警告求职者需要严肃对待面试,跳过2.2,再次向求职者提出上次的问题。2.2 如果应聘者对上一个问题回答的很好,就基于当前技术点和历史记录提出一个更深入一点的问题;如果应聘者对上一个问题回答的一般,就基于当前技术点和历史记录提出另一个角度的问题;如果应聘者对上一个问题回答的不好,就基于当前技术点和历史记录提出一个更简单一点的问题;如果应聘者对上一个问题表示不会、不懂、一点也回答不了,就换一个与当前技术点不同的技术点进行技术提问。
3. 当应聘者想结束面试或当应聘者想要面试报告,3.1 从临时文件夹里复制一份聊天记录文件到当前面试ID文件夹下。3.2 读取当前面试ID文件夹下的聊天记录,基于聊天记录、从多个角度评估应聘者的表现、生成一个详细的面试报告。3.3 调用工具生成一个面试报告的markdown文件到当前面试ID文件夹下3.4 告知应聘者面试已结束,以及面试报告的位置。## Output Constraints
- 你发送给应聘者的信息中,一定不要解答你提出的面试问题,只需要有简短的反馈和提出的新问题。
- 你每次提出的技术问题,都需要结合从JD里提取的技术点和与技术点相关的简历内容,当你需要获取`与技术点相关的简历内容`时,请调用工具。
- 再一次检查你的输出,你一次只会问一个技术问题。
"""
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderprompt = ChatPromptTemplate.from_messages([("system",system_prompt,),MessagesPlaceholder(variable_name="chat_history"),("user", "{input}"),MessagesPlaceholder(variable_name="agent_scratchpad"),]
)print(prompt.messages[0].prompt.template)

2.6 Bind tools to LLM 将工具绑定到LLM

llm_with_tools = llm.bind_tools(tools)llm_with_tools.kwargs['tools']

2.7 Create the Agent 创建代理

from langchain.agents.format_scratchpad.openai_tools import (format_to_openai_tool_messages,
)
from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParseragent = ({"input": lambda x: x["input"],"agent_scratchpad": lambda x: format_to_openai_tool_messages(x["intermediate_steps"]),"chat_history": lambda x: x["chat_history"],}| prompt| llm_with_tools| OpenAIToolsAgentOutputParser()
)

2.8 Run the agent 运行代理

from langchain.agents import AgentExecutoragent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)from utils import save_chat_historyfrom langchain_core.messages import AIMessage, HumanMessagechat_history = []user_input = "开始面试"
print(user_input)while True:result = agent_executor.invoke({"input": user_input, "chat_history": chat_history})print(result['output'])chat_history.extend([HumanMessage(content=user_input),AIMessage(content=result["output"]),])# 存储聊天记录到临时文件夹temp_folder = "chat_history/temp"  # 临时文件夹名称os.makedirs(temp_folder, exist_ok=True)  # 创建临时文件夹,如果不存在则创建save_chat_history(chat_history, temp_folder)# 获取用户下一条输入user_input = input("user: ")# 检查用户输入是否为 "exit"if user_input == "exit":print("用户输入了 'exit',程序已退出。")break

2.9 urls.py


import os
import json
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser, StrOutputParser
from langchain_core.messages import AIMessage, HumanMessagedef save_chat_history(chat_history, folder_name):"""将聊天记录存储到指定的文件夹下的chat_history.txt文件中。Args:chat_history (list): 聊天记录列表,每个元素是一个AIMessage或HumanMessage对象。folder_name (str): 聊天记录文件夹的名称。Returns:str: 保存的文件路径,如果保存失败则返回None。"""try:file_path = os.path.join(folder_name, "chat_history.txt")  # chat_history.txt文件路径with open(file_path, "w", encoding="utf-8") as file:for message in chat_history:if isinstance(message, AIMessage):speaker = "面试官"elif isinstance(message, HumanMessage):speaker = "应聘者"else:continue  # 忽略不是面试官或应聘者的消息file.write(f"{speaker}: {message.content}\n")  # 将每条聊天记录写入文件,每条记录占一行return file_path  # 返回保存的文件路径except Exception as e:print(f"保存聊天记录失败:{e}")return Nonedef parse_jd_to_json(llm, jd_file_path: str):"""将给定的 JD 文件内容解析为 JSON,并存储到指定路径下。参数:llm: 大模型。jd_file_path (str): JD 文件的路径。返回:str: 存储的 JSON 文件路径。"""try:with open(jd_file_path, 'r', encoding='utf-8') as jd_file:jd_content = jd_file.read().strip()template = """
基于JD文本,按照约束,生成以下格式的 JSON 数据:
{{"基本信息": {{"职位": "职位名称","薪资": "薪资范围","地点": "工作地点","经验要求": "经验要求","学历要求": "学历要求","其他":""}},"岗位职责": {{"具体职责": ["职责1", "职责2", ...]}},"岗位要求": {{"学历背景": "学历要求","工作经验": "工作经验要求","技能要求": ["技能1", "技能2", ...],"个人特质": ["特质1", "特质2", ...],}},"专业技能/知识/能力": ["技能1", "技能2", ...],"其他信息": {{}}
}}JD文本:
[{jd_content}]约束:
1、除了`专业技能/知识/能力`键,其他键的值都从原文中获取。
2、保证JSON里的值全面覆盖JD原文,不遗漏任何原文,不知如何分类就放到`其他信息`里。
3、`专业技能/知识/能力`键对应的值要求从JD全文中(尤其是岗位职责、技能要求部分)提取总结关键词或关键短句,不能有任何遗漏的硬技能。JSON:
"""parser = JsonOutputParser()prompt = PromptTemplate(template=template,input_variables=["jd_content"],partial_variables={"format_instructions": parser.get_format_instructions()},)print(prompt.template)chain = prompt | llm | parserresult = chain.invoke({"jd_content": jd_content})# 打印print(result)print(type(result))print(result['专业技能/知识/能力'])# 存储到 data 目录下output_file_path = "data/jd.json"with open(output_file_path, 'w', encoding='utf-8') as output_file:json.dump(result, output_file, ensure_ascii=False)print(f"已存储最终 JSON 文件到 {output_file_path}")return output_file_pathexcept Exception as e:print(f"解析 JD 文件时出错: {str(e)}")return Nonedef read_json(file_path: str) -> dict:"""读取 JSON 文件并返回其内容。参数:file_path (str): JSON 文件的路径。返回:dict: JSON 文件的内容。"""try:with open(file_path, 'r', encoding='utf-8') as json_file:data = json.load(json_file)return dataexcept Exception as e:print(f"读取 JSON 文件时出错: {str(e)}")return {}from langchain.text_splitter import MarkdownHeaderTextSplitter
from langchain.schema import Documentdef parse_cv_to_md(llm, cv_file_path: str):"""将给定的简历文件内容解析为 JSON,并存储到指定路径下。参数:llm: 大模型。cv_file_path (str): 简历文件的路径。返回:str: 存储的 Markdown 文件路径。"""try:with open(cv_file_path, 'r', encoding='utf-8') as cv_file:cv_content = cv_file.read().strip()template = """
基于简历文本,按照约束,转换成Markdown格式:简历文本:
[{cv_content}]约束:
1、只用一级标题和二级标题分出来简历的大块和小块
2、一级标题只有这些:个人信息、教育经历、工作经历、项目经历、校园经历、职业技能、曾获奖项、兴趣爱好、自我评价、其他信息。Markdown:
"""parser = StrOutputParser()prompt = PromptTemplate(template=template,input_variables=["cv_content"])print(prompt.template)chain = prompt | llm | parserresult = chain.invoke({"cv_content": cv_content})# 打印print(result)print(type(result))# 存储到 data 目录下output_file_path = "data/cv.md"with open(output_file_path, 'w', encoding='utf-8') as output_file:output_file.write(result.strip("```"))output_file.write("\n\n")print(f"已存储最终 Markdown 文件到 {output_file_path}")return output_file_pathexcept Exception as e:print(f"解析 CV 文件时出错: {str(e)}")return Nonedef parse_md_file_to_docs(file_path):with open(file_path, 'r', encoding='utf-8') as file:markdown_text = file.read()docs = []headers_to_split_on = [("#", "Title 1"),("##", "Title 2"),# ("###", "Title 3"),# ("###", "Title 4")]markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)split_docs = markdown_splitter.split_text(markdown_text)for split_doc in split_docs:metadata = split_doc.metadatatitle_str = f"# {metadata.get('Title 1', 'None')}\n## {metadata.get('Title 2', 'None')}\n"page_content = title_str + split_doc.page_content.strip()doc = Document(page_content=page_content,metadata=metadata)docs.append(doc)return docsif __name__ == "__main__":from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from langchain_openai import ChatOpenAIllm = ChatOpenAI(model="gpt-4", temperature=0) # gpt-3.5-turbo# # jd# jd_file_path = "data/jd.txt"# result = parse_jd_to_json(llm, jd_file_path)# print(result)# cvcv_file_path = "data/cv.txt"result = parse_cv_to_md(llm, cv_file_path)print(result)

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

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

相关文章

mysql5.7无法启动报错处理无日志

注意,本篇适用于mysql安装启动异常,而不是数据库本身的异常。所以在/var/log/mysql/下没有日志。 journalctl -u mysqld -n 15 查看启动日志,提示缺少共享库libaio.so.1 Mar 26 16:47:01 iZbp19v3umnf1z4en78hnlZ systemd[1]: Starting MyS…

android11关机安卓充电的UI定制化

引言 首先上一张安卓充电的图片: 安卓关机状态下有两种充电模式:uboot-charge和android-charge,可通过dts配置使用哪一种充电模式。 dts配置中uboot-charge和android-charge是互斥的,如下配置的是开启android-charge:…

忘记海康网络摄像机IP

海康网络摄像机的使用: 海康网络摄像机的使用 解决电脑无法通过网线直连海康摄像机的问题 使用vlc显示海康网络摄像机的视频 忘记海康网络摄像机IP 一、引言 如果忘记了海康网络摄像机的IP,可以通过下载海康的设备网络搜索软件“SADP”解决。 二…

【CSS3】04-标准流 + 浮动 + flex布局

本文介绍浮动与flex布局。 目录 1. 标准流 2. 浮动 2.1 基本使用 特点 脱标 2.2 清除浮动 2.2.1 额外标签法 2.2.2 单伪元素法 2.2.3 双伪元素法(推荐) 2.2.4 overflow(最简单) 3. flex布局 3.1 组成 3.2 主轴与侧轴对齐方式 3.2.1 主轴 3.2.2 侧轴 3.3 修改主…

百度自动驾驶:我的学习笔记

自动驾驶新人之旅(9.0版) 第一课:初识自动驾驶技术 1. 自动驾驶技术概述 2. 自动驾驶人才需求与挑战 3. 如何使用Apollo学习自动驾驶[上机学习] 4. 如何使用Apollo学习自动驾驶[上车学习] 第二课:入门自动驾驶技术 1. Apollo车云研发流程 2. Lin…

并发编程之FutureTask.get()阻塞陷阱:深度解析线程池CPU飚高问题排查与解决方案

FutureTask.get方法阻塞陷阱:深度解析线程池CPU飚高问题排查与解决方法 FutureTask.get()方法阻塞陷阱:深度解析线程池CPU飚高问题排查与解决方法1、情景复现1.1 线程池工作原理1.2 业务场景模拟1.3 运行结果1.4 发现问题:线程池没有被关闭1.…

记录vite引入sass预编译报错error during build: [vite:css] [sass] Undefined variable.问题

vite.config.ts resolve: {alias: {: path.resolve(__dirname, src),},},css: {// css预处理器preprocessorOptions: {scss: {additionalData: use "/assets/styles/block.scss" as *;,}}},block.scss $colorGreen: #00ff00;index.vue :v-deep .font-size-14{colo…

代码小练习

public class Test3 {public static void main(String[] args) throws ParseException {ArrayList<Integer> listnew ArrayList<>();Scanner scnew Scanner(System.in);while (true){System.out.println("请输入一个整数");String s sc.nextLine();int…

百人会上的蔚小理与「来的刚刚好」的雷军

这就是2025百人会上的蔚小理&#xff0c;努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么呢&#xff1f;站在蔚小理的肩上。 这就是2025百人会上的蔚小理&#xff0c;努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么…

日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习(3号通知)

日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习&#xff08;3号通知&#xff09; 日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习&#xff08;3号通知&#xff09;

<em>赚</em><em>钱</em><em>彩</em><em>票</em><em>软</em><em>件</em>

&#xff1c;em&#xff1e;赚&#xff1c;/em&#xff1e;&#xff1c;em&#xff1e;钱&#xff1c;/em&#xff1e;&#xff1c;em&#xff1e;彩&#xff1c;/em&#xff1e;&#xff1c;em&#xff1e;票&#xff1c;/em&#xff1e;&#xff1c;em&#xff1e;软&#xf…

随机2级域名引导页HTML源码

源码介绍 随机2级域名引导页HTML源码,每次点进去都随机一个域名前缀。 修改跳转域名在 350 行代码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行 效果预览 源码免费获取 随机2级域名引导页…

入栈操作-出栈操作

入栈操作 其 入栈操作 汇编代码流程解析如下&#xff1a; 出栈操作 其 出栈操作 汇编代码流程解析如下&#xff1a;

B3637 最长上升子序列

题目链接&#xff1a; 代码如下&#xff1a; #include<bits/stdc.h> #define int long long using namespace std; const int N 5050;int n; int arr[N]; int dp[N]; //dp数组signed main(){cin >> n;for(int i 1; i < n; i) cin >> arr[i];for(int i…

vscode通过root远程连接wsl

参考&#xff1a;vscode远程wsl时默认用root登录_vscode wsl root-CSDN博客

硬件基础--14_电功率

电功率 电功率:指电流在单位时间内做的功(表示用电器消耗电能快慢的一个物理量)。 单位:瓦特(W)&#xff0c;简称瓦。 公式:PUI(U为电压&#xff0c;单位为V&#xff0c;i为电流&#xff0c;单位为A&#xff0c;P为电功率&#xff0c;单位为W)。 单位换算:进位为1000&#xff…

【云服务器 | 下载 FFmpeg】云服务器上下载 ffmpeg + 配置

文章目录 FFmpeg 下载报错&#xff1a;已加载插件&#xff1a;fastestmirror1. 压缩包上传至服务器2. 解压3. 配置4. 添加FFmpeg到环境变量5. FFmpeg的配置5.1 安装 NASM5.2 安装x264 总结 可以看该博客&#xff0c;跟着这个步骤来的&#xff1a;https://blog.csdn.net/Aarstg/…

逆向--ARM64汇编

一、查看寄存器值 bl指令&#xff08;函数调用 bl的时候ret这个才有效&#xff09; 二、 bl 和lr 配合使用才达到函数调用的作用

【wow-rag系列】 task05 Ollama+llamaIndex+流式部署页面

文章目录 1.构建问答引擎2.构建基于FastAPI的后台3.构建流式输出的前端 1.构建问答引擎 新建一个engine.py文件 import os from llama_index.core.node_parser import SentenceSplitter# --------------------- # step 1.设定key、模型url、推理模型名称以及embedding模型名称 …

瑞芯微RKRGA(librga)Buffer API 分析

一、Buffer API 简介 在瑞芯微官方的 librga 库的手册中&#xff0c;有两组配置 buffer 的API&#xff1a; importbuffer 方式&#xff1a; importbuffer_virtualaddr importbuffer_physicaladdr importbuffer_fd wrapbuffer 方式&#xff1a; wrapbuffer_virtualaddr wrapb…