AI 应用封装入门:Ollama SDK 与 Streamlit 实战

一、准备运行环境

安装 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 版本:

# 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 应用封装。

参考阅读: