langchain入门笔记03:使用fastapi部署本地大模型后端接口,优化局域网内的问答响应速度

文章目录

  • 前言
  • 一、fastapi的简单入门
    • 1:安装必要的包(python=3.11):
    • 2:快速搭建一个fastapi:
  • 二、提升问答的响应速度
    • 1. fastapi部署后端接口,在局域网内访问的方法
    • 2. 局域网内的测试:“未来科技有限公司的差旅费标准”PDF的RAG问答:
      • 2.1 使用qwq32b模型(19GB)
      • 2.2 使用qwen3:8b模型(5.2GB),平均30s
      • 2.3 使用qwen3:8b模型(5.2GB),改进了rag_server的写法,,平均18s
    • 3. 如何进一步提速?
      • 3.1 模型推理优化
      • 3.2 调用链路优化
      • 3.3 多模型协作(可以一试)


前言

在上一篇博客中,尝试构建了多种mcp_server。接下来考虑,如何将我们的多mcp_server给前端提供api接口。


一、fastapi的简单入门

参考文献:https://www.bilibili.com/video/BV18F4m1K7N3

1:安装必要的包(python=3.11):

conda activate langchain
pip install fastapi

2:快速搭建一个fastapi:

文件目录如下图:
在这里插入图片描述

# 导入必要的模块
from fastapi import FastAPI  # 导入 FastAPI 框架,用于构建 API
import uvicorn  # 导入 Uvicorn,一个基于 asyncio 的 ASGI web 服务器,用于运行 FastAPI 应用
from fastapi import Request  # 导入 Request 对象,用于获取请求的详细信息(如查询参数、请求体等)
from fastapi.staticfiles import StaticFiles  # 用于挂载静态文件目录(如图片、CSS、JS 等)
from api.book import api_book  # 导入图书相关的路由模块
from api.cbs import api_cbs  # 导入出版社相关的路由模块
from api.zz import api_zz  # 导入作者相关的路由模块# 创建 FastAPI 应用实例
app = FastAPI()# 挂载静态文件目录
# 将 "/upimg" 路径映射到本地 "upimg" 文件夹,允许用户通过 URL 访问该目录下的静态文件(如上传的图片)
# 例如:访问 http://127.0.0.1:8080/upimg/test.jpg 会返回 upimg/test.jpg 文件
# app.mount("/upimg", StaticFiles(directory="upimg"), name="upimg")# 注册路由(API 子应用)
# 使用 include_router 将不同模块的 API 路由注册到主应用中,并设置统一前缀和标签(用于文档分类)
app.include_router(api_book, prefix="/book", tags=["图书接口"])   # 图书相关接口,路径前缀为 /book
app.include_router(api_cbs, prefix="/cbs", tags=["出版社接口"])    # 出版社相关接口,路径前缀为 /cbs
app.include_router(api_zz, prefix="/zz", tags=["作者接口"])        # 作者相关接口,路径前缀为 /zz# 根路径接口,用于测试服务是否正常运行
@app.get("/")
async def root():return {"message": "Hello World"}# 自定义测试接口,返回固定消息
@app.get("/xixi")
async def xixi():return {"message": "Hello xixi"}# GET 请求测试接口
# 接收查询参数(query parameters),并打印到后端控制台
@app.get("/get_test")
async def get_test(request: Request):get_test_message = request.query_params  # 获取 URL 中的查询参数(如 ?name=abc&age=123)print("收到 GET 请求参数:", get_test_message)  # 打印参数到控制台return {"message": "Hello xixi"}# POST 请求测试接口
# 接收 JSON 格式的请求体(request body),并打印内容
@app.post("/post_test")
async def post_test(request: Request):post_test_message = await request.json()  # 异步读取请求体中的 JSON 数据print("收到 POST 请求数据:", post_test_message)  # 打印接收到的 JSON 数据return {"message": "Hello xixi"}# 主程序入口
# 当直接运行此脚本时,启动 Uvicorn 服务器
if __name__ == '__main__':# 运行 FastAPI 应用# 参数说明:#   "myfastapi:app" -> 模块名:应用实例名(即当前文件名为 myfastapi.py,app 是 FastAPI 实例)#   host="127.0.0.1" -> 绑定本地回环地址#   port=8080 -> 使用 8080 端口#   reload=True -> 开启热重载,代码修改后自动重启服务(适合开发环境)uvicorn.run("myfastapi:app", host="127.0.0.1", port=8080, reload=True)

运行后可以浏览访问http://127.0.0.1:8080/docs查看接口文档
在这里插入图片描述

二、提升问答的响应速度

基于第一小节的fastapi,笔者搭建了一个chat接口,用于调用本地大模型。

1. fastapi部署后端接口,在局域网内访问的方法

首先把ip改为0.0.0.0

if __name__ == '__main__':# uvicorn.run("myfastapi2:app", host="127.0.0.1", port=8080, reload=True)uvicorn.run("myfastapi2:app", host="0.0.0.0", port=8080, reload=True)

然后把本机的8080端口放开,具体操作,可参考博客,然后局域网内的其他主机就可以访问了:
在这里插入图片描述

2. 局域网内的测试:“未来科技有限公司的差旅费标准”PDF的RAG问答:

PDF原文件部分截图如下:
在这里插入图片描述

2.1 使用qwq32b模型(19GB)

在我的电脑上用postman测试下。结果还是比较准确的,对于这个文档,RAG的效果还是可以的。可以看到一次提问的响应时间是52.39s。模型需要的响应时间太长了,接下来考虑如何提速。这里使用的是qwq32b模型(19GB),因此考虑换一个更小的模型试一下。
在这里插入图片描述

2.2 使用qwen3:8b模型(5.2GB),平均30s

这里使用qwen3:8b(5.2GB),使用相同的问题调用接口,结果如下。可以看到,看模型的输出结果,也是没有问题的,但是所需要的时间大幅度缩小,变为了26.55s。
在这里插入图片描述

2.3 使用qwen3:8b模型(5.2GB),改进了rag_server的写法,,平均18s

通过chatgpt,进一步优化了rag_server,代码如下:

async def get_answer(question: str) -> str:"""使用 RAG Chain 回答问题"""try:start = time.time()context_text = await retriever.ainvoke(question.strip())# LLM 调用start_llm = time.time()final_prompt = prompt.format(context=context_text, input=question)response = await llm.ainvoke(final_prompt)logger.info(f"🟢 LLM 生成完成,耗时: {time.time() - start_llm:.2f}s")logger.info(f"✅ 总耗时: {time.time() - start:.2f}s")return StrOutputParser().invoke(response)except Exception as e:logger.exception("❌ 问答过程中发生异常")return f"问答过程中出错:{str(e)}"

在这里插入图片描述

3. 如何进一步提速?

3.1 模型推理优化

(1) 使用更小的模型;(暂不采纳)
(2) 减少生成的token数;
LLM推理时间 = 上下文长度 + 输出长度;如果只是回答文档中的问题,不必生成很长的上下文,在 LangChain 调用时传:llm = ChatOllama(model="qwen3:8b", temperature=0, num_predict=200) num_predict默认是256?

让我们来试一下看看效果。设num_predict=200,时间数据表明,的确提速了!但是,答案被强制截断了,输出是不完整的,只输出了< think >中的内容。
在这里插入图片描述

(3) 控制上下文窗口(prompt压缩)(暂不采纳)
Qwen3:8b 的上下文窗口很大,但你传进去的 context 越长,推理速度越慢
检索 k=1 是很好的,但也要确保 doc 片段不要太长
可以在构造 RAG 时裁剪:doc.page_content[:1000] # 控制单片段长度

(4) 调整GPU批处理参数
Ollama 的后端支持 kv_cache 批量生成,在启动模型时可设置:ollama run qwen3:8b --num-thread 16 --num-gpu 1

已经100%运行在GPU上了。
在这里插入图片描述

3.2 调用链路优化

(1) 流式输出(可行,这样从向量数据库中查询的过程所花的时间不可省略,但是最后给LLM所得到的LLM的输出可以流式输出,给人一种时间缩短的感觉)

让前端/调用方边生成边显示,不用等 8~9 秒全部生成完才显示
LangChain 里可以改成:

async for chunk in llm.astream(final_prompt):print(chunk.content, end="", flush=True)

(2) 缓存相似查询(可以一试)
对相同 embedding 检索结果的 Prompt → LLM 输出做缓存;
Python 可以直接用 functools.lru_cache 或 Redis 做缓存

(3) 避免重复加载模型(可行)
Ollama 第一次加载模型会花几秒,之后在 GPU 内存中保持热启动;
确保你的进程是长驻的(FastAPI、MCP Server 不要频繁重启)

3.3 多模型协作(可以一试)

如果不追求每一步都是 Qwen3:8b 的高质量输出,可以用:
小模型(3B/4B) 先做快速判断 + 检索 → 再由大模型做最终生成;
这样 Qwen3:8b 的推理时间可以减少 %-%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95473.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CDA 新一级】学习笔记第1篇:数据分析的时代背景

作者&#xff1a;CDA持证人 张九领我们要学习数据分析&#xff0c;就要从当前时代的数据特点&#xff0c;找到在时代特点下企业需要数据分析的痛点&#xff0c;然后理解数据分析在企业中的作用。当前时代&#xff0c;数据分析的特征是哪些呢&#xff1f;我们用VUCA来概括数据分…

Vite 为什么比 Webpack 快?原理深度分析

Hi&#xff0c;我是布兰妮甜 &#xff01;在现代前端开发中&#xff0c;构建工具的性能直接影响开发体验和生产力。Webpack 作为传统打包工具的代表&#xff0c;长期以来主导着前端构建领域&#xff0c;而 Vite 作为新一代的前端构建工具&#xff0c;凭借其出色的开发服务器启动…

数字电路上的通讯速度是越快越好还是越慢越好?

昨天我突发奇想&#xff0c;修改了一下MCU和INA226以及DAC8551的通讯速率。之前的INA226用的是I2C通讯&#xff0c;之前设置的速率是100Kbps&#xff0c;DAC8551是SPI通讯&#xff0c;速率是10Mbps&#xff0c;昨天修改之前输出位置的测试结果如图&#xff1a;可以看到&#xf…

Google Gemini 的深度研究终于进入 API 阶段

Google Gemini 最强大的功能之一是深度研究&#xff0c;但到目前为止&#xff0c;它一直严格限制在 Gemini 界面上。这种情况可能很快就会改变。 通过 Gemini 中的深度研究&#xff0c;您可以搜索几乎任何内容&#xff0c;包括学者、现有研究论文等。 谷歌将深度研究描述为一…

通过beeware制作安卓apk用于获取cpolar网址

我们都知道&#xff0c;没有付费的cpolar用户&#xff0c;要不时更新cpolar网址。每次都要自己登录去获取远程的cpolar个人网址比较麻烦&#xff0c;好在可以用python去自动获取。这里说的是&#xff0c;比如用手机装termux软件&#xff0c;再在termux中装cpolar&#xff0c;然…

Swift 实战:用链表和哈希表写出高性能的贪吃蛇引擎(LeetCode 353)

文章目录摘要描述解决方案解析问题与解决方案关键细节逐条讲示例与运行结果时间复杂度空间复杂度总结摘要 这题的目标是设计一个“贪吃蛇”核心引擎&#xff1a;给定棋盘大小和一串食物位置&#xff0c;支持不断调用 move(direction) 推进游戏&#xff0c;返回当前分数&#x…

2025-08-15:按对角线进行矩阵排序。用go语言,给你一个 n × n 的整数矩阵,要求返回一个按下面规则调整后的矩阵: - 将每一条与主对角线平行的斜线视为一个序列。对于位于主对角线及其下方的

2025-08-15&#xff1a;按对角线进行矩阵排序。用go语言&#xff0c;给你一个 n n 的整数矩阵&#xff0c;要求返回一个按下面规则调整后的矩阵&#xff1a;将每一条与主对角线平行的斜线视为一个序列。对于位于主对角线及其下方的那些斜线&#xff08;即所在位置的行索引 ≥ …

MySQL相关概念和易错知识点(5)(索引、事务、MVCC)

目录1.索引&#xff08;1&#xff09;局部性原理a.局部性原理在计算机中的地位b.pagec.池化技术&#xff08;Buffer Pool&#xff09;&#xff08;2&#xff09;如何理解索引&#xff08;3&#xff09;索引的原理a.page的构成b.多层目录c.基于B树的索引①B树的特性在索引中的作…

SQLite 子查询

SQLite 子查询 SQLite 是一个轻量级的数据库管理系统&#xff0c;广泛应用于移动设备、嵌入式系统和桌面应用。在处理复杂的查询时&#xff0c;子查询&#xff08;Subquery&#xff09;是SQLite数据库查询语言中的一个强大工具。本文将详细介绍SQLite子查询的概念、用法及其在数…

区块链系统审计方法论:全面指南与Python实践

目录 区块链系统审计方法论:全面指南与Python实践 1. 引言 2. 区块链审计框架 3. 智能合约审计关键技术 3.1 静态代码分析 3.2 符号执行(Symbolic Execution) 4. 共识机制审计 4.1 PoW共识验证 4.2 PBFT共识模拟 5. 数据完整性审计 5.1 Merkle树验证 6. 完整审计系统实现 7.…

分布式锁—Redisson的公平锁

1.Redisson公平锁RedissonFairLock概述 (1)非公平和公平的可重入锁 一.非公平可重入锁 锁被释放后&#xff0c;排队获取锁的线程会重新无序获取锁&#xff0c;没有任何顺序性可言。 二.公平可重入锁 锁被释放后&#xff0c;排队获取锁的线程会按照请求获取锁时候的顺序去获取…

上网行为安全概述和组网方案

一、上网行为安全概述1. 背景与需求互联网的双刃剑特性&#xff1a;网络普及改变工作生活方式&#xff0c;业务向互联网迁移。缺乏管理导致风险&#xff1a;带宽滥用、监管困难、信息泄露、网络违法、安全威胁。核心问题&#xff1a;带宽滥用&#xff1a;P2P/流媒体占用70%带宽…

某处卖600的【独角仙】尾盘十分钟短线 尾盘短线思路 手机电脑通用无未来函数

通达信指标【独角仙】尾盘十分钟套装-主图-副图-选古指标&#xff0c;支持手机电脑使用。在股市收盘的前十分钟第二天冲高卖出&#xff0c;信号可以盘中预警也可以尾盘选股&#xff0c;如果要保证信号固定建议是尾盘选股即可&#xff0c;当天信号固定后&#xff0c;不会产生漂移…

日志数据链路的 “搬运工”:Flume 分布式采集的组件分工与原理

flume详解&#xff1a;分布式日志采集的核心原理与组件解析 在大数据体系中&#xff0c;日志采集是数据处理的第一步。Flume 作为 Apache 旗下的分布式日志采集工具&#xff0c;以高可用、高可靠、易扩展的特性&#xff0c;成为处理海量日志数据的首选方案。本文将从 Flume 的…

大消费新坐标中的淘宝大会员

一站式消费需要一站式权益。作者|古廿编辑|杨舟淘宝的大会员体系落地了。8月6日&#xff0c;淘宝首次整合饿了么、飞猪等阿里系平台资源&#xff0c;推出覆盖购物、外卖、出行、旅游的一体化会员体系——用户在三大平台的消费&#xff0c;都能累积淘气值&#xff0c;根据淘气值…

MIME(多用途互联网邮件扩展)

MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09; MIME 是 多用途互联网邮件扩展 的缩写&#xff0c;它最初是为了解决传统电子邮件只能传输纯文本的局限性而设计的&#xff0c;后来逐渐成为互联网中 数据格式标识与传输 的通用标准&#xff0c;被广泛应用…

PHP imagick扩展安装以及应用

Date: 2025-08-13 10:48:12 author: lijianzhan php_imagick是PHP的一个强大的扩展模块&#xff0c;用于调用ImageMagick图像处理库的功能&#xff0c;支持处理JPEG、PNG、GIF等超过185种格式的图像&#xff0c;实现缩放、旋转、动画生成等操作&#xff0c;常用于网页图片动态生…

2025年度14款CRM销售管理系统横向评测

本文深入对比了以下14款CRM销售管理软件&#xff1a;1.纷享销客&#xff1b; 2.Zoho CRM&#xff1b; 3.红圈销售&#xff1b; 4.销帮帮&#xff1b; 5.Salesforce&#xff1b; 6.Pipedrive&#xff1b; 7.Microsoft Dynamics 365&#xff1b; 8.悟空 CRM&#xff1b; 9.励销云…

akamai鼠标轨迹

各位肯定被akamai鼠标轨迹、点击事件、键盘事件&#xff0c;网页交互困扰 那么我们就研究一下鼠标轨迹、点击事件AST解混淆, 拿到解混淆后的代码&#xff0c; 如下&#xff0c;sensor_data就是我们要搞的参数 如何解混淆这里就不赘述了&#xff0c;需要的可以看我上一篇文章&am…

飞算JavaAI开发全流程解析:从自然语言到可运行工程的智能进化

引言 在数字经济时代&#xff0c;企业级应用开发面临着需求多变、交付周期紧、质量要求高的三重挑战。传统Java开发模式依赖人工进行需求确认、架构设计、代码编写和测试验证&#xff0c;导致开发效率低下、沟通成本高企。据统计&#xff0c;一个中等规模的项目需要平均8周完成…