
from fastapi import FastAPI # ✅ 新版标准导入 from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langserve import add_routes import uvicorn import os from langchain_community.llms import Ollama from dotenv import load_dotenv from fastapi.middleware.cors import CORSMiddleware load_dotenv() os.environ[OPENAI_API_KEY] os.getenv(OPENAI_API_KEY) app FastAPI( titleLangchain Server, version1.0, descriptionA simple API Server ) # 增加跨域方便前端/Streamlit调用 app.add_middleware( CORSMiddleware, allow_origins[*], allow_credentialsTrue, allow_methods[*], allow_headers[*], ) # 原生OpenAI模型路由 add_routes( app, ChatOpenAI( modelqwen-turbo, base_urlos.getenv(OPENAI_API_BASE) ), path/openai ) openai_model ChatOpenAI( modelqwen-turbo, base_urlos.getenv(OPENAI_API_BASE) ) # 替换为你常用的本地模型 ollama_llm Ollama(modelqwen2.5:7b) prompt_essay ChatPromptTemplate.from_template(Write me an essay about {topic} with 100 words) prompt_poem ChatPromptTemplate.from_template(Write me an poem about {topic} for a 5 years child with 100 words) add_routes( app, prompt_essay | openai_model, path/essay ) add_routes( app, prompt_poem | ollama_llm, path/poem ) if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)代码完整逐行解读这是一套FastAPI LangServe搭建的大模型 API 服务程序。 作用把 LangChain LCEL 链路封装成标准 REST API前端 / 其它程序可以 HTTP 调用同时兼容通义千问兼容 OpenAI 接口的远程大模型qwen-turboOllama 本地开源模型qwen2.5:7b 对外暴露多条可直接调用的流式 / 非流式对话接口。一、整体架构概述plaintext客户端(前端/Streamlit/脚本) → FastAPI服务 ├─ /openai → 原始ChatOpenAI模型裸接口 ├─ /essay → Prompt模板 通义千问生成短文 └─ /poem → Prompt模板 Ollama本地模型生成儿童诗歌add_routes()是 LangServe 核心能力自动把 LangChain Runnables 封装成 RESTful API自带 OpenAPI 文档、流式输出、请求校验。二、逐段代码详细解析1. 依赖导入python运行from fastapi import FastAPI # langchain 新版规范所有核心抽象放入 langchain_core from langchain_core.prompts import ChatPromptTemplate # OpenAI兼容接口封装阿里云/DeepSeek/通义千问都用这个 from langchain_openai import ChatOpenAI # LangServe自动将runnable挂载为FastAPI路由 from langserve import add_routes import uvicorn import os # Ollama本地模型集成 from langchain_community.llms import Ollama # .env环境变量读取 from dotenv import load_dotenv # 跨域中间件解决前端浏览器跨域报错 from fastapi.middleware.cors import CORSMiddleware重点知识点 LangChain v0.1 规范拆分包langchain_core基础组件Prompt、Runnablelangchain_openai官方维护 OpenAI 封装langchain_community社区第三方集成Ollama、各类小众工具2. 加载环境变量python运行load_dotenv() os.environ[OPENAI_API_KEY] os.getenv(OPENAI_API_KEY)load_dotenv()读取项目根目录.env文件需要在.env 中配置两条关键变量envOPENAI_API_KEYsk-xxxx OPENAI_API_BASEhttps://dashscope.aliyuncs.com/compatible-mode/v1因为调用阿里云通义千问兼容 OpenAI 协议必须配置base_url。3. 创建 FastAPI 实例python运行app FastAPI( titleLangchain Server, version1.0, descriptionA simple API Server )FastAPI Web 服务主对象自动生成接口文档文档地址http://127.0.0.1:8000/docs替代文档http://127.0.0.1:8000/redoc4. CORS 跨域中间件python运行app.add_middleware( CORSMiddleware, allow_origins[*], allow_credentialsTrue, allow_methods[*], allow_headers[*], )作用浏览器前端Streamlit/Vue/React访问后端接口不会报跨域错误。⚠️生产环境不要写[*]需要指定固定域名提升安全。5. 路由 1裸模型接口/openaipython运行add_routes( app, ChatOpenAI( modelqwen-turbo, base_urlos.getenv(OPENAI_API_BASE) ), path/openai )直接挂载原始大模型 Runnable客户端可以自由传入系统提示词、用户消息无固定 Prompt 模板请求格式遵循 LangServe 标准消息格式6. 初始化两个模型实例python运行openai_model ChatOpenAI( modelqwen-turbo, base_urlos.getenv(OPENAI_API_BASE) ) # 本地Ollama模型需要提前在本地执行 ollama pull qwen2.5:7b ollama_llm Ollama(modelqwen2.5:7b)openai_model远程通义千问 qwen-turbo云端ollama_llm本地运行 qwen2.5:7b不需要 API Key依赖 Ollama 服务启动默认localhost:114347. 定义 Prompt 模板python运行prompt_essay ChatPromptTemplate.from_template(Write me an essay about {topic} with 100 words) prompt_poem ChatPromptTemplate.from_template(Write me an poem about {topic} for a 5 years child with 100 words){topic}是变量占位符调用接口时传入 topic 参数动态填充。ChatPromptTemplate.from_template构建可链式调用的 Prompt Runnable。8. LangChain 管道链式语法|LangChain 重载|运算符等价于RunnableSequencepython运行prompt_essay | openai_model执行流程输入参数 → 填充Prompt模板 → 传给LLM → 返回模型输出挂载成接口python运行add_routes( app, prompt_essay | openai_model, path/essay ) add_routes( app, prompt_poem | ollama_llm, path/poem )/essay云端 qwen-turbo 写短文入参只有topic/poem本地 Ollama qwen2.5:7b 写儿童诗歌9. 服务启动入口python运行if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)host0.0.0.0允许局域网其他设备访问如果写 127.0.0.1 只能本机调用端口 8000三、如何调用接口示例启动服务后访问http://localhost:8000/docs可以在线调试调用 /essayPOSThttp://localhost:8000/essay/invokejson{ input: {topic: summer} }调用 /poemPOSThttp://localhost:8000/poem/invokejson{ input: {topic: cat} }同时支持流式接口/essay/stream、/poem/stream实现打字机流式输出。四、代码存在的问题 优化建议1. 重复实例化 ChatOpenAIpython运行# 一处add_routes内部新建 add_routes(app, ChatOpenAI(...), path/openai) # 另一处又新建 openai_model ChatOpenAI(...)优化复用同一个实例节省资源python运行openai_model ChatOpenAI( modelqwen-turbo, base_urlos.getenv(OPENAI_API_BASE) ) add_routes(app, openai_model, path/openai)2. Ollama 默认地址硬编码风险Ollama 默认http://localhost:11434如需局域网访问需要显式指定python运行ollama_llm Ollama( modelqwen2.5:7b, base_urlhttp://0.0.0.0:11434 )3. 缺少异常捕获、日志、超时配置生产环境建议增加LLM 调用 timeout 超时请求日志全局异常处理器4. CORSallow_origins[*]不安全正式部署改成指定域名python运行allow_origins[http://localhost:8501] # streamlit地址5. Prompt 中英文混杂如果你面向中文使用建议把 prompt 改成中文模型输出效果更好。6. 没有限制最大并发、缺少鉴权当前所有接口公开访问公网部署务必增加 API 密钥鉴权中间件。五、配套 .env 文件示例新建.env和代码放在同一目录envOPENAI_API_KEYsk-xxxxxxxxxxxxxxxxxx OPENAI_API_BASEhttps://dashscope.aliyuncs.com/compatible-mode/v1六、运行前置条件安装依赖bash运行pip install fastapi uvicorn langchain langchain-core langchain-openai langchain-community langserve python-dotenv ollama本地安装 Ollama执行ollama pull qwen2.5:7b配置.env 里阿里云通义千问 key启动python main.py