news 2026/2/28 21:20:33

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/2/23 7:05:36

上海哪些海洋公园可以触摸海洋动物

根据网络搜索,上海有以下海洋公园提供亲手触摸海洋动物的互动体验:1. 长风海洋世界免费互动区“触摸星地带”,可触摸蓝色海星🌟,需洗手。在饲养员指导下,可亲手抚摸斑节竹鲨(小型鲨鱼&#xff0…

作者头像 李华
网站建设 2026/2/27 12:18:52

救命神器9个一键生成论文工具,自考学生轻松搞定毕业论文!

救命神器9个一键生成论文工具,自考学生轻松搞定毕业论文! 自考论文难?AI 工具帮你轻松搞定 对于自考学生来说,毕业论文无疑是整个学习过程中最具挑战性的环节之一。从选题、查资料到撰写、修改,每一步都需要耗费大量时…

作者头像 李华
网站建设 2026/2/25 11:17:24

提示工程架构师揭秘:Agent交互提示链设计的内幕

提示工程架构师揭秘:Agent交互提示链设计的内幕 1. 引入与连接:为什么有些Agent像“没听懂话”? 一个让用户崩溃的对话场景 某天,你想订一家海边酒店,打开旅游APP的智能助手Agent,对话如下: 你&…

作者头像 李华
网站建设 2026/2/27 23:51:40

交通仿真软件:VISSIM_(8).行人与自行车仿真

行人与自行车仿真 在交通仿真软件VISSIM中,行人和自行车的仿真模块是非常重要的组成部分,它们可以帮助研究者和工程师更全面地理解交通系统中非机动车和行人的行为规律,从而优化交通设计和管理。本节将详细介绍如何在VISSIM中进行行人和自行车…

作者头像 李华
网站建设 2026/2/28 9:27:50

交通仿真软件:VISSIM_(12).VISSIM与其他软件的接口与数据交换

VISSIM与其他软件的接口与数据交换 在交通仿真领域,VISSIM 是一种强大的工具,用于模拟交通流量、信号控制、公共交通等复杂交通系统。然而,为了实现更复杂的功能和更高效的仿真,VISSIM 经常需要与其他软件进行接口和数据交换。本节…

作者头像 李华