一、准备工作

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博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 关注 收藏支持一下笔者吧~ 阅读指南:开篇说明题目一、厘米换算英寸题目二、然后是几点题目三、 逆序…