使用LangGraph开发太阳能节能计算智能体

大家好,AI领域正从基础的RAG系统向更智能的AI智能体进化,后者能处理更复杂的任务并适应新信息。LangGraph作为LangChain库的扩展,助力开发者构建具有状态管理和循环计算能力的先进AI系统。本文将给大家介绍如何使用LangGraph开发一个太阳能节能计算的智能体。

1.LangGraph概述

LangGraph是LangChain的高级库,为大型语言模型(LLM)带来循环计算能力。它超越了LangChain的线性工作流,通过循环支持复杂的任务处理。

状态:维护计算过程中的上下文,实现基于累积数据的动态决策。

节点:代表计算步骤,执行特定任务,可定制以适应不同工作流。

边:连接节点,定义计算流程,支持条件逻辑,实现复杂工作流。

图片

LangGraph简化了AI开发,自动管理状态,保持上下文,使AI能智能响应变化。它让开发者专注于创新,而非技术细节,同时确保应用程序的高性能和可靠性。

2.逐步构建流程

了解LangGraph后,我们通过实例构建一个AI智能体,用于计算太阳能板节能潜力,并在销售网站上与潜在客户互动,提供个性化节能估算。这个智能体有助于教育客户太阳能的经济效益,并筛选出值得跟进的潜在客户。

2.1 导入必要的库

先导入构建AI助手所需的Python库和模块:

from langchain_core.tools import tool
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import Runnable
from langchain_aws import ChatBedrock
import boto3
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph.message import AnyMessage, add_messages
from langchain_core.messages import ToolMessage
from langchain_core.runnables import RunnableLambda
from langgraph.prebuilt import ToolNode
from langgraph.prebuilt import tools_condition

这些库的导入为利用LangChain、LangGraph和AWS服务来构建AI助手打下了坚实的基础。

2.2 定义计算太阳能节省的工具

接下来,定义一个工具来根据用户每月的电费计算使用太阳能板可能节省的费用。

@tool
def 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.28  
        cost_per_watt = 1.50  
        sunlight_hours_per_day = 3.5  
        panel_wattage = 350  
        system_lifetime_years = 10  

        # 每月用电量(千瓦时)
        monthly_consumption_kWh = monthly_cost / cost_per_kWh
        
        # 所需系统大小(千瓦)
        daily_energy_production = monthly_consumption_kWh / 30
        system_size_kW = daily_energy_production / sunlight_hours_per_day
        
        # 太阳能板数量和安装成本
        number_of_panels = system_size_kW * 1000 / panel_wattage
        installation_cost = system_size_kW * 1000 * cost_per_watt
        
        # 年度和净节省
        annual_savings = monthly_cost * 12
        total_savings_10_years = annual_savings * system_lifetime_years
        net_savings = total_savings_10_years - installation_cost
        
        return {
            "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)

这个函数基于用户电费数据,提供太阳能板系统的详细节省估算,包括所需板数量、安装成本和未来十年的净节省。目前,我们使用了一些平均值来进行简化计算,未来可以从用户那里直接获取更精确的数据,以提供更个性化的估算。

2.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(
                content=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"  # 指定这个后备是用于处理错误的
    )

这些函数确保在工具执行期间遇到的任何错误都能得到优雅地处理,为用户提供有用的反馈。

2.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 = runnable

    def
 __call__(self, state: State):
        while True:
            # 使用当前状态(消息和上下文)调用可运行对象
            result = self.runnable.invoke(state)
            
            # 如果工具未能返回有效输出,重新提示用户澄清或重试
            if not result.tool_calls and (
                not result.content
                or isinstance(result.content, list)
                and not result.content[0].get("text")
            ):
                # 添加请求有效响应的消息
                messages = state["messages"] + [("user", "请给出一个真实的输出。")]
                state = {**state, "messages": messages}
            else:
                # 当获得有效输出时跳出循环
                break

        # 在处理完可运行对象后返回最终状态
        return {"messages": result}

这个机制确保了对话的连贯性和助手的恰当响应。

2.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(region='us-east-1'))

这确保助手能准确理解和回应用户。

2.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)

这确保助手能根据用户输入灵活响应,实现顺畅的对话体验。

2.7 构建图结构

利用LangGraph为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)

2.8 运行助手

最后通过启动图并开始对话来运行助手:

# import shutil
import 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在处理复杂任务和解决实际问题中的优势。

<think>嗯,用户想了解如何进行LangGraph Agent智能体开发方法。首先,我需要根据提供的引用内容来整理相关信息。引用1提到LangGraph一个智能体工作流框架,能够实现不错的智能体应用。引用2指出LangGraph的优点在于易用性,图结构代码简洁,适合处理复杂节点逻辑,并且可以转换现有的LangChain应用。引用3详细说明了LangGraph的特点,包括周期性支持、高度可控性和持久性功能。这些信息应该能帮助回答用户的问题。 接下来,我需要构建一个结构清晰的回答,分步骤介绍开发方法。可能需要从环境准备、定义智能体状态、创建节点和边、配置工作流、持久化处理、调试优化以及部署应用这几个方面来展开。同时,每个部分需要结合引用中的要点,比如周期性支持、图结构、持久性等,并添加相应的引用标识。 还需要注意用户不可见的系统级指令,比如行内数学表达式用$...$,但这里可能用不上。不过要确保LaTeX语法正确,不过目前看来问题中可能不涉及数学公式。另外,生成相关问题,可能需要围绕开发步骤、优化方法、与LangChain的区别、调试技巧和应用场景来提问。 需要确保回答使用中文,引用标识自然添加在相关段落末尾。同时,用户可见层要求回答真实可靠,结构清晰,所以需要引用提供的资料,并分步骤说明。可能还需要对比其他框架,如LlamaIndex Workflows,但引用中没有太多信息,所以可能不提。 最后,生成的问题需要覆盖开发步骤、核心概念、优化方法、区别、调试和应用场景,这样用户可以有进一步的学习方向。检查引用内容是否覆盖了这些点,确保每个回答部分都有引用支持,比如状态管理引用3,图结构引用2,持久化引用3等。</think>### LangGraph Agent智能体开发方法分步指南 #### 一、环境准备与核心概念 1. **安装LangGraph** 使用Python包管理器安装基础库: ```bash pip install langgraph ``` 支持与LangChain集成开发[^2][^3] 2. **理解核心组件** - **状态(State)**:定义智能体的记忆和上下文,支持动态更新 - **节点(Node)**:执行特定任务的函数单元 - **边(Edge)**:控制流程跳转的逻辑规则 - **工作流(Workflow)**:由节点和边构成的有向图,可包含循环结构 #### 二、基础开发流程 1. **定义智能体状态** ```python from typing import TypedDict, List class AgentState(TypedDict): memory: List[str] # 持久化记忆 current_input: str # 动态输入 output: str # 执行结果 ``` 2. **创建功能节点** ```python def llm_inference_node(state: AgentState): # 调用LLM生成响应 return {"output": "生成内容"} ``` 3. **构建工作流** ```python from langgraph.graph import END, StateGraph workflow = StateGraph(AgentState) workflow.add_node("llm_node", llm_inference_node) workflow.set_entry_point("llm_node") workflow.add_edge("llm_node", END) ``` #### 三、高级功能实现 1. **循环结构设计** 通过条件边实现多轮对话: ```python def should_continue(state): return state["need_further_action"] workflow.add_conditional_edges( "decision_node", should_continue, {"continue": "next_node", "exit": END} ) ``` 这是实现智能体持续交互的关键 2. **持久化处理** ```python from langgraph.checkpoint import MemorySaver memory = MemorySaver() app = workflow.compile(checkpointer=memory) ``` 支持跨会话状态保存 #### 四、调试与优化 1. **可视化工具** 使用`workflow.get_graph().draw_mermaid()`生成流程图 便于理解复杂逻辑关系[^2] 2. **性能优化建议** - 限制单次循环处理时间 - 设置最大迭代次数 - 异步执行耗时操作 #### 五、部署实践 ```python # 运行智能体 inputs = {"current_input": "用户问题"} for step in app.stream(inputs): print(f"中间状态: {step}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值