好了,前面我们已经学习了streamlit的基本用法,现在,我们开始制作一个智能机器人伴侣。

AI插件安装

首先,我们要在pycharm上面安装AI插件,来帮助我们提高开发效率。

在pycharm点击:File>Settings>Plugins,在搜索框中输入:lingma,点击install。

注意:安装好后要重启pycharm

这样,在我们编程的时候就会给我们提示代码,我们只需要按TAB就可以使用代码,如果没有提示,可以按ALT+P!

基本页面布局

消息输入输出

代码:

import streamlit as st
import os
from openai import OpenAI

#设置页面配置项
st.set_page_config(
    #网页标题
    page_title="AI_智能伴侣",
    page_icon="a",
    #网页布局(wide/centered)
    layout="wide",
    #控制的是侧边栏的状态
    initial_sidebar_state="expanded",
    #点击页面右上角的三点按钮后,'Get Help','Report a bug', 'About'三个按钮的跳转页面
    menu_items={
        'Get Help': 'https://www.extremelycoolapp.com/help',
        'Report a bug': "https://www.extremelycoolapp.com/bug",
        'About': "# This is a header. This is an *extremely* cool app!"
    }
)

#大标题
st.title("AI_智能伴侣")

#logo
st.logo("./resource/logo.jpg")

#系统提示词
system_prompt = "你是一个温柔的猫娘!请用温柔可爱的语气与我对话!"

#创建一个与AI大模型交互的客户端对象(DEEPSEEK_API_KEY是环境变量的名字,值是Deepseek的API_KEY)
client = OpenAI(
    api_key=os.environ.get('DEEPSEEK_API_KEY'),
    base_url="https://api.deepseek.com")

#消息输入框
prompt = st.chat_input("请输入问题")
if prompt:
    st.chat_message("user").write(prompt)
    print("--------->调用AI大模型,提示词:",prompt)
    #调用AI大模型
    response = client.chat.completions.create(
        model="deepseek-v4-pro",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": prompt},
        ],
        stream=False,
        reasoning_effort="high",
        extra_body={"thinking": {"type": "enabled"}}
    )
    # 输出大模型返回的结果
    print("-------->大模型返回的结果:", response.choices[0].message.content)
    st.chat_message("assistant").write(response.choices[0].message.content)




结果:

页面消息展示

页面消息展示

由于每次提问都会重新刷新页面,我们还需要用到streamlit里面的session state。

我们需要将用户输入的提示词和AI返回的结果都保存在容器里面,每次提问都会把之前的记录遍历输出。

代码

#初始化聊天信息
if "messages" not in st.session_state:
    st.session_state.messages = []

#展示历史对话
for message in st.session_state.messages:
    st.chat_message(message["role"]).write(message["content"])

#消息输入框
prompt = st.chat_input("请输入问题")
if prompt:
    st.chat_message("user").write(prompt)
    print("--------->调用AI大模型,提示词:",prompt)
    #保存用户输入的提示词
    st.session_state.messages.append({"role":"user", "content":prompt})

    #调用AI大模型
    response = client.chat.completions.create(
        model="deepseek-v4-pro",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": prompt},
        ],
        stream=False,
        reasoning_effort="high",
        extra_body={"thinking": {"type": "enabled"}}
    )
    # 输出大模型返回的结果
    print("-------->大模型返回的结果:", response.choices[0].message.content)
    st.chat_message("assistant").write(response.choices[0].message.content)
    #保存大模型返回的结果
    st.session_state.messages.append({"role":"assistant", "content":response.choices[0].message.content})


结果

会话记忆问题

于AI大模型的交互本质是无状态的,每次请求都是独立的。

这就要求我们将历史对话消息列表在上传给AI,修改代码如下:

代码

    #调用AI大模型
    response = client.chat.completions.create(
        model="deepseek-v4-pro",
        messages=[
            {"role": "system", "content": system_prompt},
            *st.session_state.messages#展开历史对话消息列表,实现多轮对话上下文
        ],
        stream=False,
        reasoning_effort="high",
        extra_body={"thinking": {"type": "enabled"}}
    )

结果

完整代码

import streamlit as st
import os
from openai import OpenAI

#设置页面配置项
st.set_page_config(
    #网页标题
    page_title="AI_智能伴侣",
    page_icon="a",
    #网页布局(wide/centered)
    layout="wide",
    #控制的是侧边栏的状态
    initial_sidebar_state="expanded",
    #点击页面右上角的三点按钮后,'Get Help','Report a bug', 'About'三个按钮的跳转页面
    menu_items={
        'Get Help': 'https://www.extremelycoolapp.com/help',
        'Report a bug': "https://www.extremelycoolapp.com/bug",
        'About': "# This is a header. This is an *extremely* cool app!"
    }
)

#大标题
st.title("AI_智能伴侣")

#logo
st.logo("./resource/logo.jpg")

#系统提示词
system_prompt = "你是一个温柔的猫娘!请用温柔可爱的语气与我对话!"

#初始化聊天信息
if "messages" not in st.session_state:
    st.session_state.messages = []

#展示历史对话
for message in st.session_state.messages:
    st.chat_message(message["role"]).write(message["content"])
    #if message["role"] == "user":
     #   st.chat_message("user").write(message["content"])
    #else:
     #   st.chat_message("assistant").write(message["content"])

#创建一个与AI大模型交互的客户端对象(DEEPSEEK_API_KEY是环境变量的名字,值是Deepseek的API_KEY)
client = OpenAI(
    api_key=os.environ.get('DEEPSEEK_API_KEY'),
    base_url="https://api.deepseek.com")

#消息输入框
prompt = st.chat_input("请输入问题")
if prompt:
    st.chat_message("user").write(prompt)
    print("--------->调用AI大模型,提示词:",prompt)
    #保存用户输入的提示词
    st.session_state.messages.append({"role":"user", "content":prompt})

    #调用AI大模型
    response = client.chat.completions.create(
        model="deepseek-v4-pro",
        messages=[
            {"role": "system", "content": system_prompt},
            *st.session_state.messages#展开历史对话消息列表,实现多轮对话上下文
        ],
        stream=False,
        reasoning_effort="high",
        extra_body={"thinking": {"type": "enabled"}}
    )
    # 输出大模型返回的结果
    print("-------->大模型返回的结果:", response.choices[0].message.content)
    st.chat_message("assistant").write(response.choices[0].message.content)
    #保存大模型返回的结果
    st.session_state.messages.append({"role":"assistant", "content":response.choices[0].message.content})




Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐