langgraph简单Demo(使用langserve实现外部调用)
前言
这个示例是研究如何使用langserve实现外部调用
接入大模型参考文章:接入阿里云百炼
1、安装依赖
pip install langserve fastapi uvicorn
pip install sse_starlette
2、代码实现
from fastapi import FastAPI
from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI
from langserve import add_routes
from langchain_core.runnables import RunnableLambda
from langgraph.graph import StateGraph, END
import os
from openai import BaseModel
# 初始化模型(这个地方不知道怎么配置的参考我的上一篇文章:https://blog.csdn.net/qq_33247435/article/details/146216842
model = ChatOpenAI(
model="deepseek-r1",
openai_api_key=os.environ["BAILIAN_API_KEY"],
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
streaming=False # 禁用流式传输
)
# 定义链式处理流程
def create_chain():
def assistant_node(state: dict):
last_message = state["messages"][-1]
response = model.invoke([
AIMessage(content="你是一个友好的助手"),
last_message
])
return {"messages": [AIMessage(content=response.content)]}
workflow = StateGraph(dict)
workflow.add_node("assistant", assistant_node)
workflow.set_entry_point("assistant")
workflow.add_edge("assistant", END)
return workflow.compile()
# 创建FastAPI应用
app = FastAPI(
title="LangChain Server",
version="1.0",
)
# 定义输入模型
class ChatRequest(BaseModel):
messages: list
# 修改路由配置
add_routes(
app,
RunnableLambda(create_chain().invoke),
path="/chat",
input_type=ChatRequest, # 使用自定义输入模型
)
# 修改运行示例部分(调试用)
if __name__ == "__main__":
import uvicorn
print("测试输入格式:", ChatRequest(messages=[{"content": "测试"}]).model_dump()) # 添加调试输出
uvicorn.run(app, host="0.0.0.0", port=8000)
3、效果
启动项目之后就可以直接访问接口文档
文档地址:http://localhost:8000/docs
文档效果:
请求参数:
{
"input": {
"messages": [
{
"content": "你好,推荐一本科幻小说",
"type": "human"
}
]
}
}
响应结果如下:
{
"output": {
"messages": [
{
"content": "你好!如果你喜欢结合哲学思考与独特叙事结构的科幻作品,推荐特德·姜(Ted Chiang)的短篇小说集《你一生的故事》(*Stories of Your Life and Others*)。这部作品以语言学与物理学为切入点,探讨了时间、自由意志与人类认知的边界,尤其是标题篇《你一生的故事》将外星人“七肢桶”的非线性语言与主角的命运交织,呈现了宿命论与选择的深刻主题。文字细腻且逻辑严谨,曾被改编为电影《降临》,但原著对时间本质的探讨更为深邃。如果你偏好硬核科幻与人文哲思的结合,这本书会非常值得一读!",
"additional_kwargs": {},
"response_metadata": {},
"type": "ai",
"name": null,
"id": null,
"example": false,
"tool_calls": [],
"invalid_tool_calls": [],
"usage_metadata": null
}
]
},
"metadata": {
"run_id": "72297980-1b46-4667-ab37-a460ef9f389b",
"feedback_tokens": []
}
}
调用效果如图: