Type something to search...
构建智能聊天机器人:使用fastapi和langgraph的5个关键步骤指南

构建智能聊天机器人:使用fastapi和langgraph的5个关键步骤指南

在本教程中,我们将使用 FastAPI 和 LangGraph 构建一个简单的聊天机器人。我们将利用 LangChain 与 Groq 的集成来驱动我们的语言模型,并通过一个辅助函数管理我们的对话上下文,该函数会修剪消息以适应令牌限制。

我们的项目由几个关键组件组成:

Image 2

项目结构

  • 依赖项 (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。

Related Posts

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

AI 研究报告和论文写作 合并两个系统指令以获得两个模型的最佳效果 Perplexity AI 的 Deep Research 工具提供专家级的研究报告,而 OpenAI 的 ChatGPT-o3-mini-high 擅长推理。我发现你可以将它们结合起来生成令人难以置信的论文,这些论文比任何一个模型单独撰写的都要好。你只需要将这个一次性提示复制到 **

阅读更多
让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

Non members click here作为一名软件开发人员,多年来的一个发现总是让我感到惊讶,那就是人们还在 Excel

阅读更多
使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

10 个常见问题解答 本文是我推出的一个名为“10 个常见问题解答”的新系列的一部分。在本系列中,我旨在通过回答关于该主题的十个最常见问题来分解复杂的概念。我的目标是使用简单的语言和相关的类比,使这些想法易于理解。 图片来自 [Solen Feyissa](https://unsplash.com/@solenfeyissa?utm_source=medium&utm_medi

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

在AI军备竞赛中分辨事实与虚构 DeepSeek AI真的是它所宣传的游戏规则改变者,还是仅仅聪明的营销和战略炒作?👀 虽然一些人将其视为AI效率的革命性飞跃,但另一些人则认为它的成功建立在借用(甚至窃取的)创新和可疑的做法之上。传言称,DeepSeek的首席执行官在疫情期间像囤积卫生纸一样囤积Nvidia芯片——这只是冰山一角。 从其声称的550万美元培训预算到使用Open

阅读更多
Type something to search...