4. 查看并更新langgraph节点

news2024/11/14 19:59:41

导入必要的库和设置工具

首先,我们需要导入一些必要的库,并设置我们的工具。这些工具将用于在Spotify和Apple Music上播放歌曲。

from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.graph import MessagesState, START
from langgraph.prebuilt import ToolNode
from langgraph.graph import END, StateGraph
from langgraph.checkpoint.memory import MemorySaver

接下来,我们定义两个工具函数,一个用于在Spotify上播放歌曲,另一个用于在Apple Music上播放歌曲。

@tool
def play_song_on_spotify(song: str):
    """Play a song on Spotify"""
    return f"Successfully played {song} on Spotify!"

@tool
def play_song_on_apple(song: str):
    """Play a song on Apple Music"""
    return f"Successfully played {song} on Apple Music!"

然后,我们将这些工具封装在一个ToolNode中,并设置我们的模型。

tools = [play_song_on_apple, play_song_on_spotify]
tool_node = ToolNode(tools)

model = ChatOpenAI(openai_api_base="https://api.lingyiwanwu.com/v1", openai_api_key="YOUR_API_KEY", model="yi-large-fc")
model = model.bind_tools(tools, parallel_tool_calls=False)

定义工作流和状态图

现在,我们将定义一个工作流,该工作流将包含一个代理节点和一个动作节点。代理节点将调用模型,而动作节点将执行工具函数。

def should_continue(state):
    messages = state["messages"]
    last_message = messages[-1]

    if not last_message.tool_calls:
        return "end"

    else:
        return "continue"

def call_model(state):
    messages = state["messages"]
    response = model.invoke(messages)

    return {"messages": [response]}

workflow = StateGraph(MessagesState)

workflow.add_node("agent", call_model)
workflow.add_node("action", tool_node)

workflow.add_edge(START, "agent")

workflow.add_conditional_edges(
    "agent", 
    should_continue,   
    {
        "continue": "action",
        "end": END,
    },
)

workflow.add_edge("action", "agent")

memory = MemorySaver()

app = workflow.compile(checkpointer=memory)

我们可以使用draw_mermaid_png方法来可视化这个状态图。

from IPython.display import Image, display
display(Image(app.get_graph().draw_mermaid_png()))

在这里插入图片描述

运行工作流

现在,我们可以运行我们的工作流了。我们首先创建一个HumanMessage对象,然后将其传递给我们的应用。

from langchain_core.messages import HumanMessage

config = {"configurable": {"thread_id": "1"}}
input_message = HumanMessage(content="Can you play Taylor Swift's most popular song?")
for event in app.stream({"messages": [input_message]}, config, stream_mode="values"):
    event["messages"][-1].pretty_print()
================================[1m Human Message [0m=================================

Can you play Taylor Swift's most popular song?
==================================[1m Ai Message [0m==================================
Tool Calls:
  play_song_on_spotify (call_2xNBN9YmS_GUhm7XFNP3dw)
 Call ID: call_2xNBN9YmS_GUhm7XFNP3dw
  Args:
    song: Taylor Swift's most popular song
=================================[1m Tool Message [0m=================================
Name: play_song_on_spotify

Successfully played Taylor Swift's most popular song on Spotify!
==================================[1m Ai Message [0m==================================

I have successfully played Taylor Swift's most popular song on Spotify!

查看和更新状态

我们可以使用get_state方法来查看应用的当前状态,并使用get_state_history方法来查看状态历史。

app.get_state(config).values["messages"]
[HumanMessage(content="Can you play Taylor Swift's most popular song?", additional_kwargs={}, response_metadata={}, id='eecdf1a1-e6b4-4a13-b4e9-9c478ca96c55'),
 AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'function': {'arguments': '{"song":"Taylor Swift\'s most popular song"}', 'name': 'play_song_on_spotify'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 33, 'prompt_tokens': 22, 'total_tokens': 55, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-d7dc8d82-dd8d-47c0-94a8-5bc7a2ca5af2-0', tool_calls=[{'name': 'play_song_on_spotify', 'args': {'song': "Taylor Swift's most popular song"}, 'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'type': 'tool_call'}], usage_metadata={'input_tokens': 22, 'output_tokens': 33, 'total_tokens': 55, 'input_token_details': {}, 'output_token_details': {}}),
 ToolMessage(content="Successfully played Taylor Swift's most popular song on Spotify!", name='play_song_on_spotify', id='31c7cd35-b414-49ff-8ce8-72f4fbfd8f81', tool_call_id='call_2xNBN9YmS_GUhm7XFNP3dw'),
 AIMessage(content="I have successfully played Taylor Swift's most popular song on Spotify! ", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 68, 'total_tokens': 85, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-9e58f0c3-d4de-417a-bafa-7c448c5c3ede-0', usage_metadata={'input_tokens': 68, 'output_tokens': 17, 'total_tokens': 85, 'input_token_details': {}, 'output_token_details': {}})]
all_states = []
for state in app.get_state_history(config):
    print(state)
    all_states.append(state)
    print("--")
StateSnapshot(values={'messages': [HumanMessage(content="Can you play Taylor Swift's most popular song?", additional_kwargs={}, response_metadata={}, id='eecdf1a1-e6b4-4a13-b4e9-9c478ca96c55'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'function': {'arguments': '{"song":"Taylor Swift\'s most popular song"}', 'name': 'play_song_on_spotify'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 33, 'prompt_tokens': 22, 'total_tokens': 55, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-d7dc8d82-dd8d-47c0-94a8-5bc7a2ca5af2-0', tool_calls=[{'name': 'play_song_on_spotify', 'args': {'song': "Taylor Swift's most popular song"}, 'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'type': 'tool_call'}], usage_metadata={'input_tokens': 22, 'output_tokens': 33, 'total_tokens': 55, 'input_token_details': {}, 'output_token_details': {}}), ToolMessage(content="Successfully played Taylor Swift's most popular song on Spotify!", name='play_song_on_spotify', id='31c7cd35-b414-49ff-8ce8-72f4fbfd8f81', tool_call_id='call_2xNBN9YmS_GUhm7XFNP3dw'), AIMessage(content="I have successfully played Taylor Swift's most popular song on Spotify! ", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 68, 'total_tokens': 85, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-9e58f0c3-d4de-417a-bafa-7c448c5c3ede-0', usage_metadata={'input_tokens': 68, 'output_tokens': 17, 'total_tokens': 85, 'input_token_details': {}, 'output_token_details': {}})]}, next=(), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1efa1985-b182-61d6-8003-07e9a72803a6'}}, metadata={'source': 'loop', 'writes': {'agent': {'messages': [AIMessage(content="I have successfully played Taylor Swift's most popular song on Spotify! ", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 68, 'total_tokens': 85, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-9e58f0c3-d4de-417a-bafa-7c448c5c3ede-0', usage_metadata={'input_tokens': 68, 'output_tokens': 17, 'total_tokens': 85, 'input_token_details': {}, 'output_token_details': {}})]}}, 'step': 3, 'parents': {}}, created_at='2024-11-13T08:22:00.718383+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1efa1985-a322-6b97-8002-91857b204400'}}, tasks=())
--
StateSnapshot(values={'messages': [HumanMessage(content="Can you play Taylor Swift's most popular song?", additional_kwargs={}, response_metadata={}, id='eecdf1a1-e6b4-4a13-b4e9-9c478ca96c55'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'function': {'arguments': '{"song":"Taylor Swift\'s most popular song"}', 'name': 'play_song_on_spotify'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 33, 'prompt_tokens': 22, 'total_tokens': 55, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-d7dc8d82-dd8d-47c0-94a8-5bc7a2ca5af2-0', tool_calls=[{'name': 'play_song_on_spotify', 'args': {'song': "Taylor Swift's most popular song"}, 'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'type': 'tool_call'}], usage_metadata={'input_tokens': 22, 'output_tokens': 33, 'total_tokens': 55, 'input_token_details': {}, 'output_token_details': {}}), ToolMessage(content="Successfully played Taylor Swift's most popular song on Spotify!", name='play_song_on_spotify', id='31c7cd35-b414-49ff-8ce8-72f4fbfd8f81', tool_call_id='call_2xNBN9YmS_GUhm7XFNP3dw')]}, next=('agent',), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1efa1985-a322-6b97-8002-91857b204400'}}, metadata={'source': 'loop', 'writes': {'action': {'messages': [ToolMessage(content="Successfully played Taylor Swift's most popular song on Spotify!", name='play_song_on_spotify', id='31c7cd35-b414-49ff-8ce8-72f4fbfd8f81', tool_call_id='call_2xNBN9YmS_GUhm7XFNP3dw')]}}, 'step': 2, 'parents': {}}, created_at='2024-11-13T08:21:59.211304+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1efa1985-a31b-66bf-8001-6b59c0db8cfe'}}, tasks=(PregelTask(id='f1463cbd-8f99-eea6-67cc-6c721fced5e4', name='agent', path=('__pregel_pull', 'agent'), error=None, interrupts=(), state=None, result={'messages': [AIMessage(content="I have successfully played Taylor Swift's most popular song on Spotify! ", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 68, 'total_tokens': 85, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-9e58f0c3-d4de-417a-bafa-7c448c5c3ede-0', usage_metadata={'input_tokens': 68, 'output_tokens': 17, 'total_tokens': 85, 'input_token_details': {}, 'output_token_details': {}})]}),))
--
StateSnapshot(values={'messages': [HumanMessage(content="Can you play Taylor Swift's most popular song?", additional_kwargs={}, response_metadata={}, id='eecdf1a1-e6b4-4a13-b4e9-9c478ca96c55'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'function': {'arguments': '{"song":"Taylor Swift\'s most popular song"}', 'name': 'play_song_on_spotify'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 33, 'prompt_tokens': 22, 'total_tokens': 55, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-d7dc8d82-dd8d-47c0-94a8-5bc7a2ca5af2-0', tool_calls=[{'name': 'play_song_on_spotify', 'args': {'song': "Taylor Swift's most popular song"}, 'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'type': 'tool_call'}], usage_metadata={'input_tokens': 22, 'output_tokens': 33, 'total_tokens': 55, 'input_token_details': {}, 'output_token_details': {}})]}, next=('action',), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1efa1985-a31b-66bf-8001-6b59c0db8cfe'}}, metadata={'source': 'loop', 'writes': {'agent': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'function': {'arguments': '{"song":"Taylor Swift\'s most popular song"}', 'name': 'play_song_on_spotify'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 33, 'prompt_tokens': 22, 'total_tokens': 55, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-d7dc8d82-dd8d-47c0-94a8-5bc7a2ca5af2-0', tool_calls=[{'name': 'play_song_on_spotify', 'args': {'song': "Taylor Swift's most popular song"}, 'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'type': 'tool_call'}], usage_metadata={'input_tokens': 22, 'output_tokens': 33, 'total_tokens': 55, 'input_token_details': {}, 'output_token_details': {}})]}}, 'step': 1, 'parents': {}}, created_at='2024-11-13T08:21:59.208313+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1efa1985-8a73-6a65-8000-0b9a2c5c2c0e'}}, tasks=(PregelTask(id='bf19a6f7-20fa-d472-3b76-cfb22f386a5d', name='action', path=('__pregel_pull', 'action'), error=None, interrupts=(), state=None, result={'messages': [ToolMessage(content="Successfully played Taylor Swift's most popular song on Spotify!", name='play_song_on_spotify', id='31c7cd35-b414-49ff-8ce8-72f4fbfd8f81', tool_call_id='call_2xNBN9YmS_GUhm7XFNP3dw')]}),))
--
StateSnapshot(values={'messages': [HumanMessage(content="Can you play Taylor Swift's most popular song?", additional_kwargs={}, response_metadata={}, id='eecdf1a1-e6b4-4a13-b4e9-9c478ca96c55')]}, next=('agent',), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1efa1985-8a73-6a65-8000-0b9a2c5c2c0e'}}, metadata={'source': 'loop', 'writes': None, 'step': 0, 'parents': {}}, created_at='2024-11-13T08:21:56.623011+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1efa1985-8a6e-6c89-bfff-69f5d699568e'}}, tasks=(PregelTask(id='a4faf1b9-d4e2-bc5a-ae11-1ff31b8a719a', name='agent', path=('__pregel_pull', 'agent'), error=None, interrupts=(), state=None, result={'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'function': {'arguments': '{"song":"Taylor Swift\'s most popular song"}', 'name': 'play_song_on_spotify'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 33, 'prompt_tokens': 22, 'total_tokens': 55, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-d7dc8d82-dd8d-47c0-94a8-5bc7a2ca5af2-0', tool_calls=[{'name': 'play_song_on_spotify', 'args': {'song': "Taylor Swift's most popular song"}, 'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'type': 'tool_call'}], usage_metadata={'input_tokens': 22, 'output_tokens': 33, 'total_tokens': 55, 'input_token_details': {}, 'output_token_details': {}})]}),))
--
StateSnapshot(values={'messages': []}, next=('__start__',), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1efa1985-8a6e-6c89-bfff-69f5d699568e'}}, metadata={'source': 'input', 'writes': {'__start__': {'messages': [HumanMessage(content="Can you play Taylor Swift's most popular song?", additional_kwargs={}, response_metadata={})]}}, 'step': -1, 'parents': {}}, created_at='2024-11-13T08:21:56.621018+00:00', parent_config=None, tasks=(PregelTask(id='c154f1c6-2dbb-9cf0-197d-cdbd0f566dd7', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result={'messages': [HumanMessage(content="Can you play Taylor Swift's most popular song?", additional_kwargs={}, response_metadata={}, id='eecdf1a1-e6b4-4a13-b4e9-9c478ca96c55')]}),))
--

我们可以选择一个状态进行重放,或者更新状态并重新运行工作流。

to_replay = all_states[2]
to_replay.values
{'messages': [HumanMessage(content="Can you play Taylor Swift's most popular song?", additional_kwargs={}, response_metadata={}, id='eecdf1a1-e6b4-4a13-b4e9-9c478ca96c55'),
  AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'function': {'arguments': '{"song":"Taylor Swift\'s most popular song"}', 'name': 'play_song_on_spotify'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 33, 'prompt_tokens': 22, 'total_tokens': 55, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-d7dc8d82-dd8d-47c0-94a8-5bc7a2ca5af2-0', tool_calls=[{'name': 'play_song_on_spotify', 'args': {'song': "Taylor Swift's most popular song"}, 'id': 'call_2xNBN9YmS_GUhm7XFNP3dw', 'type': 'tool_call'}], usage_metadata={'input_tokens': 22, 'output_tokens': 33, 'total_tokens': 55, 'input_token_details': {}, 'output_token_details': {}})]}
for event in app.stream(None, to_replay.config):
    for v in event.values():
        print(v)
{'messages': [ToolMessage(content="Successfully played Taylor Swift's most popular song on Spotify!", name='play_song_on_spotify', id='dbd6cda4-78f2-4874-bbca-99318fd79d46', tool_call_id='call_2xNBN9YmS_GUhm7XFNP3dw')]}
{'messages': [AIMessage(content="I have played Taylor Swift's most popular song on Spotify. Enjoy! ", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 18, 'prompt_tokens': 68, 'total_tokens': 86, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-5e138398-87ab-408e-a21c-d1883dcff442-0', usage_metadata={'input_tokens': 68, 'output_tokens': 18, 'total_tokens': 86, 'input_token_details': {}, 'output_token_details': {}})]}

我们可以通过更新状态中的消息来改变工作流的行为。

last_message = to_replay.values["messages"][-1]

last_message.tool_calls[0]["name"] = "play_song_on_apple"

branch_config = app.update_state(
    to_replay.config,
    {"messages": [last_message]},
)
for event in app.stream(None, branch_config):
    for v in event.values():
        print(v)
{'messages': [ToolMessage(content="Successfully played Taylor Swift's most popular song on Apple Music!", name='play_song_on_apple', id='25c9c1a7-935f-44ea-a8c5-a3dda3497578', tool_call_id='call_2xNBN9YmS_GUhm7XFNP3dw')]}
{'messages': [AIMessage(content="I have successfully played Taylor Swift's most popular song on Apple Music for you! ", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 19, 'prompt_tokens': 68, 'total_tokens': 87, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'yi-large-fc', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-7f8c8d4e-21ab-46ad-854d-53e42b47599c-0', usage_metadata={'input_tokens': 68, 'output_tokens': 19, 'total_tokens': 87, 'input_token_details': {}, 'output_token_details': {}})]}

我们也可以完全替换状态中的消息。

from langchain_core.messages import AIMessage

last_message = to_replay.values["messages"][-1]

new_message = AIMessage(
    content="It's quiet hours so I can't play any music right now!", id=last_message.id
)

branch_config = app.update_state(
    to_replay.config,
    {"messages": [new_message]},
)
branch_state = app.get_state(branch_config)
branch_state.values
{'messages': [HumanMessage(content="Can you play Taylor Swift's most popular song?", additional_kwargs={}, response_metadata={}, id='eecdf1a1-e6b4-4a13-b4e9-9c478ca96c55'),
  AIMessage(content="It's quiet hours so I can't play any music right now!", additional_kwargs={}, response_metadata={}, id='run-d7dc8d82-dd8d-47c0-94a8-5bc7a2ca5af2-0')]}
branch_state.next
()

通过这些步骤,我们可以看到如何使用LangChain和LangGraph来创建、运行和更新一个音乐播放的工作流。

参考链接:https://langchain-ai.github.io/langgraph/how-tos/human_in_the_loop/time-travel/#replay-a-state

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

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

相关文章

使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面

今天上线的时候发现系统不同显示好像不一样,苹果手机打开的时候是正常的,但是一旦用安卓手机打开就会出现label不置顶的情况。尝试了很多种办法,也在官方查看了map相关的文档,发现并没有给label设置zIndex的属性,只看到…

【专题】计算机网络之网络层

1. 网络层的几个重要概念 1.1 网络层提供的两种服务 (1) 让网络负责可靠交付 计算机网络模仿电信网络,使用面向连接的通信方式。 通信之前先建立虚电路 VC (Virtual Circuit) (即连接),以保证双方通信所需的一切网络资源。 如果再使用可靠传输的网络…

vTESTstudio系列15--vTESTstudio-Doors的需求和测试用例的管理

最近有朋友在咨询vTESTstudio中怎么去跟Doors里面的需求去做好管理这方面的问题,临时加两篇文章介绍一下,Lets Go!!! 目录 1.Doors的配置: 1.1 安装Doors AddIn for vTESTstudio: 1.2 更新XML脚本: 1.3 导出需求的Trace Item…

波动中的金钥匙:趋势震荡指标——源码公布,仅供学习

趋势与震荡,两者在市场运行中紧密相连,相互影响。趋势往往是震荡累积后的自然延伸,而震荡则常常是趋势形成与调整的前奏。在各类行情与不同时间周期中,当前的震荡不过是更大周期趋势中的一个组成部分;相应的&#xff0…

面试_ABtest原理简介

01 什么是ABtest ABtest来源于假设检验,现有两个随机均匀的有样本组A、B,对其中一个组A做出某种改动,实验结束后分析两组用户行为数据,通过显著性检验,判断这个改动对于我们所关注的核心指标是否有显著的影响&#xf…

‘nodemon‘ 不是内部或外部命令,也不是可运行的程序

解决方法:使用 npx 临时运行 nodemon 如果你不想全局安装 nodemon,你可以使用 npx(npm 5.2 及以上版本自带)来临时运行 nodemon: npx nodemon server.jsnodemon正常配置 要在开发过程中实现每次修改 Node.js 代码后…

计算机网络基础(3)_应用层自定义协议与序列化

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络基础(3)_应用层自定义协议与序列化 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论&a…

E2E、CRC、Checksum、Rollingcounter

文章目录 前言1、E2E2、CRC3、Checksum4、Rollingcounter总结 前言 在专栏文章仿真CAN报文发送的CRC校验算法(附CAPL代码)和同星TSMaster中如何自定义E2E校验算法中分别给出了CRC算法和E2E校验实现,从中也明白了为什么在测试中需要去做这些仿…

嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻

引言:对于嵌入式硬件这个庞大的知识体系而言,太多离散的知识点很容易疏漏,因此对于这些容易忘记甚至不明白的知识点做成一个梳理,供大家参考以及学习,本文主要针对推挽、开漏、高阻态、上拉电阻这些知识点的学习。 目…

二叉树面试题(C 语言)

目录 1. 单值二叉树2. 相同的树3. 对称二叉树4. 二叉树的前序遍历5. 二叉树的中序遍历6. 二叉树的后序遍历7. 另一颗树的子树8. 通过前序遍历返回中序遍历 1. 单值二叉树 题目描述: 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有…

MFC中Excel的导入以及使用步骤

参考地址 在需要对EXCEL表进行操作的类中添加以下头文件:若出现大量错误将其放入stdafx.h中 #include "resource.h" // 主符号 #include "CWorkbook.h" //单个工作簿 #include "CRange.h" //区域类,对Excel大…

【C++】类中的“默认成员函数“--构造函数、析构函数、拷贝构造、赋值运算符重载

目录 "默认"成员函数 概念引入: 一、构造函数 问题引入: 1)构造函数的概念 2)构造函数实例 3)构造函数的特性 4)关于默认生成的构造函数 (默认构造函数) 默认构造函数未完成初始化工作实例: 二…

LeetCode【0052】N皇后II

本文目录 1 中文题目2 求解方法:位运算回溯法2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回 n 皇后问…

C语言-详细讲解-P1009 [NOIP1998 普及组] 高精度阶乘之和

目录 1.题目要求 2.题目解读 3.代码实现 4.一些小细节 1.数组储存大整数方式 2.memset函数介绍 3.digit与sum的关系 1.题目要求 2.题目解读 这道题本质就是高精度乘法高精度加法的结合,我之前有出过 高精度算法-保姆级讲解 希望详细了解的小伙伴可以去…

浅谈:基于三维场景的视频融合方法

视频融合技术的出现可以追溯到 1996 年 , Paul Debevec等 提出了与视点相关的纹理混合方法 。 也就是说 , 现实的漫游效果不是从摄像机的角度来看 , 但其仍然存在很多困难 。基于三维场景的视频融合 , 因其直观等特效在视频监控等相关领域有着…

Qt_day10_程序打包(完结)

目录 1. 设置图标 2. Debug和Release版本 3. 动态链接库 4. 打包 5. 联系项目要求 Qt开发的程序最终都是要给用户使用的,用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包,用户直接下载并安装即可使用…

路径规划——RRT-Connect算法

路径规划——RRT-Connect算法 算法原理 RRT-Connect算法是在RRT算法的基础上进行的扩展,引入了双树生长,分别以起点和目标点为树的根节点同时扩展随机树从而实现对状态空间的快速搜索。在此算法中以两棵随机树建立连接为路径规划成功的条件。并且&…

【项目开发 | 跨域认证】JSON Web Token(JWT)

未经许可,不得转载。 文章目录 JWT设计背景:跨域认证JWT 原理JWT 结构JWT 使用方式注意JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理、结构及用法。 JWT设计背景:跨域认证 互联网服务的用户认证流程是现代应用中的核心组成部分,通常的流程…

学习笔记——PLCT:milk-v duo(持续更新)

买板子 官方标配有可能是单板(如下图)无工具包,记得买之前问一下客服。

Kubernetes-ArgoCD篇-01-简介

1、什么是Argo CD Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。 Argo CD官方文档地址:https://argo-cd.readthedocs.io Argo CD源码地址:https://github.com/argoproj/argo-cd 1.1 关于Argo Argo是一个开源的项目,主要是扩…