LangGraph使用

bash 复制代码
pip install langgraph --upgrade
bash 复制代码
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.graph import StateGraph, END
from typing import TypedDict
import os

# ===================== 配置 =====================
os.environ["DEEPSEEK_API_KEY"] = "sk-"

llm = ChatOpenAI(
    model="deepseek-v4-pro",
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com",
    temperature=0.2,
    max_tokens=4096,
    streaming=True
)
parser = StrOutputParser()


# ===================== MCP 工具 =====================
@tool
def mcp_create_file(file_path: str, content: str) -> str:
    """MCP 文件创建工具"""
    try:
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(content)
        return f"[MCP] 文件已保存:{file_path}"
    except Exception as e:
        return f"[MCP] 错误:{str(e)}"


# ===================== 定义状态(LangGraph 核心) =====================
class WorkState(TypedDict):
    user_task: str
    analyse_result: str
    code_result: str
    optimize_result: str
    summary_result: str


# ===================== 提示词 =====================
prompt_analyse = ChatPromptTemplate.from_messages([
    ("system", "资深后端工程师,精准拆解开发需求,梳理实现思路"),
    ("user", "需求内容:{user_task}")
])
chain_analyse = prompt_analyse | llm | parser

prompt_code = ChatPromptTemplate.from_messages([
    ("system", "根据需求思路编写完整可运行代码,规范整洁"),
    ("user", "需求思路:{analyse_result}")
])
chain_code = prompt_code | llm | parser

prompt_optimize = ChatPromptTemplate.from_messages([
    ("system", "优化代码性能、可读性、异常处理"),
    ("user", "原始代码:{code_result}")
])
chain_optimize = prompt_optimize | llm | parser

prompt_summary = ChatPromptTemplate.from_messages([
    ("system", "总结功能,并自动保存代码"),
    ("user", "优化后代码:{optimize_result}")
])
chain_summary = prompt_summary | llm | parser


# ===================== 流式输出 =====================
def stream_output(chain, input_data):
    result = ""
    for chunk in chain.stream(input_data):
        print(chunk, end="", flush=True)
        result += chunk
    print("\n")
    return result


# ===================== LangGraph 节点函数 =====================
def node_analyse(state: WorkState):
    print("===== 1.需求解析中 =====\n")
    res = stream_output(chain_analyse, {"user_task": state["user_task"]})
    return {"analyse_result": res}


def node_code(state: WorkState):
    print("===== 2.生成代码中 =====\n")
    res = stream_output(chain_code, {"analyse_result": state["analyse_result"]})
    return {"code_result": res}


def node_optimize(state: WorkState):
    print("===== 3.代码优化中 =====\n")
    res = stream_output(chain_optimize, {"code_result": state["code_result"]})
    return {"optimize_result": res}


def node_summary(state: WorkState):
    print("===== 4.最终总结 + 自动保存文件 =====\n")
    res = stream_output(chain_summary, {"optimize_result": state["optimize_result"]})

    # MCP 保存
    print(mcp_create_file.invoke({"file_path": "output_code2.html", "content": state["optimize_result"]}))
    return {"summary_result": res}


# ===================== 构建 LangGraph 流程图 =====================
builder = StateGraph(WorkState)

# 添加节点
builder.add_node("analyse", node_analyse)
builder.add_node("code", node_code)
builder.add_node("optimize", node_optimize)
builder.add_node("summary", node_summary)

# 流程连线
builder.set_entry_point("analyse")
builder.add_edge("analyse", "code")
builder.add_edge("code", "optimize")
builder.add_edge("optimize", "summary")
builder.add_edge("summary", END)

# 编译图
graph = builder.compile()

# ===================== 运行 =====================
if __name__ == "__main__":
    task = "写个漂亮的登录页面,html"
    result = graph.invoke({"user_task": task})
    print("\n✅ LangGraph 工作流执行完成!")

有记忆,简单智能体

bash 复制代码
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.graph import StateGraph, END
from typing import TypedDict, List, Dict
import os
import json
import datetime

# ===================== 配置 =====================
os.environ["DEEPSEEK_API_KEY"] = "sk-"

llm = ChatOpenAI(
    model="deepseek-v4-pro",
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com",
    temperature=0.2,
    max_tokens=2048,
    streaming=True
)
parser = StrOutputParser()

# 闲聊专用轻量对话链
chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是友好AI助手,简洁自然聊天,记住上下文"),
    ("user", "历史上下文:{memory}\n用户:{query}")
])
chat_chain = chat_prompt | llm | parser

# ===================== 本地记忆管理(永久保存) =====================
MEMORY_PATH = "agent_memory.json"

def load_memory() -> List[Dict]:
    if os.path.exists(MEMORY_PATH):
        with open(MEMORY_PATH, "r", encoding="utf-8") as f:
            return json.load(f)
    return []

def save_memory(task: str, result: str):
    memory = load_memory()
    memory.append({
        "time": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        "task": task,
        "result": result
    })
    with open(MEMORY_PATH, "w", encoding="utf-8") as f:
        json.dump(memory, f, ensure_ascii=False, indent=2)

def get_memory_prompt() -> str:
    memory = load_memory()
    if not memory:
        return "无历史记录"
    text = "\n".join([f"用户:{i['task']} 助手:{i['result']}" for i in memory[-5:]])
    return text

# 智能判断:是否为编程开发类需求
def is_dev_task(text: str) -> bool:
    dev_key = {"写代码", "编写", "html", "css", "js", "python", "java", "页面", "接口", "脚本", "功能", "程序", "搭建", "开发", "前端", "后端"}
    return any(k in text.lower() for k in dev_key)

# ===================== MCP 文件工具 =====================
@tool
def mcp_create_file(file_path: str, content: str) -> str:
    """创建并保存代码文件到本地"""
    try:
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(content)
        return f"[MCP] 已保存:{file_path}"
    except Exception as e:
        return f"[MCP] 错误:{str(e)}"

# ===================== LangGraph 状态 =====================
class WorkState(TypedDict):
    user_task: str
    memory: str
    analyse_result: str
    code_result: str
    optimize_result: str
    summary_result: str

# ===================== 工作流提示词 =====================
prompt_analyse = ChatPromptTemplate.from_messages([
    ("system", "你有记忆,能记住历史对话。\n{memory}\n资深工程师,拆解需求"),
    ("user", "需求:{user_task}")
])
chain_analyse = prompt_analyse | llm | parser

prompt_code = ChatPromptTemplate.from_messages([
    ("system", "直接输出完整干净代码,无多余解释"),
    ("user", "{analyse_result}")
])
chain_code = prompt_code | llm | parser

prompt_optimize = ChatPromptTemplate.from_messages([
    ("system", "优化代码,保持可运行,直接输出"),
    ("user", "{code_result}")
])
chain_optimize = prompt_optimize | llm | parser

prompt_summary = ChatPromptTemplate.from_messages([
    ("system", "总结结果,并保存文件"),
    ("user", "{optimize_result}")
])
chain_summary = prompt_summary | llm | parser

# ===================== 流式输出 =====================
def stream_output(chain, input_data):
    result = ""
    for chunk in chain.stream(input_data):
        print(chunk, end="", flush=True)
        result += chunk
    print("\n")
    return result

# ===================== LangGraph 节点 =====================
def node_analyse(state: WorkState):
    print("===== 1. 分析需求 =====")
    res = stream_output(chain_analyse, {
        "user_task": state["user_task"],
        "memory": state["memory"]
    })
    return {"analyse_result": res}

def node_code(state: WorkState):
    print("===== 2. 生成代码 =====")
    res = stream_output(chain_code, {"analyse_result": state["analyse_result"]})
    return {"code_result": res}

def node_optimize(state: WorkState):
    print("===== 3. 优化代码 =====")
    res = stream_output(chain_optimize, {"code_result": state["code_result"]})
    return {"optimize_result": res}

def node_summary(state: WorkState):
    print("===== 4. 总结 + 保存 =====")
    res = stream_output(chain_summary, {"optimize_result": state["optimize_result"]})
    print(mcp_create_file.invoke({
        "file_path": "output.html",
        "content": state["optimize_result"]
    }))
    return {"summary_result": res}

# ===================== 构建流程图 =====================
builder = StateGraph(WorkState)
builder.add_node("analyse", node_analyse)
builder.add_node("code", node_code)
builder.add_node("optimize", node_optimize)
builder.add_node("summary", node_summary)

builder.set_entry_point("analyse")
builder.add_edge("analyse", "code")
builder.add_edge("code", "optimize")
builder.add_edge("optimize", "summary")
builder.add_edge("summary", END)

graph = builder.compile()

# ===================== 交互主逻辑(智能分流) =====================
if __name__ == "__main__":
    print("✅ AI 编程助手已启动(输入 exit 退出)")
    print("✅ 闲聊自动聊天,开发需求自动走工作流\n")

    while True:
        user_input = input("你:")
        if user_input.lower() in ["exit", "quit", "q"]:
            print("再见!")
            break

        mem_text = get_memory_prompt()
        if is_dev_task(user_input):
            res_data = graph.invoke({
                "user_task": user_input,
                "memory": mem_text
            })
            final_reply = res_data["summary_result"]
        else:
            print("助手:", end="", flush=True)
            final_reply = stream_output(chat_chain, {"memory": mem_text, "query": user_input})

        save_memory(user_input, final_reply)
        print("\n👉 等待下一个问题...\n")
相关推荐
Mahir081 小时前
Redis 核心机制:数据过期策略与淘汰策略深度解析
数据库·redis·后端·缓存·面试
多敲代码防脱发1 小时前
Spring进阶(BeanFactory与ApplicationContext)
java·数据库·spring boot·后端·spring
m0_702036532 小时前
html标签如何提升可访问性_aria-label与title区别【指南】
jvm·数据库·python
会编程的土豆2 小时前
Gin 核心概念速记
数据库·后端·gin·goland
ㄟ留恋さ寂寞2 小时前
Golang格式化输出占位符都有什么_Golang fmt占位符教程【通俗】
jvm·数据库·python
Donk_672 小时前
iSCSI 服务器
运维·服务器·数据库
打码人的日常分享2 小时前
大模型及智能体安全风险防范与治理策略(PPT)
运维·网络·数据库·安全·云计算·制造
hughnz2 小时前
钻井“自动化”的终点就是钻井自主化的起点
运维·数据库·python
CHANG_THE_WORLD2 小时前
PE 文件 数据目录
linux·服务器·数据库