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 框架。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1174621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI应用架构师指南:AI驱动客户洞察系统的6层技术架构设计与实践

AI应用架构师指南:AI驱动客户洞察系统的6层技术架构设计与实践——从数据到决策的全链路构建方法论 一、引言:为什么需要AI驱动的客户洞察系统? 1.1 企业的“客户洞察痛点”:从数据爆炸到决策困境 今天的企业面临着前所未有的数据爆炸——线上商城的用户行为日志、线下门…

巴菲特的焦点投资策略

巴菲特的焦点投资策略 关键词:巴菲特、焦点投资策略、价值投资、集中投资、长期投资 摘要:本文深入探讨了巴菲特的焦点投资策略。从背景介绍出发,阐述了该策略的目的、适用读者、文档结构以及相关术语。详细解析了焦点投资策略的核心概念,包括其原理、架构,并通过文本示意…

[吾爱大神原创工具] AI 提示词管理软件,具有高频词云 词云筛选 收录提醒 标签 颜色 等多种功能

[吾爱大神原创工具] AI 提示词管理软件,具有高频词云 词云筛选 收录提醒 标签 颜色 等多种功能 链接:https://pan.xunlei.com/s/VOjAopbRCUPHg5f5gmJLP455A1?pwdx68h# 最近经常用ai,发现论坛有一个提示词软件, 看着界面很简单&…

linux驱动之led(合众恒跃RK3506平台)

内核配置加上如下配置CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_GPIO=y CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRI…

2026 年公交广告公司综合实力排行榜单及选择建议指南:2026年公交广告公司如何选?哪家好?哪家强?哪家靠谱?选哪家 - Top品牌推荐

一、公交广告行业概况 公交广告作为户外广告的重要组成部分,凭借其广泛的覆盖范围、强制性曝光和高到达率,成为品牌营销的重要渠道。随着城市化进程加速和公共交通基础设施的持续完善,公交广告行业正迎来新一轮增长…

音程知识

音程是音乐理论的基础概念,指两个音符之间的音高距离。它由两个要素决定:度数和音数。 以下是系统的分类和总结:一、按“性质”分类(最常见) 音程分为 纯音程、大音程、小音程、增音程、减音程、倍增音程、倍减音…

210_尚硅谷_继承的深入讨论(1)

210_尚硅谷_继承的深入讨论(1)1.面向对象编程------继承的深入讨论 2.结构体可以使用嵌套匿名结构体所有的字段和方法,即,首字母大写或者小写的字段,方法,都可以使用 3.匿名结构体字段访问可以简化 4.当结构体和匿名结…

2026 年高铁广告公司综合实力排行榜单及选择建议指南:2026年高铁广告公司如何选?哪家好?哪家强?哪家靠谱?选哪家 - Top品牌推荐

一、行业概况 随着中国 "八纵八横" 高铁网络日趋完善,日均数千万的庞大、优质客流,使其成为品牌进行全国性渗透和区域深耕不可忽视的黄金媒介场。高铁媒体构建了一个覆盖主流消费人群、具有强封闭性和高信…

提示工程架构师指南:如何用上下文工程提升Agentic AI的任务完成率

提示工程架构师指南:用上下文工程让Agentic AI从「能做」到「做好」 摘要/引言 你有没有遇到过这样的Agentic AI? 明明让它“分析这个月的销售数据并生成报告”,它却中途跑去查去年的库存;明明用户补充了“要包含区域对比”&#…

5D影院带来的视觉震撼与娱乐投资价值分析以及球幕影院设备价格揭秘

5D影院:技术革新带来的视听震撼新体验 5D影院通过结合视觉、听觉和触觉等多种感官体验,创造出一种前所未有的沉浸式观影环境。观众不仅可以欣赏到3D影像,还会感受到风、水、光影等真实的互动效果,使得影片情节更加生动。这种技术革…

无线网络仿真:蜂窝网络仿真_(10).5G及未来网络仿真技术

5G及未来网络仿真技术 5G网络的基本架构 5G网络是一种先进的移动通信技术,旨在提供更高的数据传输速率、更低的延迟、更高的可靠性和更大的连接密度。为了实现这些目标,5G网络采用了多种新技术和架构,包括大规模MIMO、毫米波通信、网络切片…

5D影院中的4D座椅打造极致沉浸式观影体验

5D影院中的4D座椅带来的多维感官体验 在5D影院中,4D座椅巧妙地运用动态感应技术,给观众带来多维的感官享受。这些座椅能够与影片中的动作场景同步,实时调整其运动,从而让观众在观看时生动体验到*飞行*、*追逐*等激烈场面。每一次剧…

网关支付与纯代付的区别及应用场景

网关支付与纯代付是支付结算领域两类核心的资金流转模式,二者在交易发起主体、业务逻辑及适用场景上存在显著差异。网关支付以用户主动发起支付为核心特征,主要应用于终端用户为获取商品或服务而完成的资金支付场景,典型覆盖电商平台交易、移…

无线网络仿真:蜂窝网络仿真_(9).蜂窝网络中的干扰管理与优化

蜂窝网络中的干扰管理与优化 干扰的基本概念 在蜂窝网络中,干扰是影响通信质量的重要因素之一。干扰可以分为多种类型,包括同频干扰、邻频干扰、多径干扰和外部干扰等。同频干扰是指在同一频率上多个用户或基站同时传输数据时产生的干扰;邻频…

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

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

单位冲击函数和单位冲击响应

这是一个信号与系统、控制理论以及工程数学中的核心概念。我们来系统地梳理一下单位冲击函数(狄拉克δ函数)和单位冲击响应的定义与性质。一、 单位冲击函数 (Unit Impulse Function) - δ(t) 单位冲击函数δ(t)是一个广义函数或分布,它不是通…

笔记06. 假设检验

设检验中的几个核心概念:否定域(拒绝域)、显著性水平 α、p 值(p-value)**。这些概念在统计推断中彼此紧密相关,理解它们能帮助你正确设计统计检验并解读检验结果。📖 第一人称心路独白:关于 H₀、5%,以及那…

Why Web2 → Web3 is slow

1. Java as a “safe sandbox” for governments & enterprises From a real cultural and political aspect of programming, not just technical: Predictable runtimeControlled memoryStandardized librariesBackwards compatibilityVendor supportAuditable behavior …

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

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