5分钟上手ERNIE-4.5:vllm部署模型,chainlit创建ChatGPT式对话应用
本文介绍了如何在星图GPU平台上自动化部署【vllm】ERNIE-4.5-0.3B-PT镜像,快速搭建AI对话应用。通过该平台,用户可轻松启动ERNIE-4.5轻量级大模型服务,并利用chainlit框架创建类似ChatGPT的交互式聊天界面,适用于智能问答、文本创作等场景。
5分钟上手ERNIE-4.5:vllm部署模型,chainlit创建ChatGPT式对话应用
想快速搭建一个属于自己的ChatGPT式对话应用吗?今天我就带你用最简单的方式,把百度的ERNIE-4.5轻量级大模型跑起来,再给它套上一个漂亮的聊天界面。整个过程就像拼乐高一样简单,不需要复杂的配置,跟着步骤走,5分钟就能搞定。
1. 准备工作:快速了解我们要做什么
在动手之前,我们先花一分钟了解一下整个流程,这样你就知道每一步的意义了。
1.1 我们要搭建什么?
简单来说,我们要做两件事:
- 启动模型服务:把ERNIE-4.5这个“大脑”运行起来,让它能理解问题并生成回答。
- 创建聊天界面:做一个像ChatGPT那样的网页,让你能方便地和这个“大脑”对话。
1.2 为什么选择这个方案?
这个方案最大的好处就是简单快速:
- 模型轻量:ERNIE-4.5-0.3B-PT只有3亿参数,对电脑配置要求不高,普通显卡甚至CPU都能跑。
- 部署方便:使用vllm框架,一行命令就能启动高性能的模型服务。
- 界面美观:chainlit能瞬间生成一个现代、好用的聊天界面,几乎不用写前端代码。
2. 第一步:检查并启动模型服务
我们先确保模型“大脑”已经准备就绪。
2.1 检查服务状态
如果你使用的是已经配置好的环境(比如CSDN星图镜像),模型服务很可能已经在后台自动启动了。我们打开终端,输入下面这行命令来确认一下:
cat /root/workspace/llm.log
如果看到类似下面的输出,特别是最后一行显示 “LLM engine is ready”,那就恭喜你,模型服务已经成功启动了!
INFO 07-10 14:30:25 llm_engine.py:73] Initializing an LLM engine with config: model='/root/.cache/modelscope/hub/baidu/ERNIE-4.5-0.3B-PT'...
INFO 07-10 14:30:29 llm_engine.py:291] LLM engine is ready
如果没看到“ready”怎么办? 别担心,可能是服务还没完全启动好,稍等十几秒再运行一次上面的命令看看。如果环境没有预启动,你可能需要手动运行启动命令,不过在当前这个镜像环境下,通常不需要这一步。
3. 第二步:创建并启动聊天界面
模型服务好了,现在我们来搭建和它对话的“窗口”。
3.1 创建应用文件
我们需要创建一个Python文件,告诉chainlit怎么连接我们的模型服务。新建一个文件,比如叫 chat_app.py,然后把下面的代码复制进去:
import chainlit as cl
import requests
import json
# 模型服务的地址,默认就在本机的8000端口
VLLM_API_URL = "http://localhost:8000/v1/chat/completions"
@cl.on_chat_start
async def start_chat():
"""当用户开始新对话时,发送欢迎语"""
await cl.Message(
content="👋 你好!我是基于ERNIE-4.5模型的AI助手,可以帮你解答问题、创作文本。试试问我点什么吧!"
).send()
@cl.on_message
async def main(message: cl.Message):
"""核心函数:处理用户发送的每一条消息"""
# 先发送一个空消息,我们会逐步往里面填充内容,实现“打字机”效果
msg = cl.Message(content="")
await msg.send()
try:
# 准备发送给模型的数据
payload = {
"model": "ernie-4.5", # 指定我们启动的模型名称
"messages": [ # 对话消息列表
{"role": "user", "content": message.content}
],
"temperature": 0.7, # 控制回答的随机性,0.7比较均衡
"max_tokens": 1024, # 限制回答的最大长度
"stream": True # 开启流式输出,实现逐字显示
}
# 向模型服务发送请求
response = requests.post(
VLLM_API_URL,
json=payload,
stream=True, # 重要:保持流式连接
headers={"Content-Type": "application/json"}
)
# 处理模型返回的“数据流”
full_response = ""
for line in response.iter_lines():
if line:
line = line.decode('utf-8')
if line.startswith("data: "):
data = line[6:] # 去掉每行开头的"data: "前缀
if data != "[DONE]": # “[DONE]”表示流结束了
try:
chunk = json.loads(data)
# 从数据块中提取出模型新生成的内容
if "choices" in chunk and len(chunk["choices"]) > 0:
delta = chunk["choices"][0]["delta"]
if "content" in delta:
content = delta["content"]
full_response += content
# 关键:将新内容“流式”地更新到聊天界面
await msg.stream_token(content)
except json.JSONDecodeError:
continue # 忽略非JSON格式的数据行
# 确保最终消息完整显示
if full_response:
msg.content = full_response
await msg.update()
else:
await cl.Message(content="抱歉,模型没有返回有效内容。").send()
except Exception as e:
# 如果出错了,告诉用户
await cl.Message(content=f"请求模型时出错了:{str(e)}").send()
if __name__ == "__main__":
# 启动Chainlit应用
cl.run()
代码简单解释:
@cl.on_chat_start: 当用户打开网页时,自动发送一句欢迎语。@cl.on_message: 每当用户在输入框发送消息,这个函数就会被调用。- 我们构造一个请求,把用户的问题发给运行在8000端口的模型服务。
stream=True和await msg.stream_token(content)这两行代码配合,实现了回答逐字出现的“打字机”效果。- 用
try...except包裹起来是为了程序更健壮,万一网络或服务有问题,会给用户一个友好的错误提示。
3.2 启动聊天应用
保存好 chat_app.py 文件后,在终端里,进入到这个文件所在的目录,运行一条简单的命令:
chainlit run chat_app.py
稍等片刻,你会看到类似下面的输出:
Your app is available at http://localhost:8000
大功告成! 你的聊天应用已经启动,并运行在 http://localhost:8000。
4. 第三步:开始你的第一次对话
现在,打开你的浏览器(比如Chrome、Edge),在地址栏输入 http://localhost:8000 并访问。
你会看到一个非常简洁现代的聊天界面。在底部的输入框里,尝试问它一些问题吧!
一些可以尝试的问题:
- 简单问候:
你好! - 知识问答:
太阳系最大的行星是哪个? - 创意任务:
用三句话写一个关于探险的微小说。 - 实用帮助:
帮我写一封简短的会议邀请邮件。
输入问题后,按下回车或点击发送按钮,你会看到模型开始“思考”,并像真人打字一样,逐字把答案显示出来。这就是我们上面代码实现的“流式输出”效果。
5. 让聊天更“聪明”:几个实用小技巧
基本的对话已经没问题了,但你可能想让它的回答更符合你的期望。这里有几个简单调整就能实现的小技巧。
5.1 调整回答的“性格”
模型回答的随机性和创造性主要由 temperature 这个参数控制。你可以在 chat_app.py 文件里找到它:
payload = {
...
"temperature": 0.7, # 就是这里!
...
}
- 调低(如0.2):回答会更稳定、更确定,适合事实性问答。问同样的问题,每次答案都差不多。
- 调高(如0.9):回答会更富有创意、更多样化,适合写故事、想点子。每次回答可能都不一样。
- 0.7左右:是一个比较均衡的默认值,既有一定创造性,又不会太天马行空。
5.2 让模型记住对话上下文
默认情况下,模型每次只看到你当前的问题,不记得之前的对话。我们可以简单修改代码,让它拥有短暂的“记忆”。
在 chat_app.py 的 main 函数开始部分,可以尝试这样改(这是一个简化示例):
@cl.on_message
async def main(message: cl.Message):
# 尝试从“用户会话”中获取之前的对话历史,如果没有就新建一个空列表
history = cl.user_session.get("conversation_history", [])
# 把用户的新问题加到历史记录里
history.append({"role": "user", "content": message.content})
# 为了防止历史太长,只保留最近3轮对话(6条消息)
if len(history) > 6:
history = history[-6:]
# 将整个历史记录(而不只是当前问题)发送给模型
payload = {
"model": "ernie-4.5",
"messages": history, # 这里传的是整个历史列表
"temperature": 0.7,
"max_tokens": 1024,
"stream": True
}
# ... 后面的发送请求和处理响应的代码不变 ...
# 等模型回答完后,把它的回答也加到历史记录里,以便下次使用
history.append({"role": "assistant", "content": full_response})
cl.user_session.set("conversation_history", history)
这样修改后,你就能进行连续多轮对话了。比如先问“李白是谁?”,再问“他最有名的诗是什么?”,模型就能知道“他”指的是李白。
5.3 如果遇到问题怎么办?
- 页面打不开(localhost:8000):请确认终端里
chainlit run的命令是否成功运行,没有报错。 - 模型不回答或报错:首先检查第一步,确认
llm.log里模型服务是否ready。然后检查chat_app.py中的VLLM_API_URL地址是否正确(默认localhost:8000不需要改)。 - 回答速度慢:可以尝试在
payload里把max_tokens改小一点,比如512,限制一下回答的长度。 - 想换个端口:如果8000端口被占用了,可以在启动命令中指定新端口:
chainlit run chat_app.py --port 8001,同时记得把代码里的VLLM_API_URL也改为...8001...。
6. 总结
好了,让我们快速回顾一下这5分钟我们做了什么:
- 确认模型服务:用一行命令检查ERNIE-4.5模型是否已在后台就绪。
- 编写连接代码:创建一个Python文件,用大约50行代码将chainlit聊天界面和vllm模型服务连接起来。
- 启动聊天应用:运行一条命令,在本地启动一个Web服务。
- 开始对话:打开浏览器,访问本地地址,就能和一个功能完整的AI对话应用交互了。
整个过程没有复杂的依赖安装,没有繁琐的环境配置。你得到的不仅仅是一个能用的模型,而是一个拥有流畅交互体验的完整产品。
这个方案非常适合:
- 快速体验:想立刻感受一下最新大模型的能力。
- 原型验证:为你的某个想法快速搭建一个可演示的AI对话原型。
- 内部工具:搭建一个团队内部使用的知识问答或文案生成助手。
它的扩展性也很好,基于这个基础,你可以轻松地:
- 修改界面主题和样式。
- 增加文件上传功能,让模型能读取你提供的文档内容。
- 集成其他API,比如查询天气、计算数据等。
希望这个教程能帮你轻松跨出第一步。接下来,你可以尝试问模型更多有趣的问题,或者按照“实用小技巧”里的建议,调整参数,让它更好地为你服务。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐



所有评论(0)