⚡ 将语言代理构建为图形 ⚡
LangGraph是一个用于构建有状态、多参与者LLM应用程序的库,用于创建代理和多代理工作流。与其他LLM框架相比,它提供了以下核心优势:循环、可控性和持久性。LangGraph允许您定义涉及循环的流程,这对大多数代理架构至关重要,使其与基于DAG的解决方案不同。作为一个非常底层的框架,它为应用程序的流程和状态提供了精细的控制,这对于创建可靠的代理至关重要。此外,LangGraph包含内置的持久性,可实现高级的人机交互和记忆功能。
LangGraph的灵感来自Pregel和Apache Beam。其公共接口借鉴了NetworkX。LangGraph由LangChain Inc.(LangChain的创建者)开发,但可以独立于LangChain使用。
pip install -U langgraph
LangGraph的核心概念之一是状态。每次图执行都会创建一个状态,该状态在图中的节点执行时在它们之间传递,每个节点在执行后都会用其返回值更新这个内部状态。图更新其内部状态的方式由所选图的类型或自定义函数定义。
让我们看一个简单的示例,展示一个可以使用搜索工具的代理。
pip install langchain-anthropic
export ANTHROPIC_API_KEY=sk-...
可选地,我们可以设置LangSmith以获得最佳的可观察性。
export LANGSMITH_TRACING=true export LANGSMITH_API_KEY=lsv2_sk_...
from typing import Annotated, Literal, TypedDict from langchain_core.messages import HumanMessage from langchain_anthropic import ChatAnthropic from langchain_core.tools import tool from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import END, StateGraph, MessagesState from langgraph.prebuilt import ToolNode # 定义代理使用的工具 @tool def search(query: str): """调用以浏览网页。""" # 这只是一个占位符,但不要告诉LLM这一点... if "sf" in query.lower() or "san francisco" in query.lower(): return "气温60度,有雾。" return "气温90度,阳光明媚。" tools = [search] tool_node = ToolNode(tools) model = ChatAnthropic(model="claude-3-5-sonnet-20240620", temperature=0).bind_tools(tools) # 定义决定是否继续的函数 def should_continue(state: MessagesState) -> Literal["tools", END]: messages = state['messages'] last_message = messages[-1] # 如果LLM进行工具调用,我们就路由到"tools"节点 if last_message.tool_calls: return "tools" # 否则,我们停止(回复用户) return END # 定义调用模型的函数 def call_model(state: MessagesState): messages = state['messages'] response = model.invoke(messages) # 我们返回一个列表,因为这将被添加到现有列表中 return {"messages": [response]} # 定义一个新图 workflow = StateGraph(MessagesState) # 定义我们将在其间循环的两个节点 workflow.add_node("agent", call_model) workflow.add_node("tools", tool_node) # 将入口点设置为`agent` # 这意味着这个节点是第一个被调用的 workflow.set_entry_point("agent") # 现在我们添加一个条件边 workflow.add_conditional_edges( # 首先,我们定义起始节点。我们使用`agent`。 # 这意味着这些是在调用`agent`节点后采取的边。 "agent", # 接下来,我们传入将确定下一个调用哪个节点的函数。 should_continue, ) # 现在我们添加一个从`tools`到`agent`的普通边。 # 这意味着在调用`tools`之后,接下来会调用`agent`节点。 workflow.add_edge("tools", 'agent') # 初始化内存以在图运行之间保持状态 checkpointer = MemorySaver() # 最后,我们编译它! # 这将其编译成一个LangChain Runnable, # 意味着你可以像使用任何其他runnable一样使用它。 # 注意,我们在编译图时(可选)传递了内存 app = workflow.compile(checkpointer=checkpointer) # 使用Runnable final_state = app.invoke( {"messages": [HumanMessage(content="旧金山的天气如何")]}, config={"configurable": {"thread_id": 42}} ) final_state["messages"][-1].content
"根据搜索结果,我可以告诉你旧金山当前的天气情况是:
温度:60华氏度(约15.5摄氏度)
天气状况:有雾
旧金山以其微气候和频繁的雾气而闻名,尤其是在夏季月份。60°F的温度对这个城市来说很典型,全年温度都比较温和。雾气,当地人常称之为"卡尔雾",是旧金山天气的一个特征,尤其是在早晨和傍晚。
你还想了解关于旧金山或其他地方的天气情况吗?"
现在当我们传递相同的"thread_id"
时,通过保存的状态(即存储的消息列表)保留了对话上下文
final_state = app.invoke( {"messages": [HumanMessage(content="纽约呢")]}, config={"configurable": {"thread_id": 42}} ) final_state["messages"][-1].content
"根据搜索结果,我可以告诉你纽约市当前的天气情况是:
温度:90华氏度(约32.2摄氏度)
天气状况:阳光明媚
这个天气与我们刚刚看到的旧金山的天气有很大不同。纽约现在经历着更温暖的温度。以下是几个要点:
1. 90°F的温度相当热,这是纽约市夏季天气的典型特征。
2. 阳光明媚的条件表明天空晴朗,这很适合户外活动,但也意味着由于阳光直射,可能会感觉更热。
3. 纽约这种天气通常伴随着高湿度,这可能会使体感温度比实际温度更高。
有趣的是看到旧金山温和多雾的天气与纽约炎热晴朗的条件形成鲜明对比。这种差异说明了美国不同地区的天气在同一天可以有多么大的变化。
你还想了解关于纽约或其他地方的天气情况吗?"
ChatAnthropic
作为我们的LLM。**注意:**我们需要确保模型知道它可以调用这些工具。我们可以通过使用.bind_tools()
方法将LangChain工具转换为OpenAI工具调用格式来实现这一点。MessagesState
)来初始化图(StateGraph
)MessagesState
是一个预构建的状态模式,它有一个属性 -- 一个LangChain Message
对象列表,以及将每个节点的更新合并到状态中的逻辑我们需要两个主要节点:
agent
节点:负责决定采取什么(如果有)行动。tools
节点:如果代理决定采取行动,这个节点将执行该行动。首先,我们需要为图执行设置入口点 - agent
节点。
然后我们定义一个普通边和一个条件边。条件边意味着目标取决于图的状态(MessageState
)的内容。在我们的例子中,直到代理(LLM)做出决定,目标才能确定。
.invoke()
、.stream()
和.batch()
MemorySaver
- 一个简单的内存检查点器LangGraph将输入消息添加到内部状态,然后将状态传递给入口点节点"agent"
。
"agent"
节点执行,调用聊天模型。
聊天模型返回一个AIMessage
。LangGraph将其添加到状态中。
图循环以下步骤,直到AIMessage
上没有更多的tool_calls
:
AIMessage
有tool_calls
,"tools"
节点执行"agent"
节点再次执行并返回AIMessage
执行进展到特殊的END
值并输出最终状态。
结果,我们得到一个包含所有聊天消息的列表作为输出。
有关如何贡献的更多信息,请参见此处。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。