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
英文地址,請注明出處:http://en.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周完成…