茂名手机网站制作,外贸流程,做淘宝客最好的网站是什么网站,开发微信公众平台商城创建一个聊天机器人#xff0c;帮助用户生成提示。它将首先收集用户的需求#xff0c;然后生成提示#xff08;并根据用户输入进行优化#xff09;。这些功能被分为两个独立的状态#xff0c;而 LLM 决定何时在这两个状态之间切换。 测试结果如下#xff1a; from typing…创建一个聊天机器人帮助用户生成提示。它将首先收集用户的需求然后生成提示并根据用户输入进行优化。这些功能被分为两个独立的状态而 LLM 决定何时在这两个状态之间切换。 测试结果如下 from typing import Annotated,List,Literal
from typing_extensions import TypedDict
from langchain_deepseek import ChatDeepSeek
from langchain_tavily import TavilySearch
from langchain_core.messages import BaseMessage,SystemMessage,AIMessage,HumanMessage,ToolMessage
from typing_extensions import TypedDictfrom langgraph.graph import StateGraph,START, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
from langchain_core.tools import tool
from langgraph.checkpoint.memory import MemorySaverfrom langgraph.types import Command, interrupt
from pydantic import BaseModelimport os
from dotenv import load_dotenv# 加载.env文件中的环境变量
load_dotenv()template 你的任务是从用户那里获取他们想要创建哪种提示模板的信息。你应该从他们那里获取以下信息- 提示的目标是什么
- 哪些变量将被传递到提示模板中
- 输出不应该做什么的任何限制
- 输出必须遵守的任何要求如果你无法辨别这些信息请要求他们澄清不要试图胡乱猜测。在你能辨别所有信息后调用相关工具。def get_messages_info(messages):return [SystemMessage(contenttemplate)]messagesclass PromptInstructions(BaseModel):关于如何提示LLM的说明objective:strvariables:List[str]constraints:List[str]requirements:List[str]llm ChatDeepSeek(modeldeepseek-chat,api_keyos.getenv(DEEPSEEK_API_KEY))llm_with_tool llm.bind_tools([PromptInstructions])def info_chain(state):messages get_messages_info(state[messages])response llm_with_tool.invoke(messages)return {messages: [response]}# 现在设置将生成提示的状态。这需要单独的系统消息以及一个函数来过滤掉所有工具调用之前的消息因为那是前一个状态决定生成提示的时候
prompt_system 根据以下要求编写一个良好的提示模板:{reqs} # 获取提示消息的函数
# 仅获取工具调用后的消息
def get_prompt_messages(messages:list):tool_call Noneother_msgs[]for msg in messages:if isinstance(msg, AIMessage) and msg.tool_calls:tool_call msg.tool_calls[0][args]elif isinstance(msg,ToolMessage):continueelif tool_call is not None:other_msgs.append(msg)return [SystemMessage(contentprompt_system.format(reqstool_call))]other_msgsdef prompt_gen_chain(state):messages get_prompt_messages(state[messages])response llm.invoke(messages)return {messages: [response]}# 定义状态逻辑
# 聊天机器人所处状态的逻辑。如果最后一条消息是工具调用那么我们处于提示创建者 prompt 应该回应的状态。
# 否则如果最后一条消息不是 HumanMessage那么我们知道人类应该下一个回应所以我们处于 END 状态。
# 如果最后一条消息是 HumanMessage那么如果之前有工具调用我们处于 prompt 状态。否则我们处于信息收集 info 状态。
def get_state(state):messages state[messages]if(isinstance(messages[-1],AIMessage) and messages[-1].tool_calls):return add_tool_messageselif not isinstance(messages[-1],HumanMessage):return ENDreturn info# 创建图
# 现在可以创建这个图了。我们将使用一个 SqliteSaver 来持久化对话历史。
class State(TypedDict):messages:Annotated[List,add_messages]memory MemorySaver()
workflow StateGraph(State)
workflow.add_node(info,info_chain)
workflow.add_node(prompt,prompt_gen_chain)workflow.add_node
def add_tool_message(state:State):return {messages:[ToolMessage(contentPrompt generated!,tool_call_id state[messages][-1].too_calls[0][id],) ]}workflow.add_conditional_edges(info,get_state, [add_tool_message,info,END])
workflow.add_edge(add_tool_message,prompt)
workflow.add_edge(prompt,END)
workflow.add_edge(START,info)
graph workflow.compile(checkpointermemory)graph_png graph.get_graph().draw_mermaid_png()
with open(prompt_workflow.png, wb) as f:f.write(graph_png)# 使用图
# 现在我们可以使用创建的聊天机器人了。
import uuidcached_human_responses [你好!, rag 提示词, 1 rag, 2 none, 3 no, 4 no, red, q]
cached_response_index 0
config {configurable: {thread_id: str(uuid.uuid4())}}
while True:try:user input(User (q/Q to quit): )except:user cached_human_responses[cached_response_index]cached_response_index 1# print(fUser (q/Q to quit): {user})if user in {q, Q}:print(AI: Byebye)breakoutput Nonefor output in graph.stream({messages: [HumanMessage(contentuser)]}, configconfig, stream_modeupdates):last_message next(iter(output.values()))[messages][-1]last_message.pretty_print()if output and prompt in output:print(Done!)