用 LangGraph + Qwen 打造属于你的聊天机器人(新手友好版)

本文手把手教你用 LangGraph 和通义 Qwen 大模型,快速实现一个能“记住你说过什么”的中文对话机器人。代码简单,思路清晰,适合任何想入门 AI 聊天机器人的朋友。


1. 为什么推荐 LangGraph?

过去做聊天机器人,很多人用过 Rasa、Botpress 或者直接用大模型写流程,但你会发现——
对话一复杂,代码就像毛线团一样缠在一起。
LangGraph 就是为了解决这个问题:它用“状态机”这种更工程化的方式,把每一步对话拆成小模块,拼搭组合,思路特别清晰。
再加上 Qwen 模型(通义实验室的大语言模型,中文效果很棒),你可以轻松实现带记忆、多轮对话的智能机器人。


2. 环境准备

安装依赖

建议用虚拟环境,避免包冲突:

pip install -U langgraph langsmith
  • langgraph:状态机核心框架
  • langsmith:调试和可视化工具,用于追踪对话历史、性能(可以暂时不用,后续进阶会用到)

获取 Qwen API Key

去通义实验室注册账号,拿到你的 Key,然后:

import os
os.environ["DASHSCOPE_API_KEY"] = "你的_api_key"

3. 代码核心拆解

(1)定义对话“记忆”

from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph.message import add_messages

class State(TypedDict):
    messages: Annotated[list, add_messages]

理解一下:State 就是你机器人的“记事本”,每次对话消息会自动追加到里面。


(2)搭建状态机框架

from langgraph.graph import StateGraph, START, END

graph_builder = StateGraph(State)

简单理解为:“从 START 开始,经过一系列节点,最后到 END。”


(3)对接 Qwen 模型

from langchain_community.llms import Tongyi

llm = Tongyi(
    model="qwen-max",
    streaming=True,   # 打字机输出
    temperature=0.7,  # 回答更自然
    top_p=0.8,        # 合理控制多样性
    api_key="你的_api_key"
)

(4)写对话处理节点

def chatbot(state: State):
    return {"messages": [llm.invoke(state["messages"])]}

graph_builder.add_node("chatbot", chatbot)

每次都自动带上历史消息,保证对话上下文。


(5)连线流程

graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)

就是 “输入 → 处理 → 输出” 的流程。


(6)编译状态机

graph = graph_builder.compile()

(7)实现流式对话

def stream_graph_updates(user_input: str):
    for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):
        for value in event.values():
            print("Assistant:", value["messages"][-1])

这样能实现类似“微信打字”那种一边生成一边显示的体验。


4. 完整代码演示

直接运行下面这段,就能开始和你的机器人聊天了:

from langchain_community.llms import Tongyi
import os
os.environ["DASHSCOPE_API_KEY"] = "sk-712a634dbaa7444d838d20b25ebxxxx"  # 需替换
os.environ["LANGSMITH_TRACING"] = "true"  # 可注释
os.environ["LANGSMITH_PROJECT"] = "pr-warmhearted-bassoon-71"  # 可注释
os.environ["LANGSMITH_API_KEY"] = "lsv2_pt_59040ebb2bec4148bf8941c2443ae9e1_36f929xxxx"  # 需替换,也可注释
os.environ["LANGSMITH_ENDPOINT"] = "https://api.smith.langchain.com"  # 可注释

from typing import Annotated

from typing_extensions import TypedDict

from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages


class State(TypedDict):
    # Messages have the type "list". The `add_messages` function
    # in the annotation defines how this state key should be updated
    # (in this case, it appends messages to the list, rather than overwriting them)
    messages: Annotated[list, add_messages]


graph_builder = StateGraph(State)

llm = Tongyi(model="qwen-max",
             streaming=True,
             temperature=0.7,
             top_p=0.8,
             api_key="sk-712a634dbaa7444d838d20b25ebxxxx")

def chatbot(state: State):
    return {"messages": [llm.invoke(state["messages"])]}


# The first argument is the unique node name
# The second argument is the function or object that will be called whenever
# the node is used.
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile()

def stream_graph_updates(user_input: str):
    for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):
        for value in event.values():
            # print(value)
            print("Assistant:", value["messages"][-1])


while True:
    try:
        user_input = input("User: ")
        if user_input.lower() in ["quit", "exit", "q"]:
            print("Goodbye!")
            break
        stream_graph_updates(user_input)
    except:
        # fallback if input() is not available
        user_input = "What do you know about LangGraph?"
        print("User: " + user_input)
        stream_graph_updates(user_input)
        break

在这里插入图片描述
在这里插入图片描述


5. 技术点稍作解释

  • 状态管理:对话历史自动保存,支持多轮记忆。不用自己写消息追加逻辑。
  • 流式输出:对话内容一边生成一边显示,用户体验更舒服。
  • 模型参数temperature 越高,回答越“有想象力”;top_p 控制输出的多样性。

6. 进阶玩法推荐

  • 对话长期记忆:可以把 messages 存到数据库,实现“隔天还能记得你”的效果。
  • 多角色协作:比如引入多个人格、多个模型,让机器人扮演不同身份。
  • 接工具:比如接天气查询、网页搜索,让机器人“有手有眼”。
  • LangSmith 可视化:追踪并分析对话流程,方便定位 bug 或优化体验。
    在这里插入图片描述

7. 常见问题答疑

  • 怎么保存对话历史?
    直接把 messages 列表存到文件或数据库,下次启动再读出来即可。

  • 怎么切换模型?
    换一下 Tongyimodel 参数,比如 "qwen-turbo"

  • 怎么调整 AI 风格?
    多试试 temperaturetop_p 的不同组合,找到你喜欢的回答风格。


8. 总结 & 后续建议

到这里,你已经搭好了一个具备多轮记忆的中文聊天机器人。
接下来可以尝试:

  • 加入长期记忆,让机器人“记性更好”
  • 集成工具调用(比如查天气、查百科)
  • 尝试多角色协作,做个“多人格”机器人

最后提醒:
做聊天机器人,最重要的是理解“状态”和“流程”的设计思路。LangGraph 把复杂流程拆成小块,极大降低了开发和维护难度。


希望这份教程能帮你快速上手。如果有问题,欢迎留言交流!
祝你早日打造出属于自己的智能助手 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Python测试之道

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

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

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

打赏作者

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

抵扣说明:

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

余额充值