Python----大模型(基于Fastapi+streamlit的機器人對話)

一、準備工作

1.1、魔搭社區下載大模型

通義千問2.5-7B-Instruct · 模型庫

from modelscope.hub.snapshot_download import snapshot_download
llm_model_dir = snapshot_download('Qwen/Qwen2.5-7B-Instruct',cache_dir='models')

1.2、啟動vllm大模型?

python -m vllm.entrypoints.openai.api_server --port 10222 --model /home/AI_big_model/models/Qwen/Qwen2.5-7B-Instruct --served-model-name Qwen2.5-7B-Instruct

二、Fastapi后端

????????FastAPI 是一個用于構建API的現代化、快速(高性能)的Web框架,使用Python 3.7+的標準類型提示。它的性能媲美Node.js和Go,是基于Python的框架中最快的之 一。

主要特點:

????????高性能:與Starlette、Pydantic等框架深度集成,性能優異。

????????簡潔明了:基于類型提示(Type Hints),使得代碼更加簡潔且具備良好的可讀 性。

????????自動生成文檔:自動生成Swagger UI和ReDoc文檔,方便開發者查看和測試 API。

????????異步支持:原生支持Python的async和await,適合處理異步任務。

pip install fastapi

pip install uvicorn?

# 導入必要的庫
from fastapi import FastAPI, Body  # FastAPI框架和Body請求體
from openai import AsyncOpenAI  # OpenAI異步客戶端
from typing import List  # 類型提示
from fastapi.responses import StreamingResponse  # 流式響應# 初始化FastAPI應用
app = FastAPI()# 初始化openai的客戶端
api_key = "EMPTY"  # 空API密鑰(因為使用本地部署的模型)
base_url = "http://127.0.0.1:10222/v1"  # 本地部署的模型API地址
aclient = AsyncOpenAI(api_key=api_key, base_url=base_url)  # 創建異步客戶端實例# 初始化對話列表(全局變量)
messages = []# 定義路由,實現接口對接
@app.post("/chat")
async def chat(query: str = Body(default='你是誰?', description="用戶輸入"),  # 用戶輸入的查詢文本sys_prompt: str = Body("你是一個有用的助手。", description="系統提示詞"),  # 系統角色設定history: List = Body([], description="歷史對話"),  # 歷史對話記錄history_len: int = Body(1, description="保留歷史對話的輪數"),  # 保留的歷史對話輪數temperature: float = Body(0.5, description="LLM采樣溫度"),  # 生成文本的隨機性控制top_p: float = Body(0.5, description="LLM采樣概率"),  # 核采樣概率閾值max_tokens: int = Body(default=1024, description="LLM最大token數量")  # 生成的最大token數
):  global messages  # 使用全局的messages列表# 控制歷史記錄長度(只保留指定輪數的對話)if history_len > 0:history = history[-2 * history_len:]  # 每輪對話包含用戶和AI兩條記錄,所以乘以2# 清空消息列表(每次請求都重新構建)messages.clear()# 添加系統提示詞messages.append({"role": "system", "content": sys_prompt})# 在message中添加歷史記錄messages.extend(history)# 在message中添加用戶當前的查詢messages.append({"role": "user", "content": query})# 發送請求到本地部署的模型response = await aclient.chat.completions.create(model="Qwen2.5-7B-Instruct",  # 使用的模型名稱messages=messages,  # 完整的對話上下文max_tokens=max_tokens,  # 最大token數temperature=temperature,  # 溫度參數top_p=top_p,  # 核采樣參數stream=True  # 啟用流式輸出)# 定義生成響應的異步生成器函數async def generate_response():# 遍歷流式響應的每個chunkasync for chunk in response:chunk_msg = chunk.choices[0].delta.content  # 獲取當前chunk的文本內容if chunk_msg:  # 如果有內容則yieldyield chunk_msg# 返回流式響應,媒體類型為純文本return StreamingResponse(generate_response(), media_type="text/plain")# 主程序入口
if __name__ == "__main__":import uvicorn# 啟動FastAPI應用# 參數說明:# "fastapi_bot:app" - 要運行的模塊和應用實例# host="0.0.0.0" - 監聽所有網絡接口# port=6066 - 服務端口# log_level="info" - 日志級別# reload=True - 開發模式下自動重載uvicorn.run("fastapi_bot:app", host="0.0.0.0", port=6066, log_level="info", reload=True)

三、streamlit界面設計

????????Streamlit 是一個非常方便的 Python 庫,用來快速構建數據驅動的 Web 應用。在這 個項目中,Streamlit 將用于展示聊天界面并與后端進行交互。

API鏈接:API Reference - Streamlit Docs

pip install streamlit==1.39.0?

導入依賴

import streamlit as st
import requests

?頁面設置

st.set_page_config(page_title="ChatBot", page_icon="🤖", layout="centered")
st.title("🤖 聊天機器人")

?側邊欄配置

with st.sidebar:st.title("ChatBot")sys_prompt = st.text_input("系統提示詞:", value="你是一個有用的助手")history_len=st.slider("保留歷史對話的數量",min_value=-1,max_value=10,value=1,step=1)temperature=st.slider("temperature",min_value=0.01,max_value=2.0,value=0.5,step=0.01)top_p=st.slider("top_p",min_value=0.01,max_value=2.0,value=0.5,step=0.01)max_tokens=st.slider("max_tokens",min_value=256,max_value=4096,value=1024,step=8)stream=st.checkbox("stream",value=True)

?聊天歷史記錄管理

if "history" not in st.session_state:st.session_state.history = []
for messgae in st.session_state.history:with st.chat_message(messgae["role"]):st.markdown(messgae["content"])

?清空聊天記錄

def clear_chat_history():st.session_state.history = []
st.button("清空聊天歷史", on_click=clear_chat_history)

接受用戶輸入并顯示消息?

if prompt := st.chat_input("請輸入你的內容"):with st.chat_message('user'):st.markdown(prompt)

與后端?Fastapi通信

    response = requests.post('http://127.0.0.1:6066/chat', json=data, stream=True)if response.status_code==200:chunks = ""assistant_placeholder=st.chat_message("assistant")assistant_text=assistant_placeholder.markdown("")if stream:  # 流式輸出for chunk in response.iter_content(chunk_size=None, decode_unicode=True):# 處理響應的內容,并累加起來chunks += chunk# 實時顯示和更新助手的消息assistant_text.markdown(chunks)else:for chunk in response.iter_content(chunk_size=None, decode_unicode=True):chunks += chunkassistant_text.markdown(chunks)

四、Fastapi+streamlit

# 導入必要的庫
import streamlit as st  # 用于構建Web應用的庫
import requests  # 用于發送HTTP請求# 設置頁面配置
st.set_page_config(page_title="ChatBot",  # 頁面標題page_icon="🤖",  # 頁面圖標layout="centered"  # 布局方式
)
st.title("🤖 聊天機器人")  # 主標題# 定義清空聊天歷史的函數
def clear_chat_history():st.session_state.history = []  # 重置聊天歷史為空列表# 側邊欄設置
with st.sidebar:st.title("ChatBot")  # 側邊欄標題# 系統提示詞輸入框sys_prompt = st.text_input("系統提示詞:", value="你是一個有用的助手")# 歷史對話輪數滑塊history_len = st.slider("保留歷史對話的數量",min_value=-1,  # -1表示保留全部歷史max_value=10,value=1,step=1)# 溫度參數滑塊temperature = st.slider("temperature",min_value=0.01,max_value=2.0,value=0.5,step=0.01)# top_p參數滑塊top_p = st.slider("top_p",min_value=0.01,max_value=2.0,value=0.5,step=0.01)# 最大token數滑塊max_tokens = st.slider("max_tokens",min_value=256,max_value=4096,value=1024,step=8)# 是否流式輸出的復選框stream = st.checkbox("stream", value=True)# 清空聊天歷史按鈕st.button("清空聊天歷史", on_click=clear_chat_history)# 初始化聊天歷史
if "history" not in st.session_state:st.session_state.history = []  # 如果不存在則創建空列表# 顯示歷史消息
for messgae in st.session_state.history:with st.chat_message(messgae["role"]):  # 根據角色創建消息氣泡st.markdown(messgae["content"])  # 顯示消息內容# 獲取用戶輸入
if prompt := st.chat_input("請輸入你的內容"):# 顯示用戶消息with st.chat_message('user'):st.markdown(prompt)# 準備請求數據data = {"query": prompt,  # 用戶輸入"sys_prompt": sys_prompt,  # 系統提示詞"history_len": history_len,  # 歷史對話輪數"history": st.session_state.history,  # 歷史對話"temperature": temperature,  # 溫度參數"top_p": top_p,  # top_p參數"max_tokens": max_tokens  # 最大token數}# 發送POST請求到FastAPI服務response = requests.post('http://127.0.0.1:6066/chat',  # FastAPI服務地址json=data,  # 請求體數據stream=True  # 啟用流式接收)# 處理成功響應if response.status_code == 200:chunks = ""  # 初始化內容容器# 創建助手消息占位符assistant_placeholder = st.chat_message("assistant")assistant_text = assistant_placeholder.markdown("")  # 初始空內容if stream:  # 流式輸出模式for chunk in response.iter_content(chunk_size=None, decode_unicode=True):# 處理響應的內容,并累加起來chunks += chunk# 實時顯示和更新助手的消息assistant_text.markdown(chunks)else:  # 非流式模式for chunk in response.iter_content(chunk_size=None, decode_unicode=True):chunks += chunkassistant_text.markdown(chunks)# 將對話添加到歷史記錄st.session_state.history.append({"role": "user", "content": prompt})st.session_state.history.append({"role": "assistant", "content": chunks})

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92323.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92323.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92323.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端面試專欄-工程化:29.微前端架構設計與實踐

🔥 歡迎來到前端面試通關指南專欄!從js精講到框架到實戰,漸進系統化學習,堅持解鎖新技能,祝你輕松拿下心儀offer。 前端面試通關指南專欄主頁 前端面試專欄規劃詳情 微前端架構設計與實踐 一、微前端核心概念與價值 …

Spring Boot音樂服務器項目-上傳音樂模塊

項目結構圖 相較于上次新增集中在這些地方: 🚀 上傳音樂的核心流程 前端投遞:用戶填寫歌手名 選擇MP3文件 后端接收:/music/upload 接口化身音樂快遞員 安全驗證:先查用戶是否“持證上崗”(登錄態&#…

2025年遠程桌面軟件深度評測:ToDesk、向日葵、TeamViewer全方位對比分析

隨著遠程辦公和數字化協作的深入發展,遠程桌面軟件已經成為個人用戶和企業的必備工具。在2025年的今天,遠程控制軟件市場呈現出百花齊放的態勢,其中ToDesk、向日葵和TeamViewer作為市場上的三大主流選擇,各自在技術創新、性能優化…

深度學習-全連接神經網絡2

六、反向傳播算法 反向傳播(Back Propagation,簡稱BP)算法是用于訓練神經網絡的核心算法之一,它通過計算損失函數(如均方誤差或交叉熵)相對于每個權重參數的梯度,來優化神經網絡的權重。 1、前…

C語言的歷史

C 語言是一種 通用的、過程式的編程語言,由 丹尼斯里奇(Dennis Ritchie) 在 1972 年于貝爾實驗室開發。它以 高效、靈活、貼近硬件 而著稱,廣泛應用于系統軟件、嵌入式系統、驅動程序、游戲引擎、數據庫系統等底層開發領域。 C語…

jupyter使用

啟動win rcmdjupyter notebook創建python文件

linux 環境服務發生文件句柄泄漏導致服務不可用

問題描述:服務調用遠程rest接口 報錯,發生too many open files 異常,系統句柄資源耗盡,導致服務不可用。排查經過:1、針對報錯代碼進行本地構建,構造異常,并進行壓測。問題未復現2、經過討論分析…

手機錄制視頻時,硬編碼和軟編碼哪個質量高?(硬件編碼、軟件編碼)

文章目錄**1. 畫質對比**- **軟編碼**:- **硬編碼**:**2. 性能與功耗**- **軟編碼**:- **硬編碼**:**3. 實際應用中的權衡****4. 現代手機的折中方案****5. 如何選擇?****總結**在手機錄制視頻時, 軟編碼的…

IPv4與IPv6雙棧協議:網絡過渡的關鍵技術

為什么需要IPv4與IPv6共存? 在網絡技術的世界中,兼容性問題始終是最大的挑戰之一。IPv4和IPv6之間存在根本性的不兼容性,這意味著使用不同協議的設備無法直接通信。這種情況就像是兩個人試圖用完全不同的語言進行對話一樣。 目前的網絡現狀…

【牛客刷題】數字變換

一、題目描述 給出兩個數字a,ba,ba,b,aaa每次可以乘上一個大于1的正整數得到新的aa

MySQL 學習一 存儲結構和log

1.InnoDB邏輯存儲結構 表空間->段->區->頁->行->數據表空間:覆蓋了所有的數據和索引,系統表在系統表空間,還有默認表空間等 段:多個段組成表空間 區:多個區組成段,一般每個區的大小通常是1M…

TCP day39

六:C/S和B/S端 C/S:Client, server B/S:Browser server 1.cs 專用客戶端 bs 通用客戶端 2.協議不同 Cs 標準協議,自定義協議 Bs http 超文本傳輸 3.cs 功能復雜 bs 功能弱 4.bs 資源都在ser,有ser發送到cli cs 大部分資…

6 種無線傳輸照片從安卓到 Mac 的方法

將大量照片從安卓設備傳輸到電腦上,不僅可以備份照片,還能釋放設備存儲空間。雖然使用 USB 數據線可以在 Windows 電腦上輕松完成傳輸,但將安卓手機連接到 Mac 并非如此簡單。因此,許多用戶更傾向于無線傳輸照片從安卓到 Mac。您可…

在vscode 使用 remote-ssh

vscode安裝插件Remote-SSH,直接安裝即可 安裝完畢之后 在左下角有這個圖標 點擊之后選擇連接到主機然后選擇添加新鏈接之后輸入用戶名和主機地址 非默認端口使用 -p 端口號之后選擇第一個即可如果使用的是密碼,直接連接,然后輸入密碼即可如果使用的密鑰,則修改.ssh\config文件中…

RabbitMQ03——面試題

目錄 一、mq的作用和使用場景 二、mq的優點 2.1架構設計優勢 2.2功能特性優勢 2.3性能與可靠性優勢 2.4生態系統優勢 2.5對比優勢 三、mq的缺點 3.1性能與擴展性限制 3.2功能局限性 3.3運維復雜度 3.4與其他消息隊列的對比劣勢 四、mq相關產品,每種產品…

應用層攻防啟示錄:HTTP/HTTPS攻擊的精準攔截之道

一、七層攻擊的復雜性 # CC攻擊模擬工具(Python實現) import requests import threadingtarget_url "https://example.com/search?q"def cc_attack():while True:# 構造惡意搜索請求malicious_query "0" * 1000 # 長查詢參數try…

.net 警告【代碼 CS1998】此異步方法缺少 “await“ 運算符,將以同步方式運行。

【代碼 CS1998】此異步方法缺少 “await” 運算符,將以同步方式運行。請考慮使用 “await” 運算符等待非阻止的 API 調用,或者使用 “await Task.Run(…)” 在后臺線程上執行占用大量 CPU 的工作。在 VS 2022 中遇到的 CS1998 編譯器警告,表…

【自動駕駛黑科技】基于Frenet坐標系的車道變換軌跡規劃系統實現(附完整代碼)

1. 代碼結構概覽該代碼實現了一個車道變換軌跡規劃系統,包含兩個核心模塊:道路建模(EnhancedRoadModel):基于樣條曲線構建道路模型。軌跡規劃(LaneChangePlanner):根據障礙物狀態和道…

uni-calendar自定義簽到打卡顏色

uni-calendar自定義簽到打卡顏色,只需要將打卡的狀態添加到動態類class中即可 效果:在uni-modules >>> components >>> uni-calendar >>> uni-calendar-item.vue文件中,根據info對應的文字或者符號添加不同的clas…

浙江大學PTA程序設計C語言基礎編程練習題1-5

🌏個人博客主頁:意疏-CSDN博客 希望文章能夠給到初學的你一些啟發~ 如果覺得文章對你有幫助的話,點贊 關注 收藏支持一下筆者吧~ 閱讀指南:開篇說明題目一、厘米換算英寸題目二、然后是幾點題目三、 逆序…