AI畛域正从基础的RAG系统向更智能的AI智能体退化,后者能处置更复杂的义务并顺应新信息。LangGraph作为LangChain库的裁减,助力开发者构建具备形态治理和循环计算才干的先进AI系统。本文教大家如何经常使用LangGraph开发一个太阳能节能计算的智能体。
1 LangGraph概述
LangGraph是LangChain的初级库,为大型言语模型(LLM)带来循环计算才干。它逾越了LangChain的线性上班流,经过循环支持复杂的义务处置。
LangGraph简化了AI开发,智能治理形态,坚持高低文,使AI能智能照应变动。它让开发者专一于翻新,而非技术细节,同时确保运行程序的高性能和牢靠性。
2 逐渐指南
了解LangGraph后,咱们经过实例来实践运行:构建一个AI智能体,用于计算太阳能板节能后劲,并在开售网站上与潜在客户互动,提供共性化节能预算。这个智能体有助于教育客户太阳能的经济效益,并挑选出值得跟进的潜在客户。
步骤1:导入必要的库
咱们先导入构建AI助手所需的Python库和模块。
from langchain_core.tools import toolfrom langchain_community.tools.tavily_search import TavilySearchResultsfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.runnables import Runnablefrom langchain_aws import ChatBedrockimport boto3from typing import Annotatedfrom typing_extensions import TypedDictfrom langgraph.graph.message import AnyMessage, add_messagesfrom langchain_core.messages import ToolMessagefrom langchain_core.runnables import RunnableLambdafrom langgraph.prebuilt import ToolNodefrom langgraph.prebuilt import tools_condition
这些库的导入为咱们应用LangChain、LangGraph和AWS服务来构建AI助手打下了松软的基础。
步骤2:定义计算太阳能节俭的工具
接上去,定义一个工具来依据用户每月的电费计算经常使用太阳能板或者节俭的费用。
@tooldef compute_savings(monthly_cost: float) -> float:"""依据用户每月电费计算切换到太阳能时潜在节俭的工具。参数:monthly_cost (float):用户的每月电费。前往:dict:蕴含以下内容的字典:- 'number_of_panels':预计所需的太阳能板数量。- 'installation_cost':预计的装置老本。- 'net_savings_10_years':装置老本后的10年净节俭。"""def calculate_solar_savings(monthly_cost):# 计算的假定cost_per_kWh = 0.28cost_per_watt = 1.50sunlight_hours_per_day = 3.5panel_wattage = 350system_lifetime_years = 10# 每月用电量(千瓦时)monthly_consumption_kWh = monthly_cost / cost_per_kWh# 所需系统大小(千瓦)daily_energy_production = monthly_consumption_kWh / 30system_size_kW = daily_energy_production / sunlight_hours_per_day# 太阳能板数量和装置老本number_of_panels = system_size_kW * 1000 / panel_wattageinstallation_cost = system_size_kW * 1000 * cost_per_watt# 年度和净节俭annual_savings = monthly_cost * 12total_savings_10_years = annual_savings * system_lifetime_yearsnet_savings = total_savings_10_years - installation_costreturn {"number_of_panels": round(number_of_panels),"installation_cost": round(installation_cost, 2),"net_savings_10_years": round(net_savings, 2)}# 前往计算的太阳能节俭return calculate_solar_savings(monthly_cost)
这个函数基于用户电费数据,提供太阳能板系统的具体节俭预算,包括所需板数量、装置老本和未来十年的净节俭。目前,咱们经常使用了一些平均值来启动简化计算。未来,咱们可以从用户那里间接失掉更准确的数据,以提供更共性化的预算。
步骤3:设置形态治理和失误处置
有效的形态治理和失误处置关于构建强健的AI系统十分关键。在这里,咱们定义了工具来治理失误并保养对话的形态。
def handle_tool_error(state) -> dict:"""处置工具口头时期出现的失误的函数。参数:state (dict):AI智能体的形态,包括信息和工具调用概略。前往:dict:蕴含每个遇到疑问的工具的失误信息的字典。"""# 从形态中检索失误error = state.get("error")# 从形态的信息历史中失掉最后一个信息的工具调用tool_calls = state["messages"][-1].tool_calls# 前往蕴含失误概略的ToolMessages列表,与每个工具调用ID关联return {"messages": [ToolMessage(cnotallow=f"失误:{repr(error)}\n请批改你的失误。",# 为用户格局化失误信息tool_call_id=tc["id"],# 将失误信息与相应的工具调用ID关联)for tc in tool_calls# 遍历每个工具调用以发生独自的失误信息]}def create_tool_node_with_fallback(tools: list) -> dict:"""创立具备后备失误处置的工具节点的函数。参数:tools (list):要蕴含在节点中的工具列表。前往:dict:假设出现失误,经常使用后备行为的工具节点。"""# 经常使用提供的工具创立ToolNode,并附加后备机制# 假设出现失误,将调用handle_tool_error函数来治理失误return ToolNode(tools).with_fallbacks([RunnableLambda(handle_tool_error)],# 经常使用lambda函数包装失误处置器exception_key="error"# 指定这个后备是用于处置失误的)
这些函数确保在工具口头时期遇到的任何失误都能失掉优雅地处置,为用户提供有用的反应。
步骤4:定义形态和助手类
在此步骤,咱们设定AI智能体如何保养对话形态并响运行户输入及工具输入。
用Python的TypedDict创立State类来规范信息结构,包括用户和系统的信息。
class State(TypedDict):messages: Annotated[list[AnyMessage], add_messages]
而后,构建助手类来驱动AI智能体,治理对话。助手类调用工具,处置结果,并在须要时从新向用户征询。它经过循环调用Runnable直至取得有效输入,确保对话流利。
class Assistant:def __init__(self, runnable: Runnable):# 经常使用定义与工具交互环节的可运转对象启动初始化self.runnable = runnabledef __call__(self, state: State):while True:# 经常使用形态(信息和高低文)调用可运转对象result = self.runnable.invoke(state)# 假设工具未能前往有效输入,从新揭示用户廓清或重试if not result.tool_calls and (not result.contentor isinstance(result.content, list)and not result.content[0].get("text")):# 减少恳求有效照应的信息messages = state["messages"] + [("user", "请给出一个实在的输入。")]state = {**state, "messages": messages}else:# 当取得有效输入时跳出循环break# 在处置完可运转对象后前往最终形态return {"messages": result}
这个机制确保了对话的连接性和助手的失当照应。
步骤5:经常使用AWS Bedrock性能LLM
在这一步,咱们经过AWS Bedrock设置大型言语模型(LLM),增强AI助手的言语处置才干。须要先性能AWS凭证,以便访问Bedrock服务。
def get_bedrock_client(region):return boto3.client("bedrock-runtime", region_name=region)def create_bedrock_llm(client):return ChatBedrock(model_id='anthropic.claude-3-sonnet-20240229-v1:0', client=client, model_kwargs={'temperature': 0}, region_name='us-east-1')llm = create_bedrock_llm(get_bedrock_client(reginotallow='us-east-1'))
这确保了助手能准确了解和回运行户。
步骤6:定义助手的上班流程
设置好LLM和工具后,如今定义AI助手的上班流程,关键触及创立对话模板和指定工具的经常使用。
上班流程的第一局部创立一个模板来疏导助手与用户沟通,明白要问的疑问和如何依据回答调用工具。
primary_assistant_prompt = ChatPromptTemplate.from_messages([("system",'''你是太阳能板比利时的乐于助人的客服助手。你应该从他们那里失掉以下信息:- 每月电费假设你不能明晰地识别这些信息,要求他们廓清!不要试图胡乱猜想。在你能够明晰地识别一切信息后,调用关系工具。''',),("placeholder", "{messages}"),])
确定助手将经常使用的工具,如compute_savings,并将其绑定到上班流程中,以便在对话中适时调用。
# 定义助手将经常使用的工具part_1_tools = [compute_savings]# 将工具绑定到助手的上班流程part_1_assistant_runnable = primary_assistant_prompt | llm.bind_tools(part_1_tools)
这确保了助手能依据用户输入灵敏照应,成功顺畅的对话体验。
步骤7:构建图结构
应用LangGraph,咱们为AI助手搭建图结构,控制其处置用户输入、触发工具和阶段转换的流程。
AI智能体旨在计算太阳能板潜在节能节俭。
builder = StateGraph(State)builder.add_node("assistant", Assistant(part_1_assistant_runnable))builder.add_node("tools", create_tool_node_with_fallback(part_1_tools))边定义了流程如何在节点之间移动。在这里,助手开局对话,一旦搜集到所需输入,就过渡到工具,并在工具口头后前往助手。builder.add_edge(START, "assistant")# 从助手开局builder.add_conditional_edges("assistant", tools_condition)# 输入后移动到工具builder.add_edge("tools", "assistant")# 工具口头后前往助手咱们经常使用MemorySaver确保图在不同步骤之间保管对话形态。这准许助手记住用户的输入,确保多步骤交互中的延续性。memory = MemorySaver()graph = builder.compile(checkpointer=memory)
步骤8:运转助手
最后,你可以经过启动图并开局对话来运转助手。
# import shutilimport uuid# 让咱们创立一个用户或者与助手启动的示例对话tutorial_questions = ['嘿','你能计算我的节能吗',“我的每月老本是100美元,我能节俭多少”]thread_id = str(uuid.uuid4())config = {"configurable": {"thread_id": thread_id,}}_printed = set()for question in tutorial_questions:events = graph.stream({"messages": ("user", question)}, config, stream_mode="values")for event in events:_print_event(event, _printed)
经过这些步骤,如今曾经经常使用LangGraph成功打造了一个能依据用户输入计算太阳能节能的AI助手。这凸显了LangGraph在处置复杂义务和处置实践疑问中的长处。
本文转载自,作者: