news 2026/1/25 3:17:01

Python 使用 Chainlit + Ollama 快速搭建本地 AI 聊天应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 使用 Chainlit + Ollama 快速搭建本地 AI 聊天应用

使用 Chainlit + Ollama 快速搭建本地 AI 聊天应用

大家好!今天分享一个超级简单的本地 AI 聊天界面实现方案:Chainlit + Ollama
无需部署复杂的后端,只需本地运行 Ollama,再用几行 Python 代码,就能拥有一个支持模型切换、流式输出的美观聊天界面。

效果如下(实际运行时会实时流式显示回复):

  • 支持检测本地所有 Ollama 模型
  • 自动过滤出生成型模型用于聊天
  • 支持一键切换模型
  • 流式输出,体验接近 ChatGPT

下面一步步教大家从零开始搭建。

一、环境准备

1. 安装 Ollama

前往官网下载并安装 Ollama:
https://ollama.com/download

安装完成后,打开终端运行:

ollama --version

看到版本号即表示安装成功。

2. 拉取模型(必须)

Ollama 默认没有模型,需要手动拉取。我们推荐以下生成型模型(任选其一即可):

# 推荐中文能力强的模型ollama pull qwen2.5# 阿里通义千问 2.5,中文极强ollama pull qwen2.5:7b# 更小更快版本# 或者经典的 Llama3ollama pull llama3 ollama pull llama3:8b# 其他可选ollama pull gemma2 ollama pull phi3

拉取完成后运行ollama list查看已安装模型。

3. 安装 Python 依赖

创建一个新文件夹(如ollama-chainlit),进入文件夹后执行:

pipinstallchainlit httpx

这是本项目所需的所有第三方库,非常轻量。

二、完整代码

将以下代码保存为app.py(文件名随意,但后缀必须是.py):

importchainlitasclimporthttpximportjson# 同步获取 Ollama 模型列表defget_ollama_models():try:withhttpx.Client(timeout=10.0)asclient:response=client.get("http://localhost:11434/api/tags")response.raise_for_status()data=response.json()return[m["name"]formindata["models"]]exceptExceptionase:print(f"获取模型列表失败:{e}")return[]OLLAMA_MODELS=get_ollama_models()# 过滤生成模型(排除常见的 embedding 模型)GENERATIVE_MODELS=[mforminOLLAMA_MODELSif"embed"notinm.lower()and"bge"notinm.lower()]ifnotGENERATIVE_MODELS:print("警告:未检测到生成模型,请拉取如 ollama pull qwen2.5 或 ollama pull llama3")DEFAULT_MODEL="llama3"# fallbackelse:DEFAULT_MODEL=GENERATIVE_MODELS[0]# Ollama 流式生成asyncdefollama_chat_stream(model:str,messages:list):payload={"model":model,"messages":messages,"stream":True}asyncwithhttpx.AsyncClient(timeout=None)asclient:try:asyncwithclient.stream("POST","http://localhost:11434/api/chat",json=payload)asresponse:asyncforlineinresponse.aiter_lines():ifnotline.strip():continuedata=json.loads(line)if"message"indataand"content"indata["message"]:yielddata["message"]["content"]ifdata.get("done"):breakexceptExceptionase:yieldf"\n\n[错误: 调用 Ollama 失败 -{str(e)}]"# Chainlit 应用@cl.on_chat_startasyncdefon_chat_start():all_models_info=', '.join(OLLAMA_MODELS)ifOLLAMA_MODELSelse"无"gen_models_info=', '.join(GENERATIVE_MODELS)ifGENERATIVE_MODELSelse"无(请拉取生成模型,如 qwen2.5、llama3 等)"awaitcl.Message(content=f"欢迎使用 Chainlit + Ollama!\n"f"检测到所有模型:{all_models_info}\n"f"可用于聊天的生成模型:{gen_models_info}").send()ifnotGENERATIVE_MODELS:awaitcl.Message(content="提示:当前只有 embedding 模型,无法正常聊天。请运行 `ollama pull qwen2.5` 或其他生成模型后重启。").send()returncl.user_session.set("current_model",DEFAULT_MODEL)iflen(GENERATIVE_MODELS)>1:actions=[cl.Action(name="model_select",value=model,label=f"切换到{model}")formodelinGENERATIVE_MODELS]awaitcl.Message(content=f"当前模型: **{DEFAULT_MODEL}**\n选择其他模型:",actions=actions).send()else:awaitcl.Message(content=f"当前模型: **{DEFAULT_MODEL}**(唯一生成模型)").send()@cl.action_callback("model_select")asyncdefon_model_select(action:cl.Action):new_model=action.value cl.user_session.set("current_model",new_model)awaitcl.Message(content=f"模型已切换为: **{new_model}**").send()@cl.on_messageasyncdefon_message(message:cl.Message):ifnotGENERATIVE_MODELS:awaitcl.Message(content="未检测到生成模型,无法回复。").send()returnmodel_name=cl.user_session.get("current_model",DEFAULT_MODEL)messages=cl.user_session.get("messages",[])messages.append({"role":"user","content":message.content})# 创建流式消息response_msg=cl.Message(content="")awaitresponse_msg.send()# 显示正在生成提示response_msg.content=f"[{model_name}] 正在生成..."awaitresponse_msg.update()# 流式输出full_response=""asyncfortokeninollama_chat_stream(model_name,messages):full_response+=tokenawaitresponse_msg.stream_token(token)# 保存历史messages.append({"role":"assistant","content":full_response})cl.user_session.set("messages",messages)# 最终更新awaitresponse_msg.update()

三、运行项目

确保 Ollama 服务正在运行(安装后一般会自动启动,如果没有可以手动运行ollama serve)。

在代码所在目录打开终端,执行:

chainlit run app.py -w

-w参数表示自动刷新浏览器,开发时很方便。

运行成功后,浏览器会自动打开http://localhost:8000,你将看到欢迎界面和模型列表。

点击右侧的模型按钮即可切换,输入问题开始聊天!

四、常见问题

  1. 模型切换按钮不显示?
    只有检测到多个生成模型时才会显示切换按钮。如果只有一个模型,会直接显示“唯一生成模型”。

  2. 提示“正在生成…”一直不消失?
    检查 Ollama 是否正常运行,模型是否拉取成功。可以在终端运行ollama list确认。

  3. 想去掉“正在生成…”提示?
    可以修改on_message函数最后部分,把注释掉的代码取消:

    response_msg.content=f"[{model_name}]\n\n{full_response}"awaitresponse_msg.update()

    这样最终只会显示模型名 + 回复内容。

五、总结

整个项目只有不到 100 行代码,却实现了:

  • 自动检测本地模型
  • 模型切换
  • 流式输出
  • 聊天历史保持

非常适合本地玩大模型、快速搭建私人助手、学习 Chainlit 框架。

喜欢的话别忘了点赞 + 收藏 + 关注三连哦~
有问题欢迎在评论区留言,我会尽快回复!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/22 16:10:29

没有公网IP,入手了NAS怎么玩?

最近有小伙伴开始折腾NAS,历经千辛万苦之后终于把飞牛NAS搞定了。但是随之而来的又是另一件麻烦的事情:家里的宽带没有下发公网IPv6,自己也不知道怎么去调整,于是就找到了小白。 所以就有了今天的这篇文章:没有公网IP…

作者头像 李华
网站建设 2026/1/23 6:50:52

n8n这次更新要逆天!工作流秒变GPTs,企业级权限控制终于来了

n8n这次更新要逆天!工作流秒变GPTs,企业级权限控制终于来了 🔥 如果你还在用老版n8n,那你的工作流可能正在裸奔!就在昨天,n8n 2.0带着颠覆性功能正式上线,这次更新直接引爆技术圈——工作流秒变…

作者头像 李华
网站建设 2026/1/23 13:32:43

交通仿真软件:VISSIM_(13).交通管理策略仿真

交通管理策略仿真 1. 交通信号控制仿真 交通信号控制是交通管理中最常见也是最有效的手段之一。通过仿真软件,可以模拟不同交通信号控制策略的效果,从而优化信号配时,减少交通拥堵,提高道路通行能力。VISSIM 提供了丰富的交通信号…

作者头像 李华
网站建设 2026/1/23 19:27:30

交通仿真软件:VISSIM_(14).事故与异常情况模拟

事故与异常情况模拟 在交通仿真软件中,事故与异常情况的模拟是评估交通系统在极端条件下的性能和安全性的关键部分。通过模拟事故和异常情况,可以研究交通流的动态变化、驾驶员的行为反应以及交通管理措施的有效性。本节将详细介绍如何在VISSIM中模拟事故…

作者头像 李华
网站建设 2026/1/23 1:33:45

互联网服务提供商:掌控网络接入的底层逻辑

当你打开浏览器访问网页或通过终端发起 SSH 连接时,数据流必须经过特定的物理基础设施。ISP(Internet Service Provider),即互联网服务提供商,正是负责搭建并维护这些基础设施的机构。它不仅是每月收取宽带费用的商业公…

作者头像 李华