当前位置: 首页 > article >正文

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": []
    }
}

调用效果如图:
在这里插入图片描述


http://www.kler.cn/a/592392.html

相关文章:

  • 该错误是由于`KuhnMunkres`类未定义`history`属性导致的
  • 记一次服务器中木马导致cpu占用高的问题
  • scrollIntoView 的behavior都有哪些属性
  • 知识蒸馏:从软标签压缩到推理能力迁移的工程实践(基于教师-学生模型的高效压缩技术与DeepSeek合成数据创新) (1)
  • 机器学习和深度学习中参数概览
  • 基于Python+Django的二手房信息管理系统
  • 替代Qt中信号与槽的完整例子。
  • 【NeurIPS 2021】Autoformer、源码论文对照(下)
  • Dear ImGui for Unity 常见问题解决方案
  • C++ 头文件说明
  • Session 、Cookies 和 Token关系于区别
  • Compose 的产生和原理
  • 材质 × 碰撞:Threejs 物理引擎的双重魔法
  • javascript语法入门
  • Python:多态,静态方法和类方法
  • 小程序开发中的安全问题及防护措施
  • Android Compose 框架按钮与交互组件模块源码深度剖析(二)
  • GPU 上的 Reduction(归约)和 Scan(前缀和)优化:LLVM、GPU 指令集与架构差异
  • 【Node.js入门笔记9---http 模块】
  • 使用Nginx实现后端负载均衡