项目介绍:

利用Streamlit,Ollama以及Python从零开始构建简单的聊天机器人🤖来巩固所学知识同时建立大模型学习兴趣

项目演示:

项目技术架构

  • 后端模型:利用 Ollama 平台的 Qwen 模型,该模型具备出色的自然语言处理能力,能够理解和生成自然语言文本,为聊天机器人提供核心的对话处理功能。
  • 前端界面:采用 Streamlit 框架搭建用户界面,Streamlit 是一个简单易用的 Python 库,能够快速创建美观、交互式的 Web 应用,使用户能够通过网页与聊天机器人进行实时对话。
  • 对话交互:用户可以通过 Streamlit 界面输入文本,聊天机器人基于 Qwen 模型对输入内容进行理解和处理,生成相应的回复并展示在界面上,实现流畅的对话交互。
  • 模型调用:后端服务负责将用户输入传递给 Qwen 模型,并获取模型生成的回复,然后将回复内容返回给前端界面进行展示,确保对话的实时性和准确性。
  • 界面展示:Streamlit 界面提供简洁明了的布局,包括输入框、发送按钮和对话展示区域,用户可以方便地输入问题并查看机器人的回答,提升用户体验。

项目开发环境

  • 操作系统:支持主流操作系统,如 Windows、macOS 和 Linux。
  • 依赖软件:需要安装 Python 环境以及 Ollama 平台和 Streamlit 库。
  • 硬件要求:推荐配置较高的处理器和足够的内存,以确保模型的高效运行和良好的用户体验。

项目准备:

本地需要先安装下依赖包.

pip install ollama 
pip install langchain -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain-community -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain-classic
pip install dashscope -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install streamlit==1.32.0

方式:管理员打开Anaconda Promopt输入命令进行下载

Streamlit简单介绍和使用

Streamlit 官方介绍:能在几分钟内把 Python 脚本变成可分享的网站。只需使用纯 Python ,无需前端经验。甚至,你只需要懂 markdown ,然后按照一定规则去做也能搞个网页出来。它还支持免费部署,感动到落泪。

官方网站:https://streamlit.io/

Streamlit安装

首先你的电脑需要有 python 环境。

python 环境后,使用下面这条命令就可以安装 streamlit

pip install streamlit==1.32.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装 streamlit 成功后可以使用下面这条命令看看能不能运行起来。

streamlit hello

基础语法

标题

使用 st.title() 可以设置标题内容。

st.title('Streamlit教程')
段落write

段落就是 HTML 里的 <p> 元素,在 streamlit 里使用 st.write('内容') 的方式去书写。

import streamlit as st

st.write('Hello')
使用markdown

streamlit 是支持使用 markdown 语法来写页面内容的,只需使用单引号或者双引号的方式将内容包起来,并且使用 markdown 的语法进行书写,页面就会出现对应样式的内容。

import streamlit as st

"# 1级标题"
"## 2级标题"
"### 3级标题"
"#### 4级标题"
"##### 5级标题"
"###### 6级标题"
图片

渲染图片可以使用 st.image() 方法,也可以使用 markdown 的语法。

st.image(图片地址, [图片宽度]) ,其中图片宽度不是必填项。

import streamlit as st

st.image('./avatar.jpg', width=400)
表格

streamlit 有静态表格和可交互表格。表格在数据分析里属于常用组件,所以 streamlit 的表格也支持 pandasDataFrame

静态表格 table

静态表格使用 st.table() 渲染,出来的效果就是 HTML<table>

st.table() 支持传入字典、pandas.DataFrame 等数据。

import streamlit as st
import pandas as pd

st.write('dict字典形式的静态表格')
st.table(data={
    'name': ['张三', '李四', '王五'],
    'age': [18, 20, 22],
    'gender': ['男', '女', '男']
})

st.write('pandas中dataframe形式的静态表格')

df = pd.DataFrame(
    {
        'name': ['张三', '李四', '王五'],
        'age': [18, 20, 22],
        'gender': ['男', '女', '男']
    }
)
st.table(df)
可交互表格 dataframe

可交互表格使用 st.dataframe() 方法创建,和 st.table() 不同,st.dataframe() 创建出来的表格支持按列排序、搜索、导出等功能。

import streamlit as st
import pandas as pd

st.write('dict字典形式的可交互表格')
st.dataframe(data={
    'name': ['张三', '李四', '王五'],
    'age': [18, 20, 22],
    'gender': ['男', '女', '男']
})

st.write('pandas中dataframe形式的可交互表格')
df = pd.DataFrame(
    {
        'name': ['张三', '李四', '王五'],
        'age': [18, 20, 22],
        'gender': ['男', '女', '男']
    }
)
st.dataframe(df)
分割线

分隔线就是 HTML 里的 <hr> 。在 streamlit 里使用 st.divider() 方法绘制分隔线。

import streamlit as st

st.divider()
输入框

知道怎么声明变量后,可以使用一个变量接收输入框的内容。

输入框又可以设置不同的类型,比如普通的文本输入框、密码输入框。

  • 普通输入框

输入框使用 st.text_input() 渲染。

name = st.text_input('请输入你的名字:')

if name:
  st.write(f'你好,{name}')

☆ 密码

如果要使用密码框,可以给 st.text_input() 加多个类型 type="password"

import streamlit as st

pwd = st.text_input('密码是多少?', type='password')

☆ 数字输入框 number_input

数字输入框需要使用 number_input

import streamlit as st

age = st.number_input('年龄:')

st.write(f'你输入的年龄是{age}岁')

众所周知,正常表达年龄是不带小数位的,所以我们可以设置 st.number_input() 的步长为1,参数名叫 step

# 省略部分代码

st.number_input('年龄:', step=1)

这个步长可以根据你的需求来设置,设置完后,输入框右侧的加减号每点击一次就根据你设置的步长相应的增加或者减少。

还有一点,人年龄不可能是负数,通常也不会大于200。可以通过 min_valuemax_value 设置最小值和最大值。同时还可以通过 value 设置默认值。

st.number_input('年龄:', value=20, min_value=0, max_value=200, step=1)

多行文本框 text_area

创建多行文本框使用的是 st.text_area(),用法和 st.text_input() 差不多。

import streamlit as st

paragraph = st.text_area("多行内容:")
Chat Elements
  • Chat文本输入框
import streamlit as st

prompt = st.chat_input("Say something")
if prompt:
    st.write(f"User has sent the following prompt: {prompt}")
  • Chat Message
# 导入 Streamlit 库,Streamlit 是一个用于快速创建数据应用的 Python 库
import streamlit as st

# 使用 st.chat_input 创建一个聊天输入框,提示用户输入问题
prompt = st.chat_input('请输入您的问题: ')

st.write(f'您的问题是: {prompt}')

# 使用 st.chat_message 创建一个用户消息容器,用于显示用户的消息
# 'user' 表示这是用户发送的消息
with st.chat_message('user'):
    # 在用户消息容器中显示文本 'Hello '
    st.write('Hello ')

# 使用 st.chat_message 创建一个消息容器,用于显示回复消息
message = st.chat_message('assistant')
# 在消息容器中显示文本 'Hello Human',模拟助手的回复
message.write('Hello Human')

开始构建:

使用本地模型构建,ollama本地模型下载安装部署见:

新建项目

Pycharm新建项目chatbots:(使用安装了库的conda环境)

新建文件chat_utils.py以及chat_main.py

构建chat_utils

代码及注释:

# 自定义模块, 完成: 智聊机器人的 后端功能实现, 即: 接收前端Streamlit网页传过来的信息, 通过ollama调用底层大模型获取回复, 并返回.
"""
    构建一个基于大模型的本地智能聊天机器人,利用其强大的自然语言处理和生成能力,为用户提供高效、精准、个性化的对话服务。
    该聊天机器人将集成先进的大规模预训练语言模型(如GPT、Qwen等),具备自然语言理解、多轮对话、情感分析、知识问答等核心功能,
    并可根据具体应用场景进行定制化扩展,例如客服咨询、教育辅导、娱乐互动等。
    项目采用模块化设计,前端通过Streamlit等框架实现简洁易用的交互界面,后端基于Ollama等平台进行模型部署和管理,确保系统的高效性和可扩展性。
"""
# 导包
import ollama


# todo 1.定义函数, 接收提示词(prompt), 调用模型, 获取回复(response)
# def get_response(prompt):
#     """
#     该函数功能: 接收提示词(prompt, 即: 用户提问的信息), 调用模型, 返回回复(response)信息
#     :param prompt: 提示词(prompt) -> 用户提问的问题
#     :return: 回复(response) -> 模型返回的答案
#     """
#     # 1. 调用大模型, 获取响应信息.
#     response = ollama.chat(model='qwen2:1.5b', messages=[{"role": "user", "content": prompt}])  # messages = prompt[-20:]
#
#     # 2. 解析响应信息, 获取模型生成的答案, 并返回.
#     return response['message']['content']


# todo 2. 优化上述的函数, 因为Streamlit前端传过来的数据格式是: [{'role':'user', 'content':'内容'}, {'role':'assistant', 'content':'内容'}...]
def get_response(prompt):
    """
    该函数功能: 接收提示词(prompt, 即: 用户提问的信息), 调用模型, 返回回复(response)信息
    :param prompt: 提示词(prompt) -> 用户提问的问题
    :return: 回复(response) -> 模型返回的答案
    """
    # 1. 调用大模型, 获取响应信息.
    if isinstance(prompt, str):
        messages = [{"role": "user", "content": prompt}]
    else:
        # 如果是消息列表,只保留最近20条记录
        messages = prompt[-20:]
    response = ollama.chat(model='qwen2:1.5b', messages=messages)  # 只关注最新的20条记录
    # response = ollama.chat(model='qwen2:1.5b', messages=prompt[-20:])  # 只关注最新的20条记录
    # response = ollama.chat(model='deepseek-r1:8b', messages=prompt[-20:])   # 只关注最新的20条记录

    # 2. 解析响应信息, 获取模型生成的答案, 并返回.
    return response['message']['content']


# todo 3. 测试上述的内容.
if __name__ == '__main__':
    # 1. 定义用户的问题.
    prompt = '你好你可以执行回答哪些问题?'
    # 2. 调用上述的函数, 获取模型回复结果.
    response = get_response(prompt)
    # 3. 打印结果
    print(response)

测试代码是否可以执行:

构建chat_main

完整代码:

# 自定义模块, 完成: 智聊机器人的 前端功能实现, 即: 接收用户录入的问题, 调用接口, 获取答案, 输出答案
# 导包
import streamlit as st
from chat_utils import get_response
from langchain_classic.memory import ConversationBufferMemory

# 1. 创建标题
st.title('基于Streamlit和Qwen2的智聊机器人')

# 2. 判断会话管理对象中 是否有 messages信息, 如果没有, 说明是第一次玩儿, 就加入: 欢迎词.
if 'memory' not in st.session_state:
    # ConversationBufferMemory对象: 会话历史管理对象, 可以在前端显示所有的对话(聊天记录)
    st.session_state['memory'] = ConversationBufferMemory()
    # 添加欢迎词
    st.session_state.messages = [
        {'role': 'assistant', 'content': '你好, 我是卷心菜狗, 有什么可以帮助你的吗?♥️'},
    ]

# 3. 遍历会话历史, 打印所有的会话信息.
for message in st.session_state.messages:
    # message: 就是具体的每条会话信息, 格式为:  {'role':'user', 'content':'你认识周杰伦吗?'} 或者 {'role':'assistant', 'content': '行, 都好哥们儿!'}
    # 3.1 根据角色创建会话信息.
    with st.chat_message(message['role']):
        # 3.2 输出会话信息
        st.write(message['content'])


# 4. 提示用户录入他/她的问题, 并接收.
prompt = st.chat_input('请输入你的问题: ')
# 5. 判断用户是否录入了问题, 如果不为空, 程序继续往下执行.
if prompt:
    # 6. 把用户录入的问题, 添加到会话历史中.
    st.session_state.messages.append({'role':'user', 'content':prompt})
    # 7. 显示用户录入的问题.
    st.chat_message("user").write(prompt)

    # 8. (可选)加入AI等待提示.
    with st.spinner('AI正在思考中...'):
        # 9. 把(历史对话信息)传给大模型, 获取模型的回复信息.
        content = get_response(st.session_state.messages)

    # 10. 把模型的回复信息添加到会话历史中, 并显示到前端.
    st.session_state.messages.append({'role':'assistant', 'content':content})
    st.chat_message("assistant").write(content)

测试功能:

新建命令框,输入命令:

 streamlit run .\chat_main.py

项目成功运行,快来自己玩一下吧

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐