news 2026/8/22 4:35:50

从零构建AI应用:基于LangChain与FastAPI的智能文本摘要生成器实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零构建AI应用:基于LangChain与FastAPI的智能文本摘要生成器实战

最近在后台收到不少私信,很多同学反映,看了很多关于AI的“切片式”教程,感觉知识点很零散,好像什么都懂一点,但真要自己动手做一个完整的AI应用,却不知从何下手。这确实是很多初学者面临的困境——信息碎片化,缺乏一条从零到一、贯穿始终的实践路径。

本文旨在解决这个问题。我将带你完整地走一遍AI应用开发的全流程,从环境搭建、模型选择、数据准备、代码编写,到最终部署和优化。这不是一个概念介绍,而是一个手把手的实战项目。我们将以构建一个“智能文本摘要生成器”为例,涵盖当前AI开发的核心环节。无论你是刚入门的学生,还是希望将AI能力集成到业务中的开发者,跟着本文走完,你都能获得一套可复用的方法论和可直接运行的代码。


1. 项目概述与核心概念

在开始敲代码之前,我们首先要明确我们要做什么,以及会用到哪些关键技术。

1.1 项目目标:智能文本摘要生成器

我们将开发一个Web应用,用户输入一篇长文章(例如新闻、报告),应用能够自动生成一个简洁、准确的摘要。这个项目看似简单,却涵盖了现代AI应用开发的典型流程:

  1. 环境与工具准备:搭建Python开发环境,安装必要的库。
  2. 模型选择与接入:如何选择并调用一个合适的大语言模型(LLM)。
  3. 应用逻辑开发:构建Web后端API和前端的交互界面。
  4. 提示工程:设计有效的指令(Prompt)让模型更好地完成任务。
  5. 部署与优化:将应用部署到服务器,并考虑性能、成本等实际问题。

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-dotenv
  • langchain: 核心框架。
  • langchain-openai: 用于接入OpenAI系列模型(如GPT-3.5/4)的官方集成包。
  • langchain-community: 包含大量社区维护的第三方模型和工具集成。
  • fastapi&uvicorn: 用于快速构建高性能Web API。
  • python-dotenv: 用于管理环境变量(如API密钥),避免将敏感信息硬编码在代码中。

2.3 模型API密钥准备

我们需要一个AI模型的API来提供智能能力。这里有几个主流选择:

  1. OpenAI:最成熟,文档齐全,但需要海外支付方式。
  2. 国内大模型平台:如智谱AI(ChatGLM)、百度文心千帆、阿里灵积、月之暗面(Kimi)等,对国内开发者更友好。

本文以智谱AI(Zhipu AI)为例,因为它提供了免费的额度供开发者测试。请按照以下步骤获取:

  1. 访问 智谱AI开放平台 并注册账号。
  2. 在控制台创建API Key,并记录下来。

重要:永远不要将API Key提交到Git等版本控制系统!我们将使用.env文件来管理。

在项目根目录下创建.env文件:

# .env ZHIPUAI_API_KEY=your_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-dotenv

3.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"], template=SUMMARY_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( model="glm-4", # 或其他可用模型,如 `glm-3-turbo` api_key=api_key, temperature=0.3, # 控制创造性,越低输出越稳定 top_p=0.8, ) # 2. 创建链:将提示词模板和模型组合起来 summary_chain = LLMChain(llm=llm, prompt=summary_prompt, verbose=False) return summary_chain # 导出一个全局可用的链实例 summary_chain = create_summary_chain()

代码解释

  1. load_dotenv():从.env文件加载我们的API密钥。
  2. ChatZhipuAI:这是langchain-community中封装的智谱AI模型类。我们指定了模型名称glm-4和必要的参数。
    • temperature:生成文本的随机性。值越低(如0.1-0.3),输出越确定、保守;值越高,输出越有创意、多样。对于摘要任务,我们倾向于稳定输出。
  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(title="AI文本摘要生成器", version="1.0.0") # 添加CORS中间件,允许前端跨域请求(开发时有用) app.add_middleware( CORSMiddleware, allow_origins=["*"], # 生产环境应替换为具体的前端域名 allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/") def read_root(): return {"message": "AI文本摘要生成器API已就绪,请使用 POST /summarize 来生成摘要。"} @app.post("/summarize", response_model=SummarizeResponse) async def summarize_text(request: SummarizeRequest): """ 接收文本并返回AI生成的摘要。 """ if not request.text or len(request.text.strip()) < 50: raise HTTPException(status_code=400, detail="输入文本过短,请提供至少50个字符的内容。") try: import time start_time = time.time() # 调用LangChain链生成摘要 result = summary_chain.run(text=request.text) end_time = time.time() processing_time = round(end_time - start_time, 2) return SummarizeResponse( summary=result.strip(), model_used="ChatGLM-4 (via ZhipuAI)", processing_time=processing_time ) except Exception as e: # 记录详细的错误日志(实际项目中应使用logging模块) print(f"摘要生成失败: {e}") raise HTTPException(status_code=500, detail=f"摘要生成服务暂时不可用: {str(e)}")

代码解释

  1. Pydantic模型SummarizeRequestSummarizeResponse用于定义API的输入输出格式,确保类型安全,并自动生成API文档。
  2. CORS:跨域资源共享中间件,方便我们后续用前端页面测试。
  3. /summarize端点
    • 首先进行简单的输入验证。
    • 使用try...except包裹核心逻辑,进行基本的错误处理。
    • 调用summary_chain.run(text=...)来执行摘要生成。
    • 计算处理耗时,并返回结构化的响应。

3.5 运行与测试

一切就绪,让我们启动服务并测试。

  1. 启动服务:在项目根目录下运行:

    uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
    • --reload:代码修改后自动重启,便于开发。
    • --host 0.0.0.0:允许本地网络访问。
    • --port 8000:指定端口。
  2. 测试API

    • 打开浏览器访问http://localhost:8000/docs,你会看到自动生成的Swagger UI交互式文档。
    • /summarizeTry it out区域,输入一段长文本,点击Execute
    • 示例输入:
      { "text": "人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的‘容器’。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。" }
    • 你应该会收到一个包含生成摘要的JSON响应。
  3. 使用命令行工具curl测试

    curl -X POST "http://localhost:8000/summarize" \ -H "Content-Type: application/json" \ -d '{"text":"这里放入你的长篇文章内容..."}'

4. 前端界面(可选但推荐)

为了让项目更完整,我们创建一个简单的前端页面来调用这个API。在项目根目录创建static/index.html

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>AI文本摘要生成器</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 class="container"> <h1>📝 AI文本摘要生成器</h1> <p>输入一篇长文,点击按钮即可获得AI生成的简洁摘要。</p> <textarea id="inputText" placeholder="请在此处粘贴或输入需要摘要的长文本..."></textarea> <br> <button id="summarizeBtn">生成摘要</button> <div id="loading" class="loading">⏳ AI正在思考,请稍候...</div> <div id="result"></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\n<small>使用模型:${data.model_used} | 耗时:${data.processing_time}秒</small>`; } catch (error) { resultDiv.innerHTML = `<strong style="color: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(directory="static"), name="static") @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配合SQLiteCacheRedisCache
  • 模型选择:根据任务难度和成本预算,在“效果”和“价格/速度”之间权衡。例如,简单摘要可以用更小、更快的模型。
  • 异步处理:对于长文本,摘要生成可能耗时较长。可以将任务放入队列(如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返回401Invalid 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模型的能力,通过提示词工程和应用程序架,封装成一个解决实际问题的服务

回顾核心收获

  1. 环境与框架:建立了基于Python、LangChain、FastAPI的现代AI应用开发环境。
  2. 模型接入:学会了如何安全地配置和使用第三方大模型API。
  3. 提示词设计:掌握了设计有效指令的基本方法,这是与AI交互的核心。
  4. 应用集成:构建了从前端到后端,再到AI模型调用的完整数据流。
  5. 工程化思维:开始考虑错误处理、性能、部署等生产级问题。

下一步可以探索的方向

  • 复杂AI Agent:尝试让AI使用工具,比如先联网搜索再总结,或先分析文章情感再生成不同风格的摘要。
  • RAG应用:结合向量数据库,让AI能够基于你提供的私有知识库(如公司文档)进行摘要和问答。
  • 多模态:尝试接入图像识别、语音合成等模型,做一个能“看图说话”或“听音记要”的应用。
  • 深入LangChain:学习使用更复杂的链(SequentialChain, RouterChain)、记忆(Memory)和代理(Agent)。

这个项目是一个坚实的起点。真正的学习发生在你动手修改、调试、并尝试用它解决自己实际需求的过程中。建议你克隆代码,更换不同的模型API,修改提示词,或者增加新的功能(比如支持英文摘要、提取关键词等)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 4:35:37

14MB模型如何挑战270MB大模型?解析模型小型化核心技术

1. 模型大小之争&#xff1a;一个被误解的衡量标准最近在社区里看到一个挺有意思的讨论&#xff0c;核心就是标题里这个事儿&#xff1a;一个只有14MB的模型&#xff0c;凭什么敢去跟一个270MB的模型“对打”&#xff1f;很多人第一反应肯定是“这不科学”&#xff0c;毕竟在大…

作者头像 李华
网站建设 2026/8/22 4:29:10

基于Pixel2Geo纯视觉无感定位的城市交通全域空间智能管控技术白皮书

前言随着我国新型智慧城市与交通强国建设持续深化&#xff0c;城市交通治理正式从“信息化可视化阶段”迈入空间可感知、态势可推演、决策可自主的时空智能新阶段。当前城市路网、交通枢纽、主次干道、商圈路口交通流量日趋复杂&#xff0c;人车混行、突发拥堵、交通违法、事故…

作者头像 李华
网站建设 2026/8/22 4:27:14

视觉伺服技术解析:从核心原理到ROS实战应用

1. 视觉伺服&#xff1a;从“看见”到“行动”的智能桥梁在机器人、自动化以及智能设备领域&#xff0c;让机器“看见”并“理解”世界&#xff0c;进而做出精准的动作&#xff0c;一直是个核心挑战。视觉伺服&#xff0c;就是为解决这个问题而生的关键技术。简单来说&#xff…

作者头像 李华
网站建设 2026/8/22 4:25:26

对讲机电池养护科普|寒地环境下延长电池寿命与稳定续航的实用方法

在黑龙江专网通信日常使用中&#xff0c;电池是保障设备持续在线的核心配件&#xff0c;也是寒地工况下损耗速度较快的部件之一。多数政企运维人员发现&#xff0c;对讲机、车载终端在冬季极易出现续航缩水、虚电跳电、低温无法开机等情况&#xff0c;很多时候直接判定为电池损…

作者头像 李华
网站建设 2026/8/22 4:20:52

Kafka消息可靠性深度解析:从重复消费与消息丢失到端到端解决方案

1. 从一次线上告警说起&#xff1a;消息队列的“幽灵”与“黑洞”那天凌晨&#xff0c;我被一阵急促的告警电话吵醒。监控大屏上&#xff0c;一个核心订单处理服务的延迟曲线像坐了火箭一样飙升&#xff0c;而下游的积分发放服务却在疯狂地给同一个用户重复加积分。团队迅速定位…

作者头像 李华