本文手把手教你用 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
列表存到文件或数据库,下次启动再读出来即可。 -
怎么切换模型?
换一下Tongyi
的model
参数,比如"qwen-turbo"
。 -
怎么调整 AI 风格?
多试试temperature
和top_p
的不同组合,找到你喜欢的回答风格。
8. 总结 & 后续建议
到这里,你已经搭好了一个具备多轮记忆的中文聊天机器人。
接下来可以尝试:
- 加入长期记忆,让机器人“记性更好”
- 集成工具调用(比如查天气、查百科)
- 尝试多角色协作,做个“多人格”机器人
最后提醒:
做聊天机器人,最重要的是理解“状态”和“流程”的设计思路。LangGraph 把复杂流程拆成小块,极大降低了开发和维护难度。
希望这份教程能帮你快速上手。如果有问题,欢迎留言交流!
祝你早日打造出属于自己的智能助手 🚀