5分钟上手ERNIE-4.5:vllm部署模型,chainlit创建ChatGPT式对话应用

想快速搭建一个属于自己的ChatGPT式对话应用吗?今天我就带你用最简单的方式,把百度的ERNIE-4.5轻量级大模型跑起来,再给它套上一个漂亮的聊天界面。整个过程就像拼乐高一样简单,不需要复杂的配置,跟着步骤走,5分钟就能搞定。

1. 准备工作:快速了解我们要做什么

在动手之前,我们先花一分钟了解一下整个流程,这样你就知道每一步的意义了。

1.1 我们要搭建什么?

简单来说,我们要做两件事:

  1. 启动模型服务:把ERNIE-4.5这个“大脑”运行起来,让它能理解问题并生成回答。
  2. 创建聊天界面:做一个像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=Trueawait 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.pymain 函数开始部分,可以尝试这样改(这是一个简化示例):

@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分钟我们做了什么:

  1. 确认模型服务:用一行命令检查ERNIE-4.5模型是否已在后台就绪。
  2. 编写连接代码:创建一个Python文件,用大约50行代码将chainlit聊天界面和vllm模型服务连接起来。
  3. 启动聊天应用:运行一条命令,在本地启动一个Web服务。
  4. 开始对话:打开浏览器,访问本地地址,就能和一个功能完整的AI对话应用交互了。

整个过程没有复杂的依赖安装,没有繁琐的环境配置。你得到的不仅仅是一个能用的模型,而是一个拥有流畅交互体验的完整产品。

这个方案非常适合:

  • 快速体验:想立刻感受一下最新大模型的能力。
  • 原型验证:为你的某个想法快速搭建一个可演示的AI对话原型。
  • 内部工具:搭建一个团队内部使用的知识问答或文案生成助手。

它的扩展性也很好,基于这个基础,你可以轻松地:

  • 修改界面主题和样式。
  • 增加文件上传功能,让模型能读取你提供的文档内容。
  • 集成其他API,比如查询天气、计算数据等。

希望这个教程能帮你轻松跨出第一步。接下来,你可以尝试问模型更多有趣的问题,或者按照“实用小技巧”里的建议,调整参数,让它更好地为你服务。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐