写在前面

在经过之前的学习后,相信大家已经开发一些简单的Python程序了。本篇文章,我们将利用Python里的streamlit包开发前端页面,用Ollama作为后端服务,部署一个简单的问答机器人。综合应用一下之前学习的知识。

一、环境准备

# 通过pip安装streamlit库
pip install streamlit

二、streamlit框架入门

我们通过做一个简单的用户注册页面,了解一下streamlit框架的几个简单的用法。

import streamlit as st

# 标题——st.title()
st.title('用户注册平台')
# 分割线——st.divider()
st.divider()
# 文本输入框——st.text_input()
username = st.text_input('用户名')
password = st.text_input('密码')
# 数字输入框——st.number_input()
age = st.number_input('年龄', value=18)
# 单选框——st.radio()
gender = st.radio('性别', ('男', '女', '沃尔玛购物袋'), horizontal=True)
# 日期输入框——st.date_input()
birth = st.date_input('生日')
# 滑块效果——st.slider
height = st.slider('身高', min_value=100, max_value=300, value=175)
# 按钮——st.button()
button = st.button('确认')
if button:
    # 仅做效果演示用,实际功能不写了
    st.write('恭喜您,信息录入成功')

在python代码写好后,在pycharm的终端里运行命令 streamlit run 你的python脚本地址

成功后会跳转到浏览器,效果如下

三、网页问答机器人

该项目会涉及到两个python文件,一个负责调用本地部署的ollama,另一个负责前端页面的实现。

1.通过python中的ollama库便捷调用本地ollama服务部署的模型

首先通过pip install ollama安装ollama库

代码实现如下

import ollama

# 1.初始化客户端
client = ollama.Client(host='localhost:11434')
# 2.定义调用本地ollama的函数
def get_response(messages):
    result = client.chat(
        model='qwen2.5:0.5b', # 可以通过ollama list命令查看可用模型
        messages=messages
    )
    return result['message']['content']

if __name__ == '__main__':
    # 测试函数调用
    messages = [
        {
            'role': 'system',
            'content': '你是一个生活助手'
        },
        {
            'role': 'user',
            'content': '你是谁'
        }
    ]
    print(get_response(messages))

2.使用streamlit实现前端效果

import streamlit as st
from llm_tools import get_response # 导入自己的工具类功能

# 1.设置标题并添加分割线
st.title('聊天机器人') # 标题
st.divider() # 分割线

# 由于聊天是多轮的,需要使用到streamlit中的session_state保持状态,我们把多轮聊天的内容存储在session_state的messages中
# 2.streamlit在每次交互结束后,会重新执行代码,所以要先判断session_state中是不是已经有messages了,没有就创建
if "messages" not in st.session_state:
    # AI助手的第一条信息
    st.session_state["messages"] = [{'role': 'assistant', 'content': '你好,有什么可以帮到你!'}]

# 3.聊天窗口
# 每次渲染,把st.session_state['messages']里存储的所有对话都展示出来
for message in st.session_state["messages"]:
    # 在聊天窗口打印文本——st.chat_message(讲话的角色).write(内容)
    st.chat_message(message['role']).write(message['content'])

# 用户输入的问题
user_input = st.chat_input()
if user_input:
    # 在页面上打印用户输入的问题
    st.chat_message('user').write(user_input)
    # 格式化为提示词
    prompt = {'role': 'user', 'content': user_input}
    # 把用户问的问题存入对话历史中
    st.session_state['messages'].append(prompt)
    # 调用我们写的工具让AI回答问题
    with st.spinner('正在思考中...'):
        print(st.session_state.messages)
        res = get_response(st.session_state.messages)
    # 在页面上打印AI的回答
    st.chat_message('assistant').write(res)
    # 将对话存入对话历史中
    st.session_state['messages'].append({'role': 'assistant', 'content': res})

最终实现的效果如下

本篇总结

通过该项目的实践,我们可以发现,之前讲到的容器、函数、判断、循环等,其实是Python的“常识”。你没有办法去标识哪一些内容是重点,因为到了真正的开发中,这些知识的应用是十分普遍的。

在现在AI开发的时代,是降低了初级开发人员入行的门槛的,因此我们不一定需要能够完全独立敲出以上的代码。但是重点是,我们需要能够看懂并理解以上代码。

本篇文章也是在7天枯燥的理论知识学习后,再次通过一个实操项目,试图让大家维持住对AI的兴趣。毕竟我一直强调那句话——兴趣就是最好的老师。

后面还会进行一段时间的Python进阶内容讲解,以及部分Linux知识,这些都是为了AI应用的铺垫。磨刀不误砍柴工,道阻且长,各位一起努力吧!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐