譯者 | 布加迪
審校 | 重樓
每個(gè)人都見過(guò)聊天機(jī)器人的實(shí)際應(yīng)用,有些令人印象深刻,有些令人厭煩。然而,如果你可以創(chuàng)建一個(gè)真正智能、組織良好且易于與你自己的應(yīng)用程序集成的聊天機(jī)器人,會(huì)怎樣呢?我們?cè)诒疚闹袑⑹褂脙蓚€(gè)強(qiáng)大的工具從零開始構(gòu)建一個(gè)聊天機(jī)器人:
- 除了LLM外,LangGraph 可以幫助管理井然有序的多步驟工作流程。
- 聊天機(jī)器人可以使用Django(一種可擴(kuò)展且簡(jiǎn)潔的Web平臺(tái))以API的形式公開。
我們先介紹簡(jiǎn)單的搭建,包括使用Pipenv安裝依賴項(xiàng),并克隆GitHub代碼庫(kù)。然后,我們將使用LangGraph定義聊天機(jī)器人的邏輯,圍繞它構(gòu)建一個(gè)基于Django的API,并連接一個(gè)基本的前端以便與其聯(lián)系。
無(wú)論你想了解LangGraph如何與實(shí)際后端協(xié)同工作,還是想構(gòu)建一個(gè)簡(jiǎn)單的聊天機(jī)器人,你都來(lái)對(duì)地方了。
快速入門:克隆并搭建項(xiàng)目
首先,克隆項(xiàng)目并搭建環(huán)境。確保你的系統(tǒng)上已安裝Python 3.12和Pipenv。如果沒有,可以使用以下命令安裝pipenv:
pip install pipenv
現(xiàn)在,克隆代碼庫(kù)并進(jìn)入項(xiàng)目文件夾:
git clone https://github.com/Badribn0612/chatbot_django_langgraph.git
cd chatbot_django_langgraph
現(xiàn)在不妨使用Pipenv安裝所有依賴項(xiàng)。
pipenv install
注意:如果你收到錯(cuò)誤消息,提示你的系統(tǒng)中沒有Python 3.12,請(qǐng)使用以下命令:
pipenv --python path/to/python
pipenv install
要知道Python的路徑,你可以使用以下命令:
which python (linux and windows)
which python3 (mac)
要激活此環(huán)境,請(qǐng)使用以下命令:
pipenv shell
鑒于我們的需求已滿足,接下來(lái)設(shè)置環(huán)境變量。使用以下命令創(chuàng)建一個(gè).env 文件。
touch .env
將你的API密鑰添加到.env 文件。
# Google Gemini AI
GOOGLE_API_KEY=your_google_api_key_here
# Groq
GROQ_API_KEY=your_groq_api_key_here
# Tavily Search
TAVILY_API_KEY=your_tavily_api_key_here
從Google AI Studio(https://aistudio.google.com/apikey)生成Google API密鑰,從Groq Console(https://console.groq.com/keys)生成Groq API密鑰,并從Tavily Home(https://app.tavily.com/home)獲取你的Tavily 密鑰。
搭建完成后,運(yùn)行以下命令(請(qǐng)確保已激活環(huán)境):
python manage.py migrate
python manage.py runserver
這應(yīng)該會(huì)啟動(dòng)服務(wù)器。
點(diǎn)擊應(yīng)用程序正在運(yùn)行的http://127.0.0.1:8000/鏈接。
使用LangGraph設(shè)計(jì)聊天機(jī)器人邏輯
現(xiàn)在,設(shè)計(jì)下聊天機(jī)器人邏輯。你可能想知道為什么選擇LangGraph?我選擇 LangGraph,是因?yàn)樗軌蜢`活地構(gòu)建適合用例的復(fù)雜工作流。它如同將多個(gè)函數(shù)拼接成一個(gè)對(duì)你的應(yīng)用程序真正有意義的流程。下面,我們將討論核心邏輯。完整代碼可在 Github 上找到:https://github.com/Badribn0612/chatbot_django_langgraph.git。
1. 狀態(tài)定義
class State(TypedDict):
messages: Annotated[list, add_messages]
該狀態(tài)模式負(fù)責(zé)聊天機(jī)器人。如果你的Graph處于循環(huán)狀態(tài),它將主要跟蹤消息歷史記錄;否則,它會(huì)有包含消息歷史記錄的輸入,并將LLM的響應(yīng)附加到之前的歷史記錄后面。
2. 初始化LangGraph
graph_builder = StateGraph(State)
上面這行代碼將初始化狀態(tài)圖。這個(gè)狀態(tài)圖實(shí)例負(fù)責(zé)維護(hù)聊天機(jī)器人的流程(對(duì)話流)。
3. 帶有后備模型的聊天模型
llm_with_fallbacks = init_chat_model("google_genai:gemini-2.0-flash").with_fallbacks(
[init_chat_model("groq:llama-3.3-70b-versatile")]
)
這基本上會(huì)將Gemini 2.0 Flash作為主LLM,將Llama 3.3 70B作為后備模型。如果谷歌服務(wù)器過(guò)載或API達(dá)到速率限制,它將開始使用Llama 3.3 70B。
4. 工具集成
tool = TavilySearch(max_results=2)
llm_with_tools = llm_with_fallbacks.bind_tools([tool])
我們還將向LLM添加搜索工具。當(dāng)LLM認(rèn)為它對(duì)查詢?nèi)狈α私鈺r(shí),將使用這項(xiàng)功能。它基本上會(huì)使用該工具搜索信息,檢索相關(guān)信息,并基于這些信息響應(yīng)查詢。
5. 聊天機(jī)器人節(jié)點(diǎn)邏輯
def chatbot(state: State):
return {"messages": [llm_with_tools.invoke(state["messages"])]}
這是負(fù)責(zé)調(diào)用LLM并獲取響應(yīng)的函數(shù)。使用LangGraph,你可以構(gòu)建一個(gè)由多個(gè)類似這樣的函數(shù)組成的狀態(tài)圖。你可以分支、合并,甚至并行運(yùn)行函數(shù)(LangGraph中稱為節(jié)點(diǎn))。對(duì)了,我差點(diǎn)忘了,你甚至可以在圖中創(chuàng)建循環(huán)。這就是LangGraph帶來(lái)的那種靈活性。
6. 工具節(jié)點(diǎn)和條件流
tool_node = ToolNode(tools=[tool])
graph_builder.add_conditional_edges("chatbot", tools_condition)
graph_builder.add_edge("tools", "chatbot")
我們將為該工具創(chuàng)建一個(gè)節(jié)點(diǎn),這樣,每當(dāng)聊天機(jī)器人搞清楚需要使用它時(shí),它就可以簡(jiǎn)單地調(diào)用該工具節(jié)點(diǎn)并獲取相關(guān)信息。
7. 圖入口和出口
graph_builder.add_edge(START, "chatbot")
graph = graph_builder.compile()
from IPython.display import Image, display
display(Image(graph.get_graph().draw_mermaid_png()))
上述代碼給出了所需的可視化效果。
該LangGraph環(huán)境允許你構(gòu)建一個(gè)結(jié)構(gòu)化的聊天機(jī)器人,它可以處理對(duì)話,需要時(shí)調(diào)用網(wǎng)絡(luò)搜索等工具,并在某個(gè)模型失敗時(shí)后備到替代模型。它具有模塊化,易于擴(kuò)展。現(xiàn)在 LangGraph部分已完成,不妨學(xué)習(xí)如何使用Django為我們的聊天機(jī)器人創(chuàng)建API。
使用Django構(gòu)建API
如果你是Django新手,可以使用本指南學(xué)習(xí)如何創(chuàng)建應(yīng)用程序。為此,我們已創(chuàng)建:
- 項(xiàng)目:djangoproj
- 應(yīng)用程序:djangoapp
第1步:應(yīng)用程序配置
在djangoapp/apps.py 中,我們定義應(yīng)用程序配置,以便Django能夠識(shí)別它:
from django.apps import AppConfig
class DjangoappConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "djangoapp"
Now register the app inside djangoproj/settings.py:
INSTALLED_APPS = [
# default Django apps...
"djangoapp",
]
第2步:創(chuàng)建聊天機(jī)器人API
在djangoapp/views.py中,我們定義一個(gè)用于處理POST請(qǐng)求的簡(jiǎn)單API端點(diǎn):
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
from chatbot import get_chatbot_response
@csrf_exempt
def chatbot_api(request):
if request.method == "POST":
try:
data = json.loads(request.body)
messages = data.get("messages", [])
user_query = data.get("query", "")
messages.append({"role": "user", "content": user_query})
response = get_chatbot_response(messages)
serialized_messages = [serialize_message(msg) for msg in response["messages"]]
return JsonResponse({"messages": serialized_messages})
except Exception as e:
return JsonResponse({"error": str(e)}, status=500)
return JsonResponse({"error": "POST request required"}, status=400)
- 該視圖接受用戶輸入,將其傳遞給基于LangGraph的聊天機(jī)器人,并返回響應(yīng)。
- @csrf_exempt用于測(cè)試/演示,以允許外部POST請(qǐng)求。
第3步:將API連接到URL
在djangoproj/urls.py中,將視圖連接到端點(diǎn):
from django.urls import path
from djangoapp.views import chatbot_api, chat_interface
urlpatterns = [
path('', chat_interface, name='chat_interface'),
path('api/chatbot/', chatbot_api, name='chatbot_api'),
]
現(xiàn)在,向/api/chatbot/發(fā)送POST請(qǐng)求將觸發(fā)聊天機(jī)器人并返回JSON響應(yīng)。
第4步:部署基本的聊天用戶界面
要顯示簡(jiǎn)單的界面,請(qǐng)?jiān)赿jangoapp/views.py中添加以下內(nèi)容:
from django.shortcuts import render
def chat_interface(request):
return render(request, 'index.html')
該視圖渲染index.html,這是基本的聊天界面。
在djangoproj/settings.py中,告訴Django去哪里查找模板:
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [BASE_DIR / "templates"],
# ...
},
]
我們已使用Django將LangGraph聊天機(jī)器人轉(zhuǎn)變成了實(shí)用的API,僅用幾行代碼,甚至還添加了一個(gè)用于與其交互的基本用戶界面。這種設(shè)計(jì)簡(jiǎn)潔、模塊化且易于擴(kuò)展,非常適合實(shí)際項(xiàng)目和演示。
以下是聊天機(jī)器人的實(shí)際演示:
你可以在此基礎(chǔ)上構(gòu)建的功能
以下是你可以在該應(yīng)用程序基礎(chǔ)上構(gòu)建的一些功能:
- 設(shè)置系統(tǒng)提示和智能體角色來(lái)指導(dǎo)行為和響應(yīng)。
- 創(chuàng)建多個(gè)專用智能體和一個(gè)路由智能體,以根據(jù)用戶輸入委派任務(wù)。
- 插入RAG工具以引入你自己的數(shù)據(jù)并豐富響應(yīng)。
- 將對(duì)話歷史記錄存儲(chǔ)在數(shù)據(jù)庫(kù)(比如PostgreSQL)中,并與用戶會(huì)話關(guān)聯(lián),以實(shí)現(xiàn)連續(xù)性和分析。
- 實(shí)現(xiàn)智能消息窗口或摘要功能,以輕松應(yīng)對(duì)token限制。
- 使用提示模板或者Guardrails AI或NeMo等工具,進(jìn)行輸出驗(yàn)證和安全過(guò)濾。
- 使用Gemini 2.5 pro或GPT-4.1等功能強(qiáng)大的模型,添加支持圖像或文件處理的功能。
結(jié)論
全文就是這樣!我們剛使用LangGraph和Django從零開始構(gòu)建了一個(gè)功能齊全的聊天機(jī)器人,它擁有簡(jiǎn)潔的API、工具集成、帶有后備模型的LLM 等等。最棒的是,它是模塊化的,非常易于擴(kuò)展。無(wú)論你是想為自己的產(chǎn)品構(gòu)建智能助手、嘗試多智能體系統(tǒng),還是只是想試試LangGraph,本文都為你提供了一個(gè)堅(jiān)實(shí)的起點(diǎn)。你還可以探究更多內(nèi)容,比如添加圖像輸入、插入自己的知識(shí)庫(kù)。所以,請(qǐng)繼續(xù)嘗試,在此基礎(chǔ)上不斷構(gòu)建。
原文標(biāo)題:Building a Conversational AI App with Django and LangGraph,作者:Badrinarayan M