LangGraph - 构建状态化 AI 工作流的框架

什么是 LangGraph LangGraph 是 LangChain 生态系统中的一个框架,专门用于构建有状态的、多步骤的 AI 应用程序。它通过图(Graph)的方式来定义和管理复杂的 AI 工作流,让开发者能够创建具有循环、条件分支和持久化状态的智能体系统。 LangGraph 的核心理念是将 AI 应用程序建模为状态机,其中节点代表操作步骤,边代表流程控制,状态在节点之间传递和更新。 核心概念 State(状态) State 是在整个工作流中传递和更新的数据结构。通常使用 TypedDict 定义: from typing import TypedDict, Annotated from langgraph.graph import add_messages class AgentState(TypedDict): messages: Annotated[list, add_messages] user_input: str analysis_result: str Node(节点) Node 是执行具体操作的函数,接收当前状态并返回更新后的状态: def research_node(state: AgentState): # 执行研究任务 result = do_research(state['user_input']) return { "analysis_result": result, "messages": [("assistant", f"研究完成:{result}")] } Edge(边) Edge 定义节点之间的连接关系: Normal Edge(普通边):直接连接两个节点 Conditional Edge(条件边):根据状态决定下一个节点 from langgraph.graph import StateGraph, END # 普通边 workflow.add_edge("node_a", "node_b") # 条件边 def should_continue(state): if state['done']: return END return "continue_node" workflow.add_conditional_edges( "decision_node", should_continue ) Graph(图) Graph 是完整的工作流定义,包含所有节点、边和状态管理: from langgraph.graph import StateGraph workflow = StateGraph(AgentState) # 添加节点 workflow.add_node("research", research_node) workflow.add_node("analyze", analyze_node) workflow.add_node("respond", respond_node) # 定义边 workflow.add_edge("research", "analyze") workflow.add_edge("analyze", "respond") # 设置入口点 workflow.set_entry_point("research") # 编译图 app = workflow.compile() 核心特性 1. 状态持久化 LangGraph 支持状态的持久化存储,可以实现: ...

Created 18186-01-18 · Updated 26266-07-26 · 5 min · 989 words · -

LangChain

LangChain 详解 什么是 LangChain LangChain 是一个用于构建基于大语言模型(LLM)应用的开源框架。它提供了一套标准化的组件和工具,简化了 AI Agent、聊天机器人、问答系统等应用的开发过程。 核心理念:通过"链(Chain)“将多个组件连接起来,构建复杂的 LLM 应用。 官方仓库: Python:langchain-ai/langchain JavaScript/TypeScript:langchain-ai/langchainjs 核心组件 1. Models(模型) 支持多种 LLM 提供商: from langchain.llms import OpenAI, Anthropic, HuggingFaceHub from langchain.chat_models import ChatOpenAI, ChatAnthropic # OpenAI llm = OpenAI(temperature=0.7) # Claude chat = ChatAnthropic(model="claude-3-sonnet-20240229") # 本地模型 from langchain.llms import Ollama local_llm = Ollama(model="llama2") 2. Prompts(提示模板) 管理和复用提示词: from langchain.prompts import PromptTemplate, ChatPromptTemplate # 简单模板 prompt = PromptTemplate( input_variables=["product"], template="给{product}写一个广告语" ) # 聊天模板 chat_prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个{role}"), ("human", "{user_input}") ]) # 使用 formatted = prompt.format(product="智能手表") result = llm(formatted) 3. Chains(链) 将多个组件串联: from langchain.chains import LLMChain, SimpleSequentialChain # 单个链 chain = LLMChain(llm=llm, prompt=prompt) result = chain.run(product="智能手表") # 顺序链 chain1 = LLMChain(llm=llm, prompt=prompt1) # 生成产品描述 chain2 = LLMChain(llm=llm, prompt=prompt2) # 生成广告语 overall_chain = SimpleSequentialChain( chains=[chain1, chain2], verbose=True ) result = overall_chain.run("智能手表") 4. Agents(代理) 动态决策和工具调用: ...

Created 26266-04-26 · Updated 26266-07-26 · 5 min · 901 words · -

LangSmith - LLM 应用的可观测性平台

什么是 LangSmith LangSmith 是 LangChain 团队推出的 LLM 应用可观测性与评估平台,用于追踪(trace)、调试、测试和监控基于 LLM 的应用。它不要求应用一定使用 LangChain 或 LangGraph 构建——任何调用 LLM 的代码都可以接入 LangSmith,但与 LangChain / LangGraph 的集成是开箱即用的。 核心定位:LLM 应用的"生产环境可观测性 + 离线评估"工具,解决 LLM 应用调试困难、行为不透明、质量难以量化的问题。 官方仓库 / 产品:langchain-ai/langsmith-sdk(SDK 开源,平台本身为托管 SaaS,也提供自托管方案)。 为什么需要 LangSmith 传统软件的日志和监控体系(APM、ELK 等)不足以覆盖 LLM 应用的调试需求: 多步骤链路不透明:一次 Agent 调用可能包含多次 LLM 请求、工具调用、检索操作,普通日志难以还原完整调用树 Prompt 调试依赖人工:Prompt 的微小改动可能显著影响输出质量,缺乏系统化的对比手段 输出质量难以量化:LLM 输出是非确定性的自然语言,传统的断言测试不适用 成本和延迟不可见:Token 消耗、模型延迟分散在各次调用中,难以聚合分析 LangSmith 针对这些痛点提供了追踪、数据集管理、评估和监控能力。 核心功能 1. Tracing(追踪) 记录一次请求内所有 LLM 调用、工具调用、检索操作的完整调用树,包括输入、输出、耗时、Token 用量。 import os os.environ["LANGCHAIN_TRACING_V2"] = "true" os.environ["LANGCHAIN_API_KEY"] = "your-api-key" os.environ["LANGCHAIN_PROJECT"] = "my-project" # LangChain / LangGraph applications are traced automatically # once the environment variables above are set from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4") result = llm.invoke("Explain what LangSmith does") 对于不使用 LangChain 的代码,可以用 @traceable 装饰器手动接入: ...

Created 26266-07-26 · Updated 26266-07-26 · 2 min · 345 words · -

Tool Calling Patterns: ReAct 与其它工具调用方式

其他意图识别与工具调用方式 除了传统的 Slot Filling 和现代的 Function Calling,AI Agent 还有多种实现意图识别和工具调用的方式,各有特点和适用场景。 1. ReAct(Reasoning + Acting) ReAct 是一种让 LLM 交替进行推理(Reasoning)和行动(Acting)的方法,通过思维链(Chain of Thought)引导 LLM 一步步分析问题并选择工具。 工作原理 用户输入 → LLM 推理(Thought) → 决定行动(Action) → 执行工具 → 观察结果(Observation) → 继续推理 → ... 实现示例 react_prompt_template = """ 你是一个智能助手,可以使用以下工具: 1. search(query): 搜索信息 2. calculate(expression): 计算数学表达式 3. get_weather(city): 查询天气 请按以下格式回答: Thought: [你的思考过程] Action: [工具名称] Action Input: [工具参数] Observation: [工具返回的结果] ... (重复 Thought/Action/Observation 直到得出答案) Answer: [最终答案] 问题:{question} """ # 用户问题:"北京明天的天气适合户外活动吗?" # LLM 输出: """ Thought: 我需要先查询北京明天的天气 Action: get_weather Action Input: {"city": "北京", "date": "明天"} Observation: 明天北京天气:晴,温度 22°C,微风 Thought: 根据天气信息,晴天、温度适中、微风,非常适合户外活动 Answer: 根据天气预报,北京明天天气晴朗,温度 22°C,微风,非常适合户外活动。 """ 优势 可解释性强:每一步推理过程都清晰可见 灵活性高:LLM 可以动态调整策略 支持复杂任务:可以进行多步推理和工具调用 劣势 Token 消耗大:每次推理都需要完整的对话历史 速度较慢:需要多次 LLM 调用 格式依赖:依赖 LLM 严格遵循输出格式 2. Prompt-based Tool Selection(基于提示的工具选择) 通过精心设计的 Prompt 让 LLM 直接输出工具调用的 JSON 或结构化文本。 ...

Created 26266-04-26 · Updated 23236-07-23 · 6 min · 1195 words · -