一、准备运行环境
安装 Ollama Python 库
pip install ollama
二、Ollama SDK 的作用
Ollama 提供了 Python SDK,可以让你不必手写 HTTP 请求,就能在代码里直接调用本地模型。
创建客户端:
import ollama
client = ollama.Client(host="http://localhost:11434")
只要本地 Ollama 服务已经启动,这个客户端就可以直接连接模型。
三、最常用的几个 API
| 方法 | 作用 | 典型用途 |
|---|---|---|
list() |
查看本地已有模型 | 检查模型是否已下载 |
show(model) |
查看模型详情 | 看模型大小、参数等信息 |
ps() |
查看当前运行中的模型 | 排查服务状态 |
chat(model, messages) |
发起对话请求 | 做问答、助手、聊天应用 |
示例:
models = client.list()
info = client.show("deepseek-r1:7b")
running = client.ps()
四、最小可用对话脚本示例
1. 单轮调用
import ollama
client = ollama.Client(host="http://localhost:11434")
response = client.chat(
model="deepseek-r1:7b",
messages=[
{"role": "user", "content": "你是谁?"}
],
)
print(response["message"]["content"])
这段代码适合先验证三件事:
- Python 依赖是否安装成功
- 本地 Ollama 服务是否能连通
- 模型是否能正常返回结果
2. 多轮对话的基本思路
多轮对话本质上不是模型“记住了你”,而是你每次调用时都把上下文消息一起传回去。
例如:
messages = [
{"role": "system", "content": "你是一个简洁的本地 AI 助手。"},
{"role": "user", "content": "请介绍一下什么是 RAG。"},
]
response = client.chat(model="deepseek-r1:7b", messages=messages)
print(response["message"]["content"])
后续如果要继续追问,就把模型回复也追加回 messages 列表中。
五、把调用封装成 Python 函数
实际开发里,最好不要在业务代码里到处直接写 client.chat(...),而是先收口成一个函数。
import ollama
client = ollama.Client(host="http://localhost:11434")
def ask_local_model(user_input, model="deepseek-r1:7b"):
response = client.chat(
model=model,
messages=[{"role": "user", "content": user_input}],
)
return response["message"]["content"]
if __name__ == "__main__":
answer = ask_local_model("请用简单语言解释什么是向量数据库")
print(answer)
六、使用 Streamlit 做界面
如果你想尽快做出一个能交互的本地 AI 页面,Streamlit 很适合作为第一版原型:不用单独写前端,上手快,代码基本就是界面,也方便把模型调用快速包装成可视化页面。
安装和验证
安装:
pip install streamlit
验证环境:
streamlit hello
注册页面案例
注册页面案例
#main.py
# 1.导包
# 先安装: pip install streamlit
import streamlit as st
# todo 注意: streamlit的文件不能右键直接运行,需要用streamlit运行命令: streamlit run 文件
# 2.设置标题
st.title('传智教育用户注册平台')
# 3.添加分隔线
st.divider()
# 4.获取用户名
user_name = st.text_input('请输入用户名:',value='binzi')
# 5.获取密码
user_pwd = st.text_input('请输入密码:', type='password',value='123')
# 6.获取年龄
user_age = st.number_input('请输入年龄:', value=18, min_value=0, max_value=150)
# 7.获取性别
user_gender = st.radio('请选择性别:', options=("男", "女", "保密"), horizontal=True)
# 8.获取生日
user_bir = st.date_input('请选择生日:')
# 9.获取身高
user_height = st.slider('请选择身高:', value=188, min_value=0, max_value=300)
# 10.提交按钮
# 非空即为True
if st.button('确认'):
st.write('恭喜您,信息录入成功!')
# 写到页面
st.write(f"""您输入的内容是
用户名: {user_name}
密码: {user_pwd}
年龄: {user_age}
性别: {user_gender}
出生日期: {user_bir}
身高: {user_height}
""")
# 写到本地文件
with open('user_info.txt', "w", encoding='utf8') as f:
f.write(f"""您输入的内容是
用户名: {user_name}
密码: {user_pwd}
年龄: {user_age}
性别: {user_gender}
出生日期: {user_bir}
身高: {user_height}
""")#runmain.py
import os
os.system('streamlit run main.py')

七、最小聊天页面案例
下面这个例子,可以完成:
- 展示聊天历史
- 接收用户输入
- 调用本地 Ollama 模型
- 把回复展示在页面上
1. 最小版本
最小聊天页面案例
import streamlit as st
import ollama
client = ollama.Client(host="http://localhost:11434")
st.title("本地大模型对话助手")
# 首次进入页面时初始化聊天记录,用于保存多轮对话
if "messages" not in st.session_state:
st.session_state.messages = []
# 先把历史消息重新渲染出来,避免页面刷新后对话丢失
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.write(msg["content"])
# 底部输入框有新内容时,开始处理这一轮对话
if user_input := st.chat_input("请输入你的问题"):
# 先把用户输入写入会话状态,便于后续统一管理上下文
st.session_state.messages.append({"role": "user", "content": user_input})
with st.chat_message("user"):
st.write(user_input)
# 这里原本应该调用 Ollama 接口获取模型回复
# response = client.chat(
# model="deepseek-r1:7b",
# messages=[{"role": "user", "content": user_input}],
# )
# model_reply = response["message"]["content"]
# 为了先演示页面交互流程,这里暂时用固定回复代替
model_reply = "抱歉,这个问题我还不会!"
# 把助手回复也保存下来,这样下一次刷新时仍能显示完整聊天记录
st.session_state.messages.append({"role": "assistant", "content": model_reply})
with st.chat_message("assistant"):
st.write(model_reply)2. 启动方式
streamlit 不支持ide直接运行,只能另外创建一个运行入口或者用
streamlit run命令
streamlit run app.py
默认会在浏览器打开本地页面,地址通常是 http://localhost:8501。
3. 进阶版本
V2 版本:
黑马智聊机器人V2案例
# 1.导包
import streamlit as st
import ollama_utils
# 2.添加标题
st.title('黑马智聊机器人')
# 3.添加分割线
st.divider()
# TODO 5.提前创建messages列表,用于添加和展示历史聊天记录
# st.session_state格式->{'messages':[{AI开场白},{用户问题1},{AI答案1},{用户问题2},{AI答案2},...]}
if "messages" not in st.session_state:
# 首次没有历史列表,那就创建一个空列表
st.session_state['messages'] = []
# 提前添加一个AI开场白消息到messages列表中
st.session_state['messages'].append(
{'role': 'assistant', 'content': '你好,我是黑马智聊机器人,有什么可以帮助您的吗?'})
# TODO 4.构建AI和用户的聊天窗口
# todo 4.1 遍历历史消息列表,把每个消息依次展示到页面
for message in st.session_state['messages']:
# todo 首次只拿到了AI开场白,后续拿到的是问答历史记录
st.chat_message(message['role']).write(message['content'])
# 4.2 获取用户的输入
prompt = st.chat_input('请输入您的问题:')
# 4.3 展示AI的答案
# 非空即为True
if prompt:
# TODO 如果用户输入了问题,再展示问题
st.chat_message('user').write(prompt)
st.session_state['messages'].append({'role': 'user', 'content': prompt}) # 存储用户问题历史
# TODO 当问题回应比较慢的时候,可以添加spinner("正在思考...")
with st.spinner('正在思考...'):
# todo 此处要根据上述用户的问题,调用大模型获取答案
# 'messages':[{AI开场白},{用户问题1},{AI答案1},{用户问题2},{AI答案2},...]
llm_result = ollama_utils.get_ollama_chat_result(st.session_state['messages'][-20:]) # 建议把最近的20个问答记录发送给模型即可
# todo 此处直接把ai生成的答案返回到页面中
st.chat_message('assistant').write(llm_result)
st.session_state['messages'].append({'role': 'assistant', 'content': llm_result}) # 存储ai历史八、一个更接近真实项目的封装思路
当你不再只是做单文件 Demo,可以按下面的结构拆分:
project/
├── app.py # Streamlit 页面入口
├── llm_client.py # Ollama 客户端封装
├── prompts.py # 提示词模板
├── settings.py # 配置项
└── utils.py # 辅助函数
对应职责可以这样分:
app.py:只负责页面交互llm_client.py:只负责模型调用prompts.py:只负责角色设定与提示词模板settings.py:统一配置模型名、地址等参数
这一步其实就是“从能跑的脚本”进入“可维护的应用”。
小结
这一篇真正想建立的是下面这层意识:
模型能跑 ≠ 应用已经完成
只有当你把模型调用逻辑、界面交互、配置管理和后续扩展点一起考虑进去时,才算真正开始了 AI 应用封装。
参考阅读: