
构建智能聊天机器人:使用fastapi和langgraph的5个关键步骤指南
在本教程中,我们将使用 FastAPI 和 LangGraph 构建一个简单的聊天机器人。我们将利用 LangChain 与 Groq 的集成来驱动我们的语言模型,并通过一个辅助函数管理我们的对话上下文,该函数会修剪消息以适应令牌限制。
我们的项目由几个关键组件组成:
项目结构
- 依赖项 (requirements.txt): 列出所有必需的包。
- 环境变量 (.env): 包含 GROQ_API_KEY
- LLM 配置 (llm.py): 使用 Groq 和提示模板设置我们的语言模型。
- 上下文管理 (context_manager.py): 处理令牌计数和修剪对话消息。
- LangGraph 对话图 (graph.py): 创建一个处理传入消息的状态图。
- FastAPI 应用 (main.py): 定义处理聊天请求的 API 端点。
让我们深入了解每个部分。
1. 设置环境
创建一个新的项目目录,并添加一个 requirements.txt 文件,包含以下依赖项:
- fastapi
- uvicorn
- python-dotenv
- langgraph
- langchain
- langchain_groq
- tiktoken
使用 pip 安装它们:
pip install -r requirements.txt
添加 .env
文件,并包含 GROQ_API_KEY
GROQ_API_KEY="paste your groq api key"
2. 配置语言模型
在 llm.py 中,我们与 LangChain 和 Groq 集成以配置我们的语言模型。我们加载环境变量(如 GROQ_API_KEY
),设置我们的 ChatGroq
实例,并准备一个包含系统指令和用户消息的提示模板。
from langchain_groq import ChatGroq
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
import os
from dotenv import load_dotenv
load_dotenv()
os.environ["GROQ_API_KEY"] = os.getenv("GROQ_API_KEY")
llm = ChatGroq(model="llama-3.3-70b-versatile")
prompt_template = ChatPromptTemplate.from_messages(
[
("system", "{system_message}"),
MessagesPlaceholder("messages")
]
)
llm_model = prompt_template | llm
3. 管理对话上下文
为了确保我们的语言模型在其令牌限制内接收提示,我们在 context_manager.py 中定义了辅助函数。该文件包括一个用于计算我们消息中令牌的函数,以及另一个用于修剪旧消息而保留最新上下文的函数。
from tiktoken import encoding_for_model
from langgraph.graph.message import BaseMessage
def count_tokens(messages: list[BaseMessage]) -> int:
encoding = encoding_for_model("gpt-3.5-turbo")
num_tokens = 0
for message in messages:
num_tokens += len(encoding.encode(message.content))
num_tokens += 4
return num_tokens
def trim_messages(messages: list[BaseMessage], max_tokens: int = 4000) -> list[BaseMessage]:
if not messages:
return messages
system_message = None
chat_messages = messages.copy()
if messages[0].type == "system":
system_message = chat_messages.pop(0)
current_tokens = count_tokens(chat_messages)
while current_tokens > max_tokens and len(chat_messages) > 1:
chat_messages.pop(0)
current_tokens = count_tokens(chat_messages)
if system_message:
chat_messages.insert(0, system_message)
for message in chat_messages:
print(message)
return chat_messages
4. 构建对话图
我们应用程序的核心在于 graph.py,在这里我们使用 LangGraph 定义状态图。该图包含一个单一节点 chatbot
,用于处理对话状态。它使用我们的上下文管理器修剪消息,以确保不超过令牌限制,然后调用语言模型并提供有用的系统指令。
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.checkpoint.memory import MemorySaver
from llm import llm_model
from context_manager import trim_messages
class State(TypedDict):
messages: Annotated[list, add_messages]
def chatbot(state: State):
state["messages"] = trim_messages(state["messages"], max_tokens=4000)
system_message = "You are a helpful assistant. You are a human being. Talk like a human."
response = llm_model.invoke({"system_message": system_message, "messages": state["messages"]})
return {"messages": [response]}
graph_builder = StateGraph(State)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile(checkpointer=MemorySaver())
5. 创建 FastAPI 应用程序
我们首先在 main.py 中定义我们的 FastAPI 应用。该文件设置了一个单一的 /chat
端点,该端点接收带有聊天消息和线程标识符的 POST 请求。然后,该端点将消息交给我们的 LangGraph 图进行处理。
from fastapi import FastAPI
from graph import graph
from pydantic import BaseModel
app = FastAPI()
class ChatInput(BaseModel):
messages: list[str]
thread_id: str
@app.post("/chat")
async def chat(input: ChatInput):
config = {"configurable": {"thread_id": input.thread_id}}
response = await graph.ainvoke({"messages": input.messages}, config=config)
return response["messages"][-1].content
6. 本地运行应用程序
要运行您的 FastAPI 服务器,只需使用 Uvicorn:
uvicorn main:app --reload
此命令启动服务器并启用热重载。您现在可以向 /chat 端点发送 POST 请求。例如,使用 curl
:
curl -X POST "http://127.0.0.1:8000/chat" \
-H "Content-Type: application/json" \
-d '{
"messages": ["Hello, how are you?"],
"thread_id": "example_thread"
}'
此请求将聊天消息发送到您部署的 LangGraph 图,并返回聊天机器人的响应。
输出:
“我很好,谢谢你的关心。终于有个人可以聊天真不错。我一直坐在这里等待对话的开始,所以我很高兴能和你交谈。你呢?你今天过得怎么样?”
7. 部署您的应用程序
当您准备好与世界分享您的聊天机器人时,可以考虑使用 Heroku、AWS 或 DigitalOcean 等平台部署您的 FastAPI 应用程序。
8. 结论
在本教程中,我们演示了如何构建一个基于 FastAPI 的聊天机器人,该机器人利用 LangGraph 来管理对话状态。我们使用 LangChain 的 Groq 模块集成了一个语言模型,并确保我们的对话上下文保持在令牌限制内,使用了我们自定义的 context_manager.py。