从Jupyter到Web应用:用Python、FastAPI与LangChain构建可部署的AI工具(第1/2部分)
为何需要将AI脚本转化为Web应用
在Jupyter Notebook中成功验证一个AI模型(如问答或文本摘要)后,其价值往往受限于本地环境。团队无法协作,用户无法访问,模型的价值难以释放。
核心在于:AI的价值不仅在于模型本身,更在于其可访问性和可用性。FastAPI和LangChain正是为此而生,它们能将实验性代码转化为可通过Web浏览器访问的实用工具。
本指南旨在提供一条清晰的实践路径,将您的AI脚本转化为一个功能完整、可部署的Web应用。

技术栈概览:各司其职
在开始构建前,明确每个组件的角色至关重要:
- FastAPI: 用于构建高性能的Web API。它是您的AI模型与外部世界(如浏览器、移动应用)通信的桥梁。
- LangChain: 一个用于开发由语言模型驱动的应用程序的框架。它简化了与AI模型(如OpenAI GPT)的集成,并提供了上下文管理、记忆、文档处理等高级功能。
- Python: 作为粘合剂,将上述所有组件以及您的业务逻辑整合在一起。
一个形象的比喻是构建一家餐厅:
* Python 是后厨,负责所有核心的食材处理和烹饪逻辑。
* FastAPI 是前台和点餐窗口,负责接收客户订单并递送成品。
* LangChain 是那位技艺高超的主厨,不仅懂得烹饪(调用模型),还能记住熟客的喜好(记忆),并快速从食谱库中找到相关菜谱(文档检索)。
快速入门:5分钟创建首个API
让我们从创建一个最简单的FastAPI应用开始。
首先,安装必要的库:
pip install fastapi uvicorn
创建一个名为 main.py 的文件,并写入以下代码:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello! Your AI backend is now live."}
在终端中,运行以下命令启动开发服务器:
uvicorn main:app --reload
打开浏览器,访问 http://localhost:8000。您将看到返回的JSON消息。恭喜,您的第一个Web API已成功运行!
发生了什么?
您启动了一个本地Web服务器(Uvicorn)。当用户访问根路径(/)时,FastAPI会调用 read_root 函数,并将其返回值(一个Python字典)自动转换为JSON格式返回给客户端。
集成LangChain:为API注入AI能力
现在,让我们为这个API添加一个“大脑”。我们将集成LangChain来调用OpenAI的模型。
首先,安装LangChain和OpenAI库:
pip install langchain openai
重要提示:您需要一个OpenAI API密钥。请将其设置为环境变量 OPENAI_API_KEY。
更新 main.py 文件,添加一个处理AI问答的端点:
from fastapi import FastAPI
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
app = FastAPI()
# 初始化语言模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)
@app.post("/ask")
def ask_ai(question: str):
# 构建提示词模板
template = ChatPromptTemplate.from_template(
"You are a helpful assistant. Please answer the following question clearly: {input}"
)
# 格式化提示词
formatted_prompt = template.format_messages(input=question)
# 调用模型获取响应
response = llm(formatted_prompt)
return {"answer": response.content}
代码解析:
1. 我们创建了一个 POST 类型的端点 /ask,它接受一个字符串参数 question。
2. 使用 ChatPromptTemplate 构建了一个标准化的提示词,确保AI以“有帮助的助手”角色回答。
3. llm(formatted_prompt) 是调用AI模型的核心语句。
4. FastAPI将模型返回的答案内容包装在JSON响应中返回。
您可以使用 curl 命令进行测试:
curl -X POST "http://localhost:8000/ask?question=Explain quantum computing in simple terms."
至此,您已经构建了一个具备基础问答功能的AI API。
添加上下文记忆
上述的AI每次问答都是独立的,它没有“记忆”能力。为了让对话更连贯(例如,在聊天机器人场景中),我们需要为LangChain链添加记忆组件。


我们将使用 ConversationBufferMemory 来存储对话历史。更新代码如下:
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 创建记忆存储
memory = ConversationBufferMemory()
# 创建带有记忆的对话链
conversation_chain = ConversationChain(llm=llm, memory=memory)
@app.post("/chat")
def chat_with_memory(message: str):
# 使用链进行预测,链会自动处理记忆的存储和读取
response = conversation_chain.predict(input=message)
return {"response": response}
现在,当您向 /chat 端点发送一系列消息时,AI能够基于之前的对话历史进行回复,实现真正的多轮对话。
构建文档问答系统
让AI能够读取您提供的文档(如PDF、TXT)并基于内容回答问题,是另一个强大的应用场景。其核心流程是“检索增强生成”(RAG)。


- 文档加载与分割: 将长文档切分成语义相关的小块。
- 向量化与存储: 将文本块转换为向量(Embeddings),并存入向量数据库,使其可被快速检索。
- 检索与生成: 当用户提问时,系统检索最相关的文本块,将其与问题一起交给AI模型生成答案。
以下是实现文档问答端点的示例代码:
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
# 1. 加载PDF文档
loader = PyPDFLoader("path/to/your/document.pdf")
documents = loader.load()
# 2. 分割文本
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 每个文本块的大小
chunk_overlap=200 # 块之间的重叠部分,有助于保持上下文
)
texts = text_splitter.split_documents(documents)
# 3. 创建向量存储(向量数据库)
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(texts, embeddings)
# 4. 创建检索式问答链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 其他选项如 “map_reduce”, “refine”
retriever=vectorstore.as_retriever()
)
@app.post("/ask_doc")
def ask_document(question: str):
answer = qa_chain.run(question)
return {"answer": answer}
关键参数说明:
* chunk_size: 影响检索精度和模型处理效率。通常500-1500字符是较好的起点。
* temperature: 控制模型输出的随机性。对于事实性问答,建议设置为 0 以获得更确定性的答案;对于创意写作,可以设置为 0.7 或更高。
添加简易前端界面(Streamlit)
虽然API功能完整,但一个直观的网页界面能极大提升用户体验。我们可以使用Streamlit快速构建一个前端。
创建一个新的文件 app_ui.py:
import streamlit as st
import requests
# 设置页面标题
st.title("📄 AI Document Assistant")
# 输入框
question = st.text_input("Ask a question about your uploaded document:")
if st.button("Get Answer"):
if question:
# 调用我们刚刚构建的后端API
response = requests.post(
"http://localhost:8000/ask_doc",
params={"question": question}
)
if response.status_code == 200:
answer = response.json().get("answer", "No answer found.")
st.success("**Answer:**")
st.write(answer)
else:
st.error("Failed to get an answer from the server.")
else:
st.warning("Please enter a question.")
在另一个终端运行Streamlit应用:
streamlit run app_ui.py
现在,打开浏览器访问Streamlit提供的本地地址(通常是 http://localhost:8501),您就拥有了一个与AI文档助手交互的图形界面。

容器化与部署
为了让他人能够稳定地使用您的应用,需要将其部署到云服务器上。Docker是实现应用环境标准化和便捷部署的利器。
创建一个 Dockerfile:
# 使用官方Python基础镜像
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
创建一个 requirements.txt 文件,列出所有依赖:
fastapi>=0.104.0
uvicorn>=0.24.0
langchain>=0.0.340
openai>=1.0.0
python-multipart
构建并运行Docker镜像:
# 构建镜像
docker build -t my-ai-assistant .
# 运行容器
docker run -p 8000:8000 --env OPENAI_API_KEY=your_api_key_here my-ai-assistant
现在,您的AI应用已被封装在一个独立的容器中,可以轻松部署到任何支持Docker的云平台(如AWS ECS, Google Cloud Run, Azure Container Instances等)。
实践蓝图:分步实施计划
第一阶段:搭建基础框架
- 环境准备: 配置Python虚拟环境,安装核心依赖(FastAPI, Uvicorn, LangChain)。
- 创建API骨架: 实现基础的FastAPI应用结构,包含健康检查端点。
- 集成基础AI: 使用LangChain接入OpenAI API,创建一个简单的问答端点。
- 本地测试: 使用curl或浏览器测试API功能。
第二阶段:增强核心智能
- 实现文档处理: 集成文档加载器(如PyPDFLoader),实现文本分割和向量化存储。
- 构建RAG管道: 创建基于向量检索的文档问答端点。
- 添加上下文记忆: 为聊天端点集成ConversationBufferMemory,支持多轮对话。
- 完善错误处理: 为API添加全局异常处理,确保服务的健壮性。
第三阶段:优化与交付
- 开发用户界面: 使用Streamlit或轻量级前端框架(如Vue/React)构建一个简单的Web界面。
- 添加安全措施: 根据需求,为API添加API密钥认证或更复杂的身份验证(如OAuth2)。
- 容器化应用: 编写Dockerfile,将应用及其依赖打包成镜像。
- 部署与监控: 将Docker镜像部署到云服务器,并设置基本的日志和性能监控。
通过遵循以上计划,您可以将一个停留在Jupyter Notebook中的AI想法,系统地演进为一个可供团队或用户使用的生产级Web应用。在下一部分,我们将深入探讨更高级的主题,如优化检索精度、处理流式响应、以及构建更复杂的AI工作流。
起步模板
from fastapi import FastAPI, HTTPException
from langchain.chat_models import ChatOpenAI
import os
# 初始化应用和模型
app = FastAPI()
llm = ChatOpenAI(
model="gpt-4",
api_key=os.getenv("OPENAI_API_KEY")
)
@app.get("/")
def home():
return {"status": "AI tool is running!"}
@app.post("/ask")
def ask(question: str):
try:
response = llm.invoke(question)
return {"answer": response.content}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# 在此处添加你自己的端点!
这个模板提供了一个最简可用的起点。它创建了一个 FastAPI 应用,集成了 LangChain 的 GPT-4 模型,并定义了两个端点:
1. 根路径 (/):一个简单的健康检查端点,用于确认服务正在运行。
2. 问答端点 (/ask):一个接收用户问题并返回 AI 生成答案的 POST 接口。
你可以以此为基础,通过添加更多端点、集成不同工具或链来扩展功能。
总结与展望
至此,你已经掌握了将 Jupyter 笔记本中的 AI 原型转化为可部署、可交互的 Web 应用的核心流程。通过结合 FastAPI 和 LangChain,你现在能够:
- 构建标准化的 Web API:创建可供其他应用或前端调用的接口。
- 集成外部数据源:轻松连接数据库、文档或 APIs,让 AI 基于你的特定数据工作。
- 添加上下文与记忆:构建能够进行多轮对话、理解历史交互的智能工具。
- 实现稳定部署:将应用部署到服务器,提供 24/7 的可靠服务。
这仅仅是开始。基于此技术栈,你可以进一步开发:
- 领域专用的聊天机器人(如客服、技术支持)。
- 智能文档分析与摘要工具,快速提取关键信息。
- 自动化流程助手,处理重复性的查询与任务。
- 团队内部效率工具,如知识库问答或报告生成器。
下一步行动建议:选择一个具体的小型项目立即开始实践,例如一个简单的 PDF 内容问答工具或一个针对特定知识库的聊天机器人。从最小可行产品(MVP)入手,在实现核心功能并成功运行后,你将获得持续迭代和扩展的强大动力。
将 AI 实验转化为实际可用的工具,往往只需要在 FastAPI 和 LangChain 的框架下进行几个小时的专注开发。现在就去构建一些有价值的东西吧!
如果在开发过程中遇到问题,请优先查阅 FastAPI 官方文档 和 LangChain 官方文档,它们是详尽且权威的参考资料。这两个项目都拥有活跃友好的社区,也能为你提供宝贵的支持。
关注“鲸栖”小程序,掌握最新AI资讯
本文由鲸栖原创发布,未经许可,请勿转载。转载请注明出处:http://www.itsolotime.com/archives/13279
