大语言模型 智能助手——既能生成自然语言回复,又能在必要时调用外部工具获取实时数据
示例代码:
import json
from langgraph.graph import Graph, END,StateGraph
from langchain_core.utils.function_calling import convert_to_openai_function
from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun
from langchain_core.messages import HumanMessage, ToolMessage
from langgraph.prebuilt import ToolInvocation, ToolNode,ToolExecutor # 引入 ToolNodetools = [OpenWeatherMapQueryRun()]model = ChatOpenAI(openai_api_base=OPENAI_API_BASE,openai_api_key=OPENAI_API_KEY,temperature=0)functions = [convert_to_openai_function(t) for t in tools]model = model.bind_tools(functions)def function_1(state):messages = state['messages']response = model.invoke(messages)return {"messages": [response]}tool_executor = ToolExecutor(tools)def function_2(state):messages = state['messages']last_message = messages[-1] # 取最后一条消息,获取要发送给工具的查询print('last_message===\n',last_message)# 确保 tool_calls 存在且为非空列表tool_calls = last_message.additional_kwargs.get("tool_calls", [])if tool_calls:function_data = tool_calls[0].get("function", {}) # 获取 function 字典arguments_str = function_data.get("arguments", "{}") # 获取 arguments JSON 字符串parsed_tool_input = json.loads(arguments_str) # 解析 JSONprint('parsed_tool_input===\n', parsed_tool_input)tool_call_id=tool_calls[0]["id"]else:print("Warning: tool_calls is empty.")print('function_data===\n',function_data,function_data["name"])print('parsed_tool_input===\n',parsed_tool_input,parsed_tool_input['location'])# 构造 ToolInvocationaction = ToolInvocation(tool=function_data["name"],tool_input=parsed_tool_input['location'],)# 使用 tool_executor 处理请求response = tool_executor.invoke(action)print('response===\n',response,'\n',action.tool)# 构造 FunctionMessagefunction_message = ToolMessage(response, tool_call_id=tool_call_id)# 返回消息列表return {"messages": [function_message]}def where_to_go(state):messages = state['messages']last_message = messages[-1]if "tool_calls" in last_message.additional_kwargs:return "continue"else:return "end"# from langgraph.graph import Graph, END
# workflow = Graph()# Or you could import StateGraph and pass AgentState to it
workflow = StateGraph(AgentState)workflow.add_node("agent", function_1)
workflow.add_node("tool", function_2)# The conditional edge requires the following info below.
# First, we define the start node. We use `agent`.
# This means these are the edges taken after the `agent` node is called.
# Next, we pass in the function that will determine which node is called next, in our case where_to_go().workflow.add_conditional_edges("agent", where_to_go,{ # Based on the return from where_to_go# If return is "continue" then we call the tool node."continue": "tool",# Otherwise we finish. END is a special node marking that the graph should finish."end": END}
)# We now add a normal edge from `tools` to `agent`.
# This means that if `tool` is called, then it has to call the 'agent' next.
workflow.add_edge('tool', 'agent')# Basically, agent node has the option to call a tool node based on a condition,
# whereas tool node must call the agent in all cases based on this setup.workflow.set_entry_point("agent")app = workflow.compile()inputs = {"messages": [HumanMessage(content="what is the temperature in las vegas?")]} # what is the temperature in las vegas
result = app.invoke(inputs)
print('type result=====\n\n\n',type(result))
print('result=====\n\n\n',result)
输出:
last_message===content='' additional_kwargs={'tool_calls': [{'id': 'chatcmpl-c8tdWcPD6h68XZXYEX3I1lIDLPZn6', 'function': {'arguments': '{"location":"Las Vegas"}', 'name': 'open_weather_map'}, 'type': 'function'}], 'refusal': None} response_metadata={'token_usage': {'completion_tokens': 16, 'prompt_tokens': 80, 'total_tokens': 96, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_0165350fbb', 'finish_reason': 'tool_calls', 'logprobs': None} id='run-53715c56-b036-4721-a09e-376a950fbf5c-0' tool_calls=[{'name': 'open_weather_map', 'args': {'location': 'Las Vegas'}, 'id': 'chatcmpl-c8tdWcPD6h68XZXYEX3I1lIDLPZn6', 'type': 'tool_call'}] usage_metadata={'input_tokens': 80, 'output_tokens': 16, 'total_tokens': 96, 'input_token_details': {}, 'output_token_details': {}}
parsed_tool_input==={'location': 'Las Vegas'}
function_data==={'arguments': '{"location":"Las Vegas"}', 'name': 'open_weather_map'} open_weather_map
parsed_tool_input==={'location': 'Las Vegas'} Las Vegasaction = ToolInvocation(
response===In Las Vegas, the current weather is as follows:
Detailed status: clear sky
Wind speed: 5.36 m/s, direction: 0°
Humidity: 35%
Temperature: - Current: 13.53°C- High: 14.51°C- Low: 10.88°C- Feels like: 11.85°C
Rain: {}
Heat index: None
Cloud cover: 0% open_weather_map
type result=====<class 'langgraph.pregel.io.AddableValuesDict'>
result====={'messages': [HumanMessage(content='what is the temperature in las vegas?', additional_kwargs={}, response_metadata={}), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'chatcmpl-c8tdWcPD6h68XZXYEX3I1lIDLPZn6', 'function': {'arguments': '{"location":"Las Vegas"}', 'name': 'open_weather_map'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 16, 'prompt_tokens': 80, 'total_tokens': 96, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_0165350fbb', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-53715c56-b036-4721-a09e-376a950fbf5c-0', tool_calls=[{'name': 'open_weather_map', 'args': {'location': 'Las Vegas'}, 'id': 'chatcmpl-c8tdWcPD6h68XZXYEX3I1lIDLPZn6', 'type': 'tool_call'}], usage_metadata={'input_tokens': 80, 'output_tokens': 16, 'total_tokens': 96, 'input_token_details': {}, 'output_token_details': {}}), ToolMessage(content='In Las Vegas, the current weather is as follows:\nDetailed status: clear sky\nWind speed: 5.36 m/s, direction: 0°\nHumidity: 35%\nTemperature: \n - Current: 13.53°C\n - High: 14.51°C\n - Low: 10.88°C\n - Feels like: 11.85°C\nRain: {}\nHeat index: None\nCloud cover: 0%', tool_call_id='chatcmpl-c8tdWcPD6h68XZXYEX3I1lIDLPZn6'), AIMessage(content='The current temperature in Las Vegas is 13.53°C.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 14, 'prompt_tokens': 203, 'total_tokens': 217, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_0165350fbb', 'finish_reason': 'stop', 'logprobs': None}, id='run-d115a20e-e9fd-4ac4-bda3-2c2fbc433dad-0', usage_metadata={'input_tokens': 203, 'output_tokens': 14, 'total_tokens': 217, 'input_token_details': {}, 'output_token_details': {}})]}
补充代码输出最后一个消息:
# 取出 messages 列表中第一个消息对象
first_msg = result["messages"][-1]# 获取第一个消息的 content 属性
first_content = first_msg.content# 打印第一个消息的内容
print(first_content)
输出:
The current temperature in Las Vegas is 13.53°C.
下面解释这段代码的含义,并用通俗的语言和例子来说明每个部分是如何工作的。
1. 导入依赖库
import json
- 作用:引入 Python 内置的
json模块,用于将 Python 数据结构(如字典)转换为 JSON 格式的字符串,或将 JSON 字符串解析回 Python 数据结构。 - 举例:比如,当你从 API 得到返回的 JSON 字符串
{"location": "las vegas"},你可以使用json.loads()将它转换成字典,然后取出"location"对应的值。
from langgraph.graph import Graph, END, StateGraph
- 作用:从
langgraph.graph模块中导入了三个组件:- Graph:构建工作流图的基础类。
- END:常量,用于标记工作流的结束节点。
- StateGraph:基于状态的工作流图,用来描述多个步骤之间的转移。
- 举例:你可以把整个对话过程看作一张流程图,每一步(节点)负责处理一部分逻辑,而
END就表示对话结束。
from langchain_core.utils.function_calling import convert_to_openai_function
- 作用:引入一个函数
convert_to_openai_function,用来将工具对象转换成 OpenAI 可调用的函数格式。 - 举例:假如你有一个天气查询工具,通过转换后,语言模型就可以“知道”如何调用这个工具来查询天气信息。
from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun
- 作用:导入
OpenWeatherMapQueryRun类,这是一个用于调用 OpenWeatherMap API 查询天气数据的工具。 - 举例:当你需要知道某个城市的当前温度时,就会使用这个工具发送请求,获取实际的天气数据。
from langchain_core.messages import HumanMessage, ToolMessage
- 作用:导入两种消息类型:
- HumanMessage:表示用户输入的消息。
- ToolMessage:表示工具调用返回的消息。
- 举例:当用户发送“what is the temperature in las vegas?”时,会封装成一个
HumanMessage;当工具返回温度结果时,会封装成一个ToolMessage。
from langgraph.prebuilt import ToolInvocation, ToolExecutor # 引入 ToolNode
- 作用:从
langgraph.prebuilt导入几个用于工具调用的类:- ToolInvocation:用于构造一个工具调用的描述(包括工具名称和输入参数)。
- ToolExecutor:执行工具调用的执行器。
- 举例:当语言模型决定需要查询天气时,会生成一个
ToolInvocation对象,然后ToolExecutor根据这个对象去实际调用 OpenWeatherMap API。
2. 配置工具和模型
tools = [OpenWeatherMapQueryRun()]
- 作用:创建一个列表,里面放了一个
OpenWeatherMapQueryRun的实例。这样我们就有一个可以查询天气的工具。 - 举例:假设你需要查询“las vegas”的天气,后续就会调用这个工具来获取数据。
model = ChatOpenAI(openai_api_base=OPENAI_API_BASE,openai_api_key=OPENAI_API_KEY,temperature=0)
- 作用:初始化一个聊天模型
ChatOpenAI(这里需要你事先定义或导入这个类)。传入 API 的基础地址、密钥,并设置temperature为 0 表示生成结果将更确定、不会有随机性。 - 举例:当你向这个模型发送询问消息时(比如“las vegas 的温度是多少?”),模型会根据提示生成回复或决定是否调用工具查询。
functions = [convert_to_openai_function(t) for t in tools]
- 作用:遍历之前定义的
tools列表,将每个工具对象转换成 OpenAI 可调用的函数格式,保存到functions列表中。 - 举例:转换后的函数可以嵌入到模型生成的函数调用建议中,比如生成一段 JSON 指示“调用 OpenWeatherMapQueryRun 查询天气”。
model = model.bind_tools(functions)
- 作用:将 转换好的工具函数 绑定到模型上,使得在对话过程中模型可以直接调用这些工具。
- 举例:当用户问天气问题时,模型就能自动调用相应的工具,而不需要人工干预。
3. 定义“agent”节点的处理函数
def function_1(state):messages = state['messages']response = model.invoke(messages)return {"messages": [response]}
- 作用:这是工作流中的“agent”节点对应的函数,主要逻辑如下:
- 从 输入状态 中提取消息列表(
state['messages'])。 - 调用模型的
invoke方法,根据当前的消息生成一个回复(response)。 - 返回一个包含回复的字典,其格式符合工作流要求,即
{"messages": [response]}。
- 从 输入状态 中提取消息列表(
- 举例:如果初始状态中只有一个用户消息 “what is the temperature in las vegas?”,那么这个函数会将消息传给模型,模型可能生成一个包含工具调用指令的回复,例如提示需要调用天气查询工具。
4. 创建工具执行器
tool_executor = ToolExecutor(tools)
- 作用:初始化一个
ToolExecutor实例,传入之前定义的tools列表。它负责实际执行工具调用。 - 举例:当系统需要查询天气时,会利用
tool_executor发送请求给 OpenWeatherMap API,并返回查询结果。
5. 定义“tool”节点的处理函数
def function_2(state):messages = state['messages']last_message = messages[-1] # 取最后一条消息,获取要发送给工具的查询print('last_message===\n', last_message)
- 作用:这是工作流中“tool”节点对应的函数,用于处理工具调用。第一步,它获取状态中的所有消息,并取最后一条消息,因为这条消息可能包含模型生成的工具调用信息。
- 举例:假设前面 agent 节点生成的回复中包含了一个指令,比如“调用天气查询工具查询 ‘las vegas’”,那么这条消息就是最后一条消息。
# 确保 tool_calls 存在且为非空列表tool_calls = last_message.additional_kwargs.get("tool_calls", [])
- 作用:尝试从最后一条消息的
additional_kwargs字段中获取tool_calls列表。这个列表包含了模型建议调用的工具信息。 - 举例:如果模型生成的回复中包含工具调用的说明,则
tool_calls列表里会有相应的字典;如果没有,则返回空列表。
if tool_calls:function_data = tool_calls[0].get("function", {}) # 获取 function 字典arguments_str = function_data.get("arguments", "{}") # 获取 arguments JSON 字符串parsed_tool_input = json.loads(arguments_str) # 解析 JSONprint('parsed_tool_input===\n', parsed_tool_input)tool_call_id = tool_calls[0]["id"]else:print("Warning: tool_calls is empty.")
- 作用:
- 判断
tool_calls是否有内容。 - 如果有,从第一个工具调用中提取
function字典,其中包含工具名称及其参数(以 JSON 字符串形式存储)。 - 使用
json.loads将 JSON 字符串解析为 Python 字典,得到工具调用的输入参数。 - 同时获取该工具调用的唯一标识符
id。
- 判断
- 举例:如果模型建议调用天气工具,并给出参数
{"location": "las vegas"},那么解析后parsed_tool_input就是字典{"location": "las vegas"},function_data["name"]为"open_weather_map"。
print('function_data===\n', function_data, function_data["name"])print('parsed_tool_input===\n', parsed_tool_input, parsed_tool_input['location'])
- 作用:打印出获取的工具调用数据和解析后的输入参数,方便调试。这里分别显示了工具的名称和输入参数(如位置)。
- 举例:控制台中可能输出:
function_data=== {'name': 'open_weather_map', 'arguments': '{"location": "las vegas"}'} parsed_tool_input=== {'location': 'las vegas'}
# 构造 ToolInvocationaction = ToolInvocation(tool=function_data["name"],tool_input=parsed_tool_input['location'],)
- 作用:利用获取到的工具名称和输入参数构造一个
ToolInvocation对象,用于描述需要调用哪个工具以及传入的参数。 - 举例:生成的
action对象表示“调用 open_weather_map工具,并传入参数 ‘las vegas’”。
# 使用 tool_executor 处理请求response = tool_executor.invoke(action)print('response===\n', response, '\n', action.tool)
- 作用:
- 使用
tool_executor执行前面构造的ToolInvocation。 - 将工具返回的结果保存在
response中,并打印输出调试信息。
- 使用
- 举例:如果 API 返回当前温度为 28°C,则
response可能就是 “28°C”,同时打印出调用的是哪个工具。
# 构造 FunctionMessagefunction_message = ToolMessage(response, tool_call_id=tool_call_id)
- 作用:将工具调用返回的结果包装成一个
ToolMessage对象,同时关联上之前获取的工具调用 ID,这样后续流程可以识别是哪个工具调用的结果。 - 举例:
function_message对象中会包含返回的温度数据和工具调用的标识,用于和 agent 的对话衔接。
# 返回消息列表return {"messages": [function_message]}
- 作用:最终返回一个字典,键为
"messages",值是包含工具调用结果的消息列表,符合工作流的状态格式。
6. 定义决策函数:确定下一步走向
def where_to_go(state):messages = state['messages']last_message = messages[-1]if "tool_calls" in last_message.additional_kwargs:return "continue"else:return "end"
- 作用:
- 该函数用于决定工作流的下一步走向。
- 检查最后一条消息的
additional_kwargs中是否包含tool_calls字段。 - 如果存在,返回字符串
"continue",表示 agent 节点后续需要调用工具节点;否则返回"end",表示整个工作流结束。
- 举例:假设 agent 节点生成的回复中包含工具调用信息(即
additional_kwargs中有tool_calls),则函数返回"continue",工作流会跳转到工具节点去执行工具调用。
7. 构建工作流图
# from langgraph.graph import Graph, END
# workflow = Graph()# Or you could import StateGraph and pass AgentState to it
workflow = StateGraph(AgentState)
- 作用:
- 这里展示了两种构建工作流的方法。注释部分给出了另一种可能的做法。
- 实际代码使用
StateGraph来构建一个基于状态的工作流图。AgentState(虽然未在代码中定义)表示对话状态的数据结构。
- 举例:可以把整个对话流程看成一个状态机,每个节点(agent 或 tool)根据当前状态执行对应的函数。
workflow.add_node("agent", function_1)
workflow.add_node("tool", function_2)
- 作用:
- 将两个节点添加到工作流图中:
"agent"节点关联function_1,负责生成模型回复。"tool"节点关联function_2,负责处理工具调用。
- 将两个节点添加到工作流图中:
- 举例:当工作流启动时,会先执行
"agent"节点中的逻辑;如果生成的回复需要调用工具,就会跳转到"tool"节点。
workflow.add_conditional_edges("agent", where_to_go, {"continue": "tool","end": END
})
- 作用:
- 为
"agent"节点添加基于条件的边(转移规则)。 - 这里使用
where_to_go函数决定下一步:- 如果返回
"continue",则转向"tool"节点。 - 如果返回
"end",则工作流结束(用特殊常量END表示)。
- 如果返回
- 为
- 举例:如果 agent 节点生成的消息中包含工具调用信息,则
where_to_go返回"continue",工作流会执行function_2;否则工作流结束,返回最终结果。
workflow.add_edge('tool', 'agent')
- 作用:
- 添加一条普通的边,表示无论如何当
"tool"节点执行完后,都要回到"agent"节点。
- 添加一条普通的边,表示无论如何当
- 举例:工具调用执行完后,系统会把工具返回的结果传递给 agent 继续处理后续对话或生成新的回复。
workflow.set_entry_point("agent")
- 作用:
- 设置工作流的入口节点为
"agent",即工作流启动时第一个执行的节点。
- 设置工作流的入口节点为
- 举例:当整个应用启动时,会首先调用
function_1来处理用户输入。
app = workflow.compile()
- 作用:
- 编译(构建)工作流图,生成一个可执行的工作流应用
app。
- 编译(构建)工作流图,生成一个可执行的工作流应用
- 举例:此时
app已经包含了所有节点和边的定义,可以根据输入状态开始整个对话流程。
8. 传入输入并执行工作流
inputs = {"messages": [HumanMessage(content="what is the temperature in las vegas?")]} # what is the temperature in las vegas
- 作用:
- 定义了工作流的初始输入状态,是一个字典,键为
"messages",值为包含一个HumanMessage对象的列表。 - 这个
HumanMessage的内容为 “what is the temperature in las vegas?”,即用户询问拉斯维加斯的温度。
- 定义了工作流的初始输入状态,是一个字典,键为
- 举例:当用户在聊天窗口输入这个问题后,系统会将其包装成
HumanMessage对象传入工作流。
result = app.invoke(inputs)
print('type result=====\n\n\n', type(result))
print('result=====\n\n\n', result)
- 作用:
- 使用编译好的工作流
app调用invoke方法,并传入初始输入。 - 将执行结果保存到
result中,并打印结果的类型和内容。
- 使用编译好的工作流
- 举例:
- 假设工作流执行完后返回了一个消息列表,其中可能包含从 OpenWeatherMap 查询到的温度信息,控制台就会输出类似:
type result===== <class 'dict'>result===== {'messages': [ToolMessage(...)]} - 这样你就可以看到整个流程是如何从用户询问,到模型判断调用工具,再到实际查询并返回结果的。
- 假设工作流执行完后返回了一个消息列表,其中可能包含从 OpenWeatherMap 查询到的温度信息,控制台就会输出类似:
总结
整个代码构建了一个基于状态机的对话工作流,主要步骤如下:
- 初始化:导入相关库,并配置好一个天气查询工具和一个 OpenAI 聊天模型。
- 工具绑定:将工具转换并绑定到模型上,使得模型能够在必要时调用外部 API(这里是天气查询)。
- 定义节点函数:
function_1(agent 节点):处理用户输入,生成回复,可能包含工具调用指令。function_2(tool 节点):解析 agent 的回复中是否包含工具调用信息,若有则提取参数并调用工具,最后将工具结果封装成消息返回。
- 构建工作流图:设置节点之间的转移规则,例如:如果 agent 的回复中包含工具调用信息,就跳转到 tool 节点,否则结束;工具执行完后再回到 agent 节点。
- 启动工作流:传入用户问题(例如查询拉斯维加斯温度),依次执行 agent 和 tool 节点,最终打印出结果。
通俗举例:
想象你和一个智能助手对话:
- 第一步:你问:“拉斯维加斯现在几度?”
- 第二步:智能助手(agent)生成回复,并发现需要查询天气数据(包含一个工具调用指令)。
- 第三步:系统自动跳转到工具执行部分(tool),根据指令调用天气查询 API,获得当前温度。
- 第四步:查询结果返回给智能助手,然后你看到最终的回复,比如“拉斯维加斯当前温度为 28°C”。
这种设计让智能助手既能生成自然语言回复,又能在必要时调用外部工具获取实时数据,从而提升回答的准确性和实用性。
相关文章:
大语言模型 智能助手——既能生成自然语言回复,又能在必要时调用外部工具获取实时数据
示例代码: import json from langgraph.graph import Graph, END,StateGraph from langchain_core.utils.function_calling import convert_to_openai_function from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun from langchain_core…...
人工智能开发面经AI、大数据、算法
以下是一份AI算法开发岗位的面试面经,结合最新行业趋势和经典问题,涵盖技术解析与实战案例,供参考: 一、机器学习基础(占比约30%) 1. 过拟合与欠拟合的解决方案 问题:如何解决模型过拟合&…...
计算机网络——子网掩码
一、子网掩码是什么?它长什么样? 子网掩码的定义 子网掩码是一个32位的二进制数字,与IP地址“配对使用”,用于标识IP地址中哪部分属于网络地址,哪部分属于主机地址。 示例:IP地址 192.168.1.10,…...
《基于大数据的相州镇新农村商务数据分析与研究》开题报告
目录 一、选题依据 1.选题背景 2.国内外研究现状与水平 (1)国外研究现状 (2)国内研究现状 3.发展趋势 4.研究意义 二、研究内容 1.学术构思与思路 (1)主要研究内容 (2)拟解决的关键问…...
Linux : 环境变量
目录 一 环境变量 1.基本概念 二 常见环境变量 三 查看环境变量的方法 1.env:查看系统中所有环境变量 2. echo $NAME 四 如何不带路径也能运行的自己的程序 1.将自己的程序直接添加到PATH指定的路径下 五 环境变量与本地变量 1.本地变量 2. 环境变量 六C、C中main()…...
SQL-labs13-16闯关记录
http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1,依然是一个登录框,POST型SQL注入 2,挂上burpsuite,然后抓取请求,构造请求判断漏洞类型和闭合条件 admin 发生了报错,根据提示闭合方式是(…...
2025-03-04 学习记录--C/C++-PTA 习题5-4 使用函数求素数和
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 二、代码(C语言)⭐️ #include <stdio.h>// 函数声明:判断一个数是…...
Mybatis-Plus 插件机制与自定义插件实现
1. Mybatis-Plus 插件系统概述 Mybatis-Plus 提供了一个简单而强大的插件机制,允许开发者在 MyBatis 执行 SQL 的过程中插入自定义逻辑。通过插件机制,用户可以实现对 SQL 执行过程的拦截和修改。Mybatis-Plus 插件基于 MyBatis 的拦截器模式进行实现&a…...
Virtuose 6D TAO HF力反馈系统:加强力遥操作主手
Virtuose 6D TAO是一款搭载六主动自由度的力反馈设备,该产品自带被动式夹持器,工作空间大,可与EtherCAT接口通信,是轻松控制从机械臂的首选产品,特别适合工业遥操作、核工业遥操作等应用。 产品特点 ▪ 六主动自由度、…...
使用AI后为什么思考会变得困难?
使用AI后为什么思考会变得困难? 我总结了四篇近期的研究论文,来展示AI是如何以及为什么侵蚀我们的批判性思维能力。 作者使用AI制作的图像 前言:作者在这篇文章中,借AI技术的崛起,揭示了一场悄然发生的思想博弈。表面…...
【Resis实战分析】Redis问题导致页面timeout知识点分析
事故现象:前端页面返回timeout 事故回溯总结一句话: (1)因为大KEY调用量,随着白天自然流量趋势增长而增长,最终在业务高峰最高点期占满带宽使用100%。   (2&#x…...
【金融量化】Ptrade中交易环境支持的业务类型
1. 普通股票买卖 • 特点: 普通股票买卖是最基础的交易形式,投资者通过买入和卖出上市公司的股票来获取收益。 ◦ 流动性高:股票市场交易活跃,买卖方便。 ◦ 收益来源多样:包括股价上涨的资本利得和公司分红。 ◦ 风险…...
FlashMLA(DeepSeek开源周,第一个框架):含源码分析
1. 概述 FlashMLA 是由 DeepSeek 原创开发的一种深度学习框架,专门用于加速多头注意力机制(MLA)架构的推理过程。它通过优化内存管理和计算效率,显著提升了模型在高性能 GPU 上的推理速度。FlashMLA 主要适用于 DeepSeek 的架构模…...
点大商城V2-2.6.6.1全能版源码+最新排队免单插件功能
一.介绍 点大商城V2独立开源版本,版本更新至2.6.6,系统支持多端,前端为UNiapp,多端编译。 二.安装环境: Nginx 1.22PHP7.3MySQL 5.7 推荐PHP 7.3(不得大于此版本,否则容易出bug) …...
行为模式---命令模式
概念 命令模式是一种行为设计模式,它的核心思想就是将请求封装为一个对象,此对象包含与请求相关的所有信息。可以用不同的请求对客户进行参数化。命令模式通过将请求的发送者和接收者解耦,支持请求的排队、记录、撤销等操作。 使用场景 1、…...
Graph RAG 迎来记忆革命:“海马体”机制让问答更精准!
随着生成式 AI 技术的快速发展,RAG(Retrieval-Augmented Generation)和 Agent 成为企业应用大模型的最直接途径。然而,传统的 RAG 系统在准确性和动态学习能力上存在明显不足,尤其是在处理复杂上下文和关联性任务时表现不佳。近期,一篇论文提出了 HippoRAG 2,这一新型 R…...
Linux——基本指令
我们今天学习Linux最基础的指令 ls 指令 语法: ls [选项] [⽬录或⽂件] 功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信 息。 命令中的选项,一次可以传递多个 ,…...
【C++】模板编程入门指南:零基础掌握泛型编程核心(初阶)
文章目录 一、泛型编程二、函数模板1. 函数模板的概念和格式2. 函数模板的原理3. 函数模板的实例化隐式实例化显式实例化 三、类模板 一、泛型编程 泛型编程就是编写与类型无关的通用代码,是代码复用的一种手段,模板是泛型编程的基础,可能不太…...
React实现lottie文件预览(可识别json文件或压缩包带资源的素材)
React实现lottie文件预览(可识别json文件或压缩包带资源的素材) 🔴 1、React实现lottie文件预览,所用到的第三方库 🟢 1.1、 react-lottie jszip-syncnpm install react-lottie jszip-sync // 或者yarn add react-…...
网上打印平台哪个好用?网上打印资料推荐
网上打印平台哪个好用 随着数字化办公的普及,网上打印平台因其便捷性和经济性而受到越来越多人的青睐。无论是学生、上班族还是个人用户,在需要快速打印资料时,一个好用的在线打印服务可以大大节省时间和成本。 那么,如何选择一…...
Mac远程桌面软件哪个好用?
远程桌面软件能帮助我们快速的远程控制另一台电脑,从而提供远程帮助,或者进行远程办公。那么,对macOS系统有什么好用的Mac远程桌面软件呢? 远程看看是一款操作简单、界面简洁的远程桌面软件,支持跨平台操作࿰…...
【回溯 力扣】17. 电话号码的字母组合
题目 17. 电话号码的字母组合 思路 定义数组存储数字对应的字符串,本题回溯时为index1,因为下一个数字选的是下一个字符串,前两题都是属于同一个字符串。 代码 class Solution { private:vector<string>result;string duiying[10]{"&quo…...
【基础1】冒泡排序
核心思想 冒泡排序是通过相邻元素的连续比较和交换,使得较大的元素逐渐"浮"到数组的末尾,如同水中气泡上浮的过程 特点: 每轮遍历将最大的未排序元素移动到正确位置稳定排序:相等元素的相对位置保持不变原地排序…...
C#—Settings配置详解
C#—Settings配置详解 在C#项目中,全局配置通常指的是应用程序的设置(settings),这些设置可以跨多个类或组件使用,并且通常用于存储应用程序的配置信息,如数据库连接字符串、用户偏好设置等。 Settings配置…...
详解DeepSeek模型底层原理及和ChatGPT区别点
一、DeepSeek大模型原理 架构基础 DeepSeek基于Transformer架构,Transformer架构主要由编码器和解码器组成,在自然语言处理任务中,通常使用的是Transformer的解码器部分。它的核心是自注意力机制(Self - Attention),这个机制允许模型在处理输入序列时,关注序列中不同位…...
PyCharm中通过命令行执行`pip`命令下载到哪里了:虚拟环境目录下
PyCharm中通过命令行执行pip命令下载到哪里了:虚拟环境目录下 在PyCharm中通过命令行执行pip命令安装工具包,包的下载位置取决于多种因素 虚拟环境 如果项目使用了虚拟环境(通常是推荐的做法): Windows:虚拟环境通常位于项目目录下的.venv文件夹(默认情况)或你指定…...
Golang的性能分析指标解读
Golang的性能分析指标解读 一、概述 语言)是一种由Google开发的开源编程语言,以其并发性能和高效的编译速度而闻名。对于程序员来说,了解如何对Golang应用程序进行性能分析是非常重要的,因为这能帮助他们发现潜在的性能瓶颈并对其…...
QT 作业 day4
作业 代码 Widget.h class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private slots:// 槽函数void on_listWidget_itemDoubleClicked(QListWidgetItem *item);private:Ui::Widget *ui; }; #endif Widget.cpp Widget::Widget(QW…...
力扣刷题——4.寻找两个正序数组的中位数
题目要求在两个有序数组中找到中位数。由于时间复杂度要求为 O(log(mn)),因此不能简单地将两个数组合并后再找中位数,而是需要用二分查找的思路来解决。 解决思路:二分查找 将问题转化为在两个有序数组中寻找第 k小的数,其中 k 是…...
redis 与 DB 的一致性 7 种策略
为什么要使用 redis 做缓存?封底估算为什么是单行数据的QPS,而不是总的? 什么时候使用DB,Redis,本地缓存 数据的分类一致性的方案1. 先清除Redis,再更新 DB2. 先更新DB,再清除 Redis使用场景: 3. 延迟删除与延迟双删使用场景 4. 监听 binlog 清除5. 双写使用场景: 6. 监听bin…...
