公司动态
从零构建AI应用:基于LangChain与FastAPI的智能文本摘要生成器实战
最近在后台收到不少私信很多同学反映看了很多关于AI的“切片式”教程感觉知识点很零散好像什么都懂一点但真要自己动手做一个完整的AI应用却不知从何下手。这确实是很多初学者面临的困境——信息碎片化缺乏一条从零到一、贯穿始终的实践路径。本文旨在解决这个问题。我将带你完整地走一遍AI应用开发的全流程从环境搭建、模型选择、数据准备、代码编写到最终部署和优化。这不是一个概念介绍而是一个手把手的实战项目。我们将以构建一个“智能文本摘要生成器”为例涵盖当前AI开发的核心环节。无论你是刚入门的学生还是希望将AI能力集成到业务中的开发者跟着本文走完你都能获得一套可复用的方法论和可直接运行的代码。1. 项目概述与核心概念在开始敲代码之前我们首先要明确我们要做什么以及会用到哪些关键技术。1.1 项目目标智能文本摘要生成器我们将开发一个Web应用用户输入一篇长文章例如新闻、报告应用能够自动生成一个简洁、准确的摘要。这个项目看似简单却涵盖了现代AI应用开发的典型流程环境与工具准备搭建Python开发环境安装必要的库。模型选择与接入如何选择并调用一个合适的大语言模型LLM。应用逻辑开发构建Web后端API和前端的交互界面。提示工程设计有效的指令Prompt让模型更好地完成任务。部署与优化将应用部署到服务器并考虑性能、成本等实际问题。1.2 核心AI概念澄清为了避免混淆我们先厘清几个高频术语AI大模型LLM如GPT、文心一言、通义千问等。它们是经过海量数据训练、能够理解和生成自然语言的“大脑”。我们的应用将调用它们的能力。AI Agent可以理解为“AI代理”。它是一个能自主理解目标、规划步骤、使用工具如搜索、计算、调用API来完成复杂任务的智能体。本文的项目是一个相对简单的“工具使用型”应用但理解了基础流程是迈向构建复杂Agent的第一步。提示词工程如何与AI模型“对话”的艺术。不同的提问方式会得到质量迥异的答案。这是开发AI应用的核心技能之一。Spring AI / LangChain它们是帮助开发者更便捷地集成、编排AI能力的框架。Spring AI适合Java生态LangChain在Python生态中更为流行。本文将使用Python和LangChain来演示因其在快速原型开发上更具优势。为什么选择“摘要生成”作为示例因为它需求明确、效果直观且涉及了文本理解、内容提炼等核心NLP任务非常适合作为第一个全流程实战项目。2. 环境准备与工具栈工欲善其事必先利其器。以下是完成本项目所需的环境和工具清单。2.1 基础开发环境操作系统Windows 10/11, macOS, 或 Linux (Ubuntu 20.04)。本文命令以macOS/Linux为例Windows用户可在PowerShell或WSL2中运行。Python版本 3.8 或 3.9。不推荐使用Python 3.10以上的最新版本以避免某些库的兼容性问题。# 检查Python版本 python --version # 或 python3 --version包管理工具pip。建议使用虚拟环境隔离项目依赖。# 创建虚拟环境以项目目录名为ai_summarizer为例 python -m venv ai_summarizer_env # 激活虚拟环境 # macOS/Linux: source ai_summarizer_env/bin/activate # Windows: # ai_summarizer_env\Scripts\activate代码编辑器VS Code推荐插件丰富或 PyCharm。2.2 核心Python库我们将使用LangChain作为AI应用开发框架它抽象了与不同模型交互的细节让我们更关注业务逻辑。同时我们需要一个简单的Web框架来提供API。在激活的虚拟环境中执行以下命令安装依赖pip install langchain langchain-openai langchain-community pip install fastapi uvicorn pip install python-dotenvlangchain: 核心框架。langchain-openai: 用于接入OpenAI系列模型如GPT-3.5/4的官方集成包。langchain-community: 包含大量社区维护的第三方模型和工具集成。fastapiuvicorn: 用于快速构建高性能Web API。python-dotenv: 用于管理环境变量如API密钥避免将敏感信息硬编码在代码中。2.3 模型API密钥准备我们需要一个AI模型的API来提供智能能力。这里有几个主流选择OpenAI最成熟文档齐全但需要海外支付方式。国内大模型平台如智谱AIChatGLM、百度文心千帆、阿里灵积、月之暗面Kimi等对国内开发者更友好。本文以智谱AIZhipu AI为例因为它提供了免费的额度供开发者测试。请按照以下步骤获取访问 智谱AI开放平台 并注册账号。在控制台创建API Key并记录下来。重要永远不要将API Key提交到Git等版本控制系统我们将使用.env文件来管理。在项目根目录下创建.env文件# .env ZHIPUAI_API_KEYyour_actual_api_key_here将your_actual_api_key_here替换为你自己的密钥。3. 项目结构与核心代码实现现在让我们开始构建应用。首先创建项目结构。3.1 项目目录结构ai_summarizer/ ├── .env # 环境变量文件需自行创建并加入.gitignore ├── .gitignore # Git忽略文件 ├── app/ │ ├── __init__.py │ ├── main.py # FastAPI应用主文件 │ ├── chains.py # LangChain链的定义 │ └── prompts.py # 提示词模板 ├── requirements.txt # 项目依赖列表 └── README.md创建requirements.txt文件内容即我们安装的依赖langchain langchain-openai langchain-community fastapi uvicorn python-dotenv3.2 构建提示词模板提示词是驱动模型的核心。在app/prompts.py中我们设计一个专门用于摘要的提示词模板。# app/prompts.py from langchain.prompts import PromptTemplate # 定义一个专业的文本摘要提示词模板 SUMMARY_PROMPT_TEMPLATE 你是一个专业的文本编辑助理擅长提炼文章核心内容。 请根据用户提供的文章生成一个简洁、准确、连贯的摘要。 要求 1. 摘要长度控制在原文的20%以内。 2. 必须保留原文的核心事实、关键数据和主要结论。 3. 语言流畅使用中文。 4. 如果原文有明确的章节结构摘要可以适当体现。 原文 {text} 摘要 # 使用 LangChain 的 PromptTemplate 封装 summary_prompt PromptTemplate( input_variables[text], templateSUMMARY_PROMPT_TEMPLATE, )提示词设计要点角色设定让模型进入“专业编辑”的角色。任务明确清晰指出任务是“生成摘要”。具体要求给出长度、内容、语言等约束让输出更可控。变量占位符{text}是留给用户输入文章的位置。3.3 创建LangChain处理链链Chain是LangChain的核心概念它将提示词、模型、输出解析器等组件连接起来形成一个可执行的工作流。在app/chains.py中创建我们的摘要链。# app/chains.py import os from dotenv import load_dotenv from langchain.chains import LLMChain from langchain_community.chat_models import ChatZhipuAI from app.prompts import summary_prompt # 加载环境变量 load_dotenv() def create_summary_chain(): 创建并返回一个配置好的文本摘要链。 # 1. 初始化模型 # 从环境变量获取API Key api_key os.getenv(ZHIPUAI_API_KEY) if not api_key: raise ValueError(请在 .env 文件中设置 ZHIPUAI_API_KEY) # 使用智谱AI的ChatGLM模型这里以 glm-4 为例 llm ChatZhipuAI( modelglm-4, # 或其他可用模型如 glm-3-turbo api_keyapi_key, temperature0.3, # 控制创造性越低输出越稳定 top_p0.8, ) # 2. 创建链将提示词模板和模型组合起来 summary_chain LLMChain(llmllm, promptsummary_prompt, verboseFalse) return summary_chain # 导出一个全局可用的链实例 summary_chain create_summary_chain()代码解释load_dotenv()从.env文件加载我们的API密钥。ChatZhipuAI这是langchain-community中封装的智谱AI模型类。我们指定了模型名称glm-4和必要的参数。temperature生成文本的随机性。值越低如0.1-0.3输出越确定、保守值越高输出越有创意、多样。对于摘要任务我们倾向于稳定输出。LLMChain最简单的链接收输入变量这里就是text通过提示词模板填充发送给模型并返回模型的输出。3.4 构建FastAPI Web服务现在我们创建一个Web API接收用户提交的文章调用上面的链生成摘要并返回结果。在app/main.py中编写。# app/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from app.chains import summary_chain from fastapi.middleware.cors import CORSMiddleware # 定义请求体的数据模型 class SummarizeRequest(BaseModel): text: str max_length: int 500 # 可选参数用于前端控制摘要长度预期 # 定义响应体的数据模型 class SummarizeResponse(BaseModel): summary: str model_used: str processing_time: float # 创建FastAPI应用实例 app FastAPI(titleAI文本摘要生成器, version1.0.0) # 添加CORS中间件允许前端跨域请求开发时有用 app.add_middleware( CORSMiddleware, allow_origins[*], # 生产环境应替换为具体的前端域名 allow_credentialsTrue, allow_methods[*], allow_headers[*], ) app.get(/) def read_root(): return {message: AI文本摘要生成器API已就绪请使用 POST /summarize 来生成摘要。} app.post(/summarize, response_modelSummarizeResponse) async def summarize_text(request: SummarizeRequest): 接收文本并返回AI生成的摘要。 if not request.text or len(request.text.strip()) 50: raise HTTPException(status_code400, detail输入文本过短请提供至少50个字符的内容。) try: import time start_time time.time() # 调用LangChain链生成摘要 result summary_chain.run(textrequest.text) end_time time.time() processing_time round(end_time - start_time, 2) return SummarizeResponse( summaryresult.strip(), model_usedChatGLM-4 (via ZhipuAI), processing_timeprocessing_time ) except Exception as e: # 记录详细的错误日志实际项目中应使用logging模块 print(f摘要生成失败: {e}) raise HTTPException(status_code500, detailf摘要生成服务暂时不可用: {str(e)})代码解释Pydantic模型SummarizeRequest和SummarizeResponse用于定义API的输入输出格式确保类型安全并自动生成API文档。CORS跨域资源共享中间件方便我们后续用前端页面测试。/summarize端点首先进行简单的输入验证。使用try...except包裹核心逻辑进行基本的错误处理。调用summary_chain.run(text...)来执行摘要生成。计算处理耗时并返回结构化的响应。3.5 运行与测试一切就绪让我们启动服务并测试。启动服务在项目根目录下运行uvicorn app.main:app --reload --host 0.0.0.0 --port 8000--reload代码修改后自动重启便于开发。--host 0.0.0.0允许本地网络访问。--port 8000指定端口。测试API打开浏览器访问http://localhost:8000/docs你会看到自动生成的Swagger UI交互式文档。在/summarize的Try it out区域输入一段长文本点击Execute。示例输入{ text: 人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来理论和技术日益成熟应用领域也不断扩大可以设想未来人工智能带来的科技产品将会是人类智慧的‘容器’。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能但能像人那样思考、也可能超过人的智能。 }你应该会收到一个包含生成摘要的JSON响应。使用命令行工具curl测试curl -X POST http://localhost:8000/summarize \ -H Content-Type: application/json \ -d {text:这里放入你的长篇文章内容...}4. 前端界面可选但推荐为了让项目更完整我们创建一个简单的前端页面来调用这个API。在项目根目录创建static/index.html。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleAI文本摘要生成器/title style body { font-family: sans-serif; max-width: 800px; margin: 40px auto; padding: 20px; } .container { border: 1px solid #ccc; border-radius: 8px; padding: 25px; } h1 { color: #333; } textarea { width: 100%; height: 200px; margin: 15px 0; padding: 10px; box-sizing: border-box; } button { background-color: #007bff; color: white; border: none; padding: 12px 25px; border-radius: 5px; cursor: pointer; font-size: 16px; } button:hover { background-color: #0056b3; } button:disabled { background-color: #cccccc; } #result { margin-top: 25px; padding: 15px; background-color: #f8f9fa; border-radius: 5px; white-space: pre-wrap; } .loading { display: none; color: #666; } /style /head body div classcontainer h1 AI文本摘要生成器/h1 p输入一篇长文点击按钮即可获得AI生成的简洁摘要。/p textarea idinputText placeholder请在此处粘贴或输入需要摘要的长文本.../textarea br button idsummarizeBtn生成摘要/button div idloading classloading⏳ AI正在思考请稍候.../div div idresult/div /div script const btn document.getElementById(summarizeBtn); const input document.getElementById(inputText); const resultDiv document.getElementById(result); const loadingDiv document.getElementById(loading); btn.addEventListener(click, async () { const text input.value.trim(); if (text.length 50) { alert(请输入至少50个字符的文本。); return; } // 显示加载中禁用按钮 loadingDiv.style.display block; btn.disabled true; resultDiv.innerHTML ; try { const response await fetch(http://localhost:8000/summarize, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ text: text }) }); if (!response.ok) { throw new Error(请求失败: ${response.status}); } const data await response.json(); resultDiv.innerHTML strong生成的摘要/strong\n${data.summary}\n\nsmall使用模型${data.model_used} | 耗时${data.processing_time}秒/small; } catch (error) { resultDiv.innerHTML strong stylecolor:red;错误/strong ${error.message}; } finally { // 隐藏加载中启用按钮 loadingDiv.style.display none; btn.disabled false; } }); /script /body /html为了让FastAPI能提供这个静态页面修改app/main.py在创建app后添加# app/main.py (追加在创建app的代码之后) from fastapi.staticfiles import StaticFiles # ... 之前的FastAPI创建和CORS代码 ... # 挂载静态文件目录提供前端页面 app.mount(/static, StaticFiles(directorystatic), namestatic) app.get(/ui) def serve_ui(): # 重定向到前端页面或者直接返回HTML这里用重定向更清晰 from fastapi.responses import RedirectResponse return RedirectResponse(url/static/index.html)现在访问http://localhost:8000/ui就能看到并使用这个简洁的Web界面了。5. 进阶优化与生产级考量一个能跑通的Demo只是第一步。要让应用更健壮、更实用还需要考虑以下方面。5.1 提示词工程优化最初的提示词可能不够完美。我们可以通过以下方式迭代优化提供示例在提示词中加入一两个“输入-输出”示例Few-Shot Learning能显著提升模型在特定格式或风格上的表现。更细致的约束比如“摘要需包含起因、经过、结果”、“避免使用原文中未出现的主观评价词”。迭代测试用不同的文章测试观察摘要质量不断调整提示词。5.2 错误处理与健壮性网络超时与重试模型API调用可能失败。可以使用tenacity库为链添加重试机制。输入清洗与验证检查输入文本长度、编码、是否包含恶意代码等。速率限制模型API通常有调用频率限制。需要在代码中实现限流或使用asyncio进行并发控制。结构化输出使用LangChain的OutputParser来强制模型返回JSON等结构化数据便于后续处理。5.3 性能与成本缓存对相同的输入文本可以缓存摘要结果避免重复调用模型节省成本和时间。可以使用langchain.cache配合SQLiteCache或RedisCache。模型选择根据任务难度和成本预算在“效果”和“价格/速度”之间权衡。例如简单摘要可以用更小、更快的模型。异步处理对于长文本摘要生成可能耗时较长。可以将任务放入队列如Celery通过WebSocket或轮询通知前端结果。5.4 部署上线环境变量管理生产环境使用更安全的方案管理API密钥如云服务商的密钥管理服务。容器化使用Docker将应用及其依赖打包确保环境一致性。# Dockerfile 示例 FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [uvicorn, app.main:app, --host, 0.0.0.0, --port, 8000]选择部署平台可以选择传统的云服务器ECS、容器平台Kubernetes或更简单的PaaS服务如Heroku, Railway, 或国内的云开发平台。6. 常见问题与排查思路在开发过程中你可能会遇到以下问题问题现象可能原因排查步骤与解决方案启动服务时报ImportError1. 虚拟环境未激活。2. 依赖未安装或版本冲突。1. 确认终端提示符前有(ai_summarizer_env)。2. 运行pip install -r requirements.txt重新安装。检查Python版本是否为3.8/3.9。调用API返回401或Invalid API Key1. API密钥未正确设置。2. 密钥已过期或被禁用。3..env文件未加载。1. 检查.env文件是否存在密钥格式是否正确确保没有多余空格。2. 在app/chains.py开头打印os.getenv(“ZHIPUAI_API_KEY”)的前几位确认已加载。3. 登录模型平台控制台确认密钥状态和余额。模型响应速度慢或无响应1. 网络问题。2. 模型服务端负载高。3. 输入文本过长。1. 检查网络连接。2. 稍后重试或查看模型服务商的状态页。3. 考虑对长文本进行分块处理再分别摘要。生成的摘要质量不佳1. 提示词不够清晰。2. 模型参数如temperature设置不当。3. 任务本身对模型来说太难。1. 优化提示词增加示例和约束。2. 将temperature调低如0.1。3. 尝试更换更强大的模型如从glm-3-turbo切换到glm-4。前端页面无法访问API1. CORS配置问题。2. 后端服务地址/端口错误。3. 浏览器安全策略如HTTPS访问HTTP。1. 确认FastAPI的CORS中间件已正确配置允许前端来源。2. 检查前端JavaScript中fetch的URL是否正确http://localhost:8000。3. 开发阶段可使用浏览器插件临时禁用CORS或确保前后端同域。7. 总结与扩展方向至此你已经完成了一个完整的AI应用从零到一的开发流程。我们不仅写完了代码更关键的是理解了背后的逻辑如何将AI模型的能力通过提示词工程和应用程序架封装成一个解决实际问题的服务。回顾核心收获环境与框架建立了基于Python、LangChain、FastAPI的现代AI应用开发环境。模型接入学会了如何安全地配置和使用第三方大模型API。提示词设计掌握了设计有效指令的基本方法这是与AI交互的核心。应用集成构建了从前端到后端再到AI模型调用的完整数据流。工程化思维开始考虑错误处理、性能、部署等生产级问题。下一步可以探索的方向复杂AI Agent尝试让AI使用工具比如先联网搜索再总结或先分析文章情感再生成不同风格的摘要。RAG应用结合向量数据库让AI能够基于你提供的私有知识库如公司文档进行摘要和问答。多模态尝试接入图像识别、语音合成等模型做一个能“看图说话”或“听音记要”的应用。深入LangChain学习使用更复杂的链SequentialChain, RouterChain、记忆Memory和代理Agent。这个项目是一个坚实的起点。真正的学习发生在你动手修改、调试、并尝试用它解决自己实际需求的过程中。建议你克隆代码更换不同的模型API修改提示词或者增加新的功能比如支持英文摘要、提取关键词等。