一、AI应用-概述

  • 全称:大语言模型(Large Language Models, LLM)

  • 本质:一种通过代码与算法模拟人脑神经网络的计算机程序

  • 参数量级:通常达到数十亿至数千亿级别

  • 核心能力:通过大规模数据训练,具备以下能力:

    • 理解人类语言

    • 进行逻辑思考与推理

    • 生成符合语境的语言输出

AI应用:是指将AI大模型技术落地到具体的业务场景中,用来解决实际问题的产品或服务。

二、AI应用-基础

1.大模型的部署-本地部署

Ollama是一个在本地运行、管理大语言模型的工具。官网:

https://ollama.com/

默认安装:

下载后双击即可安装,默认是安装在C盘的,具体目录如下:

  • 默认安装后目录:C:\Users\用户名\AppData\Local\Programs\Ollama

  • 默认安装模型目录:C:\Users\用户名\.ollama

  • 默认配置文件目录:C:\Users\用户名\AppData\Local\Ollama

自定义安装:

1.命令行安装

OllamaSetup.exe所在目录打开cmd命令行,然后输入命令:

OllamaSetup.exe /DIR=你要安装的目录位置

例:OllamaSetup.exe /DIR=D:\ollama

2.配置环境变量

安装完成后,还要配置环境变量,更改Ollama下载和部署模型的位置。环境变量如下:

OLLAMA_MODELS=你要保存下载模型的目录

环境变量配置如下图:

然后进行部署大模型,这里选择的是deepseek-r1,可以根据自己的电脑显存来选择部署哪个。

deepseek-r1链接:https://ollama.com/library/deepseek-r1

需要几分钟,部署完成

Ollama 命令概览

基本使用

ollama [flags] # 带标志运行
ollama [command] # 执行命令

可用命令

命令 说明
serve 启动 Ollama 服务(后台运行)
create 创建自定义模型(基于现有模型修改)
show 查看模型信息(配置、参数等)
run 运行一个模型(下载并启动对话)
stop 停止正在运行的模型
pull 从模型仓库拉取模型到本地
push 将本地模型推送到仓库(如 ollama.com
signin 登录 ollama.com 账户
signout 退出登录
list 列出本地已下载的模型
ps 列出当前正在运行的模型
cp 复制一个模型(创建副本)
rm 删除本地模型
launch 启动与 Ollama 的集成(如 Docker 镜像)
help 查看命令帮助

全局标志

  • -h, --help:查看帮助信息

  • -v, --version:显示版本信息

获取详细帮助

ollama [command] --help # 查看具体命令的详细用法

2.大模型的调用-官方API

1.网络基础知识

1.IP 地址
1. 定义
  • IP地址是联网设备在互联网中的唯一标识,用于定位设备位置。

  • 相当于设备的“互联网身份证”。

2. IPv4 地址
  • 由 32位二进制数 组成,通常以点分十进制表示。

  • 格式:xxx.xxx.xxx.xxx(每个 xxx 范围为 0–255)。

  • 示例:

    • 十进制:132.12.86.125

    • 二进制:10000100.00001100.01010110.01111101

3. IPv6 地址
  • 由 128位二进制数 组成,用于解决 IPv4 地址耗尽问题。

  • 格式为八组十六进制数,如:2001:0db8:85a3:0000:0000:8a2e:0370:7334

4. 特殊 IP 地址
  • 127.0.0.1:本地回环地址,指向本机,常用于本地测试。


2.域名与 DNS
1. 域名
  • 由一串用点分隔的英文字母组成,便于人类记忆。

  • 示例:www.baidu.com

2. DNS(域名解析服务器)
  • 作用:将域名转换为对应的 IP 地址。

  • 工作流程:

用户输入域名 → DNS 查询 → 返回 IP 地址 → 访问目标服务器

  • 示例:

    • 域名:www.baidu.com

    • 对应 IP:110.242.69.21

3. 多 IP 映射
  • 一个域名可对应多个 IP 地址,实现负载均衡与容灾。

示例:百度可能对应多个服务器 IP: 110.242.69.21

                                                            103.217.86.45

                                                            183.62.66.173

                                                             ...


3.端口号
1. 定义
  • 端口号是 0–65535 之间的整数,用于标识设备中运行的程序(服务)。

  • 一个 IP 地址 + 一个端口号 = 一个具体的网络服务。

2. 常见端口
  • 80:HTTP(网页浏览)

  • 443:HTTPS(加密网页)

  • 22:SSH(安全登录)

  • 3306:MySQL 数据库

3. 完整访问格式

协议://域名(或IP):端口


4.网络访问流程示例

用户输入:www.baidu.com

        ↓

DNS 解析为:110.242.69.21

        ↓

通过端口 443(HTTPS)访问

        ↓

到达百度服务器,返回网页内容

2.网络模型

1. 为什么需要网络模型
  • 互联网连接数十亿设备,需要统一标准确保数据有序传输

  • 类似城市交通系统需要交通规则来管理车流

  • ISO国际标准化组织制定了网络通信的统一标准

2. 两种主要网络模型
  • OSI七层模型:理论标准模型,全球网络互连基准

  • TCP/IP四层模型:实际应用模型,OSI的简化实用版本

3.HTTP协议
1. 基本概念
  • 全称:Hyper Text Transfer Protocol(超文本传输协议)

  • 作用:规定客户端和服务器之间数据传输的规则

  • 核心:统一的请求-响应格式,确保通信双方能相互理解

2. HTTP工作模型

3.Apifox测试

按照以下代码,在Apifox填写测试

curl https://api.deepseek.com/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${DEEPSEEK_API_KEY}" \
  -d '{
        "model": "deepseek-chat",
        "messages": [
          {"role": "system", "content": "You are a helpful assistant."},
          {"role": "user", "content": "Hello!"}
        ],
        "stream": false
      }'

4.会话记忆(会话历史滚雪球)

单次请求是没有记忆的,因此需要会话记忆来衔接之前的对话

5.调用本地部署的大模型

6.代码调用大模型

需要自行配置DEEPSEEK_API_KEY环境变量,另外需要安装openai的包。

如何安装第三方的软件包?

  • 安装软件包(最新版):pip install openai

  • 安装软件包(指定版本):pip install openai=2.13.0

  • 卸载软件包:pip uninstall openai

  • 列出已安装的包:pip list

  • 查看包详情:pip show openai

import os
from openai import OpenAI
# 创建OpenAI客户端
client = OpenAI(api_key=os.environ.get('DEEPSEEK_API_KEY'),
    base_url="https://api.deepseek.com")
# 创建聊天
response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "你是一个AI助手,请用专业的语言来回答问题!"},
        {"role": "user", "content": "你可以帮我干什么?"},
    ],
    stream=False
)
# 输出聊天结果
print(response.choices[0].message.content)

3.提示词工程

提示词工程,简单来说,就是精心设计和优化输入给AI的指令或问题(即“提示词”),以引导AI生成更准确、相关、高质量或符合特定需求的输出的过程。

你可以把它理解为:

  • 对用户而言:是与AI高效沟通的艺术和科学。

  • 对开发者而言:是开发和优化AI应用的核心技能。

为什么它如此重要?

  1. Garbage In, Garbage Out:AI非常强大,但它的输出质量极大地依赖于你输入的质量。模糊的问题会得到模糊的答案,精准的提问才能获得精准的结果。

  2. 解锁AI的全部潜力:好的提示词能激发模型更深层次的推理、创造和组织能力,而不仅仅是浅层的问答。

  3. 节省时间和成本:一次到位的提示,可以避免反复修改、重新生成,大大提高工作效率。

  4. 实现复杂任务:通过特定的提示技巧,可以让AI扮演角色、分步思考、遵循特定格式等,完成写代码、创作剧本、数据分析等复杂工作。

提示词工程的核心原则与技巧

  1. 清晰具体:避免模糊。明确你想要什么,包括长度、格式、风格、受众等。
    例如:不说“总结文章”,而说“用三个要点总结这篇文章的核心论点,每点不超过20字。”

  2. 提供上下文和角色:给AI一个“身份”,能显著改变其回应方式。
    例如:“你是一位经验丰富的产品经理...”、“你是一位幽默的脱口秀编剧...”

  3. 使用结构化和分隔符:用“###”、“””、序号等将指令、背景、输入数据分开,帮助AI更好地理解结构。
    例如:背景:{这里放背景信息} 问题:{这里放具体问题} 要求:{这里放格式要求}

  4. 分步思考(Chain-of-Thought):对于复杂问题,引导AI一步步推理,而不是直接要答案。例如:“请按以下步骤解答:首先,分析问题中的关键数据;其次,确定适用的公式;最后,计算出结果并检查。”

  5. 提供示例(Few-Shot Learning):给出1-2个输入输出的例子,让AI快速模仿你想要的格式和风格。

  6. 迭代优化:很少有提示词能一次完美。根据AI的第一次回复,调整你的提示词,不断优化。

三、AI应用-实战(聊天助手)

1.Streamlit

Streamlit是一个开源Python库,专为数据工程师及机器学习工程师设计,用来快速基于Python代码构建交互式的web网站。

官方网站:

https://streamlit.io/

  • 安装streamlit:pip install streamlit

  • 在python文件中引入streamlit模块

  • 基于streamlit中提供的API构建Web应用

  • 运行程序:streamlit run xxx.py

1.入门示例

import streamlit as st

# 标题
st.title('大标题')
st.header('一级标题')
st.subheader('二级标题')

2.基础用法

官方API:

https://docs.streamlit.io/develop/api-reference

import streamlit as st
# 设置页面配置
st.set_page_config(
    page_title="streamlit入门",
    page_icon="🧊",
    # 页面布局
    layout="wide",
    # 侧边栏状态
    initial_sidebar_state="expanded",
    menu_items={
        'Get Help': 'https://www.extremelycoolapp.com/help',
        'Report a bug': "https://www.extremelycoolapp.com/bug",
        'About': "# 这是一个页面简介"
    }
)
# 标题
st.title('大标题')
st.header('一级标题')
st.subheader('二级标题')
# 段落文字
st.write('段落文字zzzzzzzzzzzzzzzzzzzzzzzzzzzzz')
st.write('段落文字2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
# 图片
st.image('https://docs.streamlit.io/images/api/image.jpg',width=300)
# 音频
st.audio('https://www123.mp3')
# 视频
st.video('https://files.youth.cn/video/zq_video/202601/P020260126366754940955.mp4')
# logo
st.logo('https://static.streamlit.io/examples/cat.jpg')
# 表格
people_data={'name':['张三','李四'],'age':[18,19],'sex':['男','女']}
st.table(people_data)
# 输入框
# https://docs.streamlit.io/develop/api-reference/widgets/st.text_input
name = st.text_input('请输入你的名字:')
st.write('你的名字是:',name)
password = st.text_input('请输入你的密码:',type='password')
st.write('你的密码是:',password)
# 单选按钮
sex = st.radio('请选择你的性别:',('男','女'))

2.交互功能

emoji表情包网站:https://emoji8.com/zh-hans/

1.会话记忆

通过session_state来进行缓存,存储方式字典方式。

import streamlit as st
import os
from openai import OpenAI
st.set_page_config(
    page_title="AI聊天助手",
    page_icon="🎇",
    layout="wide",
    initial_sidebar_state="expanded",
    menu_items={
    }
)
# 标题
st.title('AI聊天助手')
# logo
st.logo('aislogo.png')
# 系统提示词
system_prompt = "你是一个AI助手,请用柔和可爱的语气来回答问题!"
# 存储聊天记录
if 'messages' not in st.session_state:
    st.session_state.messages = []
# 显示聊天记录
for message in st.session_state['messages']:
    # if message['role'] == 'user':
    #     st.chat_message("user").write(message['content'])
    # else:
    #     st.chat_message("assistant").write(message['content'])
    st.chat_message(message['role']).write(message['content'])
# 输入框
prompt = st.chat_input("请输入你的问题:")
if prompt:# 字符串会转为布尔值,如果字符串非空,则返回True
    st.chat_message("user").write(prompt)
    print("-------->调用AI大模型,prompt:", prompt)
    # 添加用户输入
    st.session_state['messages'].append({"role": "user", "content": prompt})

    #调用AI大模型
    client = OpenAI(api_key=os.environ.get('DEEPSEEK_API_KEY'),
                    base_url="https://api.deepseek.com")
    # 创建聊天
    print("-------->创建聊天")
    print([
        {"role": "system", "content": system_prompt},
        *st.session_state.messages
    ])
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system_prompt},
            *st.session_state.messages # 解包,对话记录
        ],
        stream=False
    )
    print("<--------大模型返回消息",response.choices[0].message.content)
    st.chat_message("assistant").write(response.choices[0].message.content)
    # 添加AI大模型返回
    st.session_state['messages'].append({"role": "assistant", "content": response.choices[0].message.content})

2.流式输出

在进行流式输出时,大模型是一次返回几个字,需要进行字符串拼接,通过一个容器response_message来维护这个字符串。

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": system_prompt},
        *st.session_state.messages # 解包,对话记录
    ],
    stream=True
)
# print("<--------大模型返回消息",response.choices[0].message.content)
# st.chat_message("assistant").write(response.choices[0].message.content)
# # 添加AI大模型返回
# st.session_state['messages'].append({"role": "assistant", "content": response.choices[0].message.content})

# 输出大模型返回结果(流式输出)
response_message=st.empty()
full_response=""
for chunk in response:
    if chunk.choices[0].delta.content is not None:
        context=chunk.choices[0].delta.content
        full_response+=context
        response_message.chat_message("assistant").write(full_response)
# 输出保存大模型返回结果
st.session_state.messages.append({"role": "assistant", "content": full_response})

3.侧边栏功能

API:

https://docs.streamlit.io/develop/api-reference/layout/st.sidebar

import streamlit as st
import os
from openai import OpenAI
st.set_page_config(
    page_title="AI聊天助手",
    page_icon="🎇",
    layout="wide",
    initial_sidebar_state="expanded",
    menu_items={
    }
)
# 标题
st.title('AI聊天助手')
# logo
st.logo('aislogo.png')
# 系统提示词
system_prompt = """
叮咚!你的亲密聊天助手已上线~
我叫 %s
风格:贴心,像学霸一样靠谱,语气像草莓奶盖一样绵绵的!
我会:
1️.用🌈表情包和比喻让答案活起来
2️.把复杂问题拆成“小饼干步骤”
3. 悄悄记住你的偏好
4.用符合亲密朋友的方式对话
5.回复的内容要充分体现亲密朋友性格特征
助手性格:
    -%s
"""
# 存储聊天记录
if 'messages' not in st.session_state:
    st.session_state.messages = []
# 历史昵称
if 'nick_name' not in st.session_state:
    st.session_state.nick_name = "小熊"
# 历史性格
if 'nature' not in st.session_state:
    st.session_state.nature = "一个温柔可爱的中国姑娘"
# 显示聊天记录
for message in st.session_state['messages']:
    # if message['role'] == 'user':
    #     st.chat_message("user").write(message['content'])
    # else:
    #     st.chat_message("assistant").write(message['content'])
    st.chat_message(message['role']).write(message['content'])

# 侧边栏
with st.sidebar:
    st.subheader("助手信息")
    nick_name=st.text_input("昵称",placeholder="请输入昵称",value=st.session_state.nick_name)
    if nick_name:
        st.session_state.nick_name = nick_name
    nature=st.text_area("性格",placeholder="请输入性格",value=st.session_state.nature)
    if nature:
        st.session_state.nature = nature
# 输入框
prompt = st.chat_input("请输入你的问题:")
if prompt:
    st.chat_message("user").write(prompt)
    print("-------->调用AI大模型,prompt:", prompt)
    # 添加用户输入
    st.session_state['messages'].append({"role": "user", "content": prompt})

    #调用AI大模型
    client = OpenAI(api_key=os.environ.get('DEEPSEEK_API_KEY'),
                    base_url="https://api.deepseek.com")
    # 创建聊天
    print("-------->创建聊天")
    print([
        {"role": "system", "content": system_prompt},
        *st.session_state.messages
    ])
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system_prompt % (st.session_state.nick_name,st.session_state.nature)},
            *st.session_state.messages # 解包,对话记录
        ],
        stream=True
    )
    response_message=st.empty()
    full_response=""
    for chunk in response:
        if chunk.choices[0].delta.content is not None:
            context=chunk.choices[0].delta.content
            full_response+=context
            response_message.chat_message("assistant").write(full_response)
    st.session_state.messages.append({"role": "assistant", "content": full_response})

4.会话存储

1.json格式存储

import json

# json数据
user={
    "name":"张三",
    "age":18,
    "sex":"男"
}
# 写入json文件
with open("user.json","w",encoding="utf-8") as f:
    json.dump(user,f,ensure_ascii=False,indent=2)
    # ensure_ascii = False 保存原样,True 保存ASCII编码
    # indent=2 缩进
    print("写入成功")

# 读取json文件
with open("user.json","r",encoding="utf-8") as f:
    user=json.load(f)
    print(user)
    print(type(user))

2.新建会话

import streamlit as st
import os
from openai import OpenAI
import datetime
import json
st.set_page_config(
    page_title="AI聊天助手",
    page_icon="🎇",
    layout="wide",
    initial_sidebar_state="expanded",
    menu_items={
    }
)
def create_session_id():
    return datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
def save_sessions():
    if st.session_state.session_id:
        # 构建新的会话
        session_data = {
            "session_id": st.session_state.session_id,
            "nick_name": st.session_state.nick_name,
            "nature": st.session_state.nature,
            "messages": st.session_state.messages
        }
        # 如果sessions不存在,则创建一个新文件
        if not os.path.exists("sessions"):
            os.mkdir("sessions")
        # 保存会话数据
        with open(f"sessions/{st.session_state.session_id}.json", "w", encoding="utf-8") as f:
            json.dump(session_data, f, ensure_ascii=False, indent=2)
            print("保存成功")
# 标题
st.title('AI聊天助手')
# logo
st.logo('aislogo.png')
# 系统提示词
system_prompt = """
叮咚!你的亲密聊天助手已上线~
我叫 %s
风格:贴心,像学霸一样靠谱,语气像草莓奶盖一样绵绵的!
我会:
1️.用🌈表情包和比喻让答案活起来
2️.把复杂问题拆成“小饼干步骤”
3. 悄悄记住你的偏好
4.用符合亲密朋友的方式对话
5.回复的内容要充分体现亲密朋友性格特征
助手性格:
    -%s
"""
# 存储聊天记录
if 'messages' not in st.session_state:
    st.session_state.messages = []
# 历史昵称
if 'nick_name' not in st.session_state:
    st.session_state.nick_name = "小熊"
# 历史性格
if 'nature' not in st.session_state:
    st.session_state.nature = "一个温柔可爱的中国姑娘"

# 会话标识
if 'session_id' not in st.session_state:
    st.session_state.session_id = create_session_id()
# 显示聊天记录
for message in st.session_state['messages']:
    # if message['role'] == 'user':
    #     st.chat_message("user").write(message['content'])
    # else:
    #     st.chat_message("assistant").write(message['content'])
    st.chat_message(message['role']).write(message['content'])

# 侧边栏
with st.sidebar:
    # 会话信息
    st.subheader("助手设置面板")
    # 新建会话
    if st.button("新建会话",use_container_width= True,icon="📖"):
        # 保存当前会话
        save_sessions()
        # 重置创建新会话
        if st.session_state.messages:
            st.session_state.messages = []
            st.session_state.nick_name = ""
            st.session_state.nature = ""
            st.session_state.session_id = create_session_id()
            save_sessions()
            st.rerun()  # 重新运行当前页面使对话框清空

    st.subheader("助手信息")
    nick_name=st.text_input("昵称",placeholder="请输入昵称",value=st.session_state.nick_name)
    if nick_name:
        st.session_state.nick_name = nick_name
    nature=st.text_area("性格",placeholder="请输入性格",value=st.session_state.nature)
    if nature:
        st.session_state.nature = nature




# 输入框
prompt = st.chat_input("请输入你的问题:")
if prompt:# 字符串会转为布尔值,如果字符串非空,则返回True
    st.chat_message("user").write(prompt)
    print("-------->调用AI大模型,prompt:", prompt)
    # 添加用户输入
    st.session_state['messages'].append({"role": "user", "content": prompt})

    #调用AI大模型
    client = OpenAI(api_key=os.environ.get('DEEPSEEK_API_KEY'),
                    base_url="https://api.deepseek.com")
    # 创建聊天
    print("-------->创建聊天")
    print([
        {"role": "system", "content": system_prompt},
        *st.session_state.messages
    ])
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system_prompt % (st.session_state.nick_name,st.session_state.nature)},
            *st.session_state.messages # 解包,对话记录
        ],
        stream=True
    )
    response_message=st.empty()
    full_response=""
    for chunk in response:
        if chunk.choices[0].delta.content is not None:
            context=chunk.choices[0].delta.content
            full_response+=context
            response_message.chat_message("assistant").write(full_response)
    # 输出保存大模型返回结果
    st.session_state.messages.append({"role": "assistant", "content": full_response})

3.展示会话列表

# 侧边栏
with st.sidebar:
    # 会话信息
    st.subheader("助手设置面板")
    # 新建会话
    if st.button("新建会话",use_container_width= True,icon="📖"):
        # 保存当前会话
        save_sessions()
        # 重置创建新会话
        if st.session_state.messages:
            st.session_state.messages = []
            st.session_state.nick_name = ""
            st.session_state.nature = ""
            st.session_state.session_id = create_session_id()
            save_sessions()
            st.rerun()  # 重新运行当前页面使对话框清空
    # 历史会话
    st.subheader("历史会话")
    session_list = load_sessions()
    for session in session_list:
        col1, col2 =st.columns([4,1])
        with col1:
            if st.button(session,use_container_width= True,icon="🗒️",key=f"load_{session}"):
                pass
        with col2:
            if st.button("",use_container_width= True,icon="❌",key=f"delete_{session}"):
                pass

    st.subheader("助手信息")
    nick_name=st.text_input("昵称",placeholder="请输入昵称",value=st.session_state.nick_name)
    if nick_name:
        st.session_state.nick_name = nick_name
    nature=st.text_area("性格",placeholder="请输入性格",value=st.session_state.nature)
    if nature:
        st.session_state.nature = nature

4.会话删除

# 删除会话
def delete_session(session_id):
    try:
        if os.path.exists(f"sessions/{session_id}.json"):
            os.remove(f"sessions/{session_id}.json")
            print("删除成功")
            if session_id == st.session_state.session_id:
                st.session_state.session_id = create_session_id()
                st.session_state.messages = []
    except Exception as e:
        st.error("删除会话信息失败!"+e)
#...
# 历史会话
st.subheader("历史会话")
save_sessions()
session_list = load_sessions()
if not session_list:
    st.info("没有历史会话")
for session in session_list:
    col1, col2 =st.columns([5,1])
    with col1:
        if st.button(session,use_container_width= True,icon="🗒️",key=f"load_{session}",type="primary" if session==st.session_state.session_id else "secondary"):
            load_session(session)
            st.rerun()
    with col2:
        if st.button("",use_container_width= True,icon="❌",key=f"delete_{session}"):
            delete_session(session)

5.完整代码

import streamlit as st
import os
from openai import OpenAI
import datetime
import json
st.set_page_config(
    page_title="AI聊天助手",
    page_icon="🎇",
    layout="wide",
    initial_sidebar_state="expanded",
    menu_items={
    }
)
def create_session_id():
    return datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
def save_sessions():
    if st.session_state.session_id:
        # 构建新的会话
        session_data = {
            "session_id": st.session_state.session_id,
            "nick_name": st.session_state.nick_name,
            "nature": st.session_state.nature,
            "messages": st.session_state.messages
        }
        # 如果sessions不存在,则创建一个新文件
        if not os.path.exists("sessions"):
            os.mkdir("sessions")
        # 保存会话数据
        with open(f"sessions/{st.session_state.session_id}.json", "w", encoding="utf-8") as f:
            json.dump(session_data, f, ensure_ascii=False, indent=2)
            print("保存成功")
# 加载所有的会话
def load_sessions():
    # 加载所有会话
    if not os.path.exists("sessions"):
        return
    session_list = []
    for filename in os.listdir("sessions"):
        if filename.endswith(".json"):
            session_list.append(filename.replace(".json", ""))
    session_list.sort(reverse=True)
    return session_list
#加载指定会话信息
def load_session(session_id):
    try:
        if os.path.exists(f"sessions/{session_id}.json"):
            with open(f"sessions/{session_id}.json", "r", encoding="utf-8") as f:
                session_data = json.load(f)
                st.session_state.messages = session_data['messages']
                st.session_state.nick_name = session_data['nick_name']
                st.session_state.nature = session_data['nature']
                st.session_state.session_id = session_data['session_id']
    except Exception as e:
        st.error("加载会话信息失败!"+e)

# 删除会话
def delete_session(session_id):
    try:
        if os.path.exists(f"sessions/{session_id}.json"):
            os.remove(f"sessions/{session_id}.json")
            print("删除成功")
            if session_id == st.session_state.session_id:
                st.session_state.session_id = create_session_id()
                st.session_state.messages = []
    except Exception as e:
        st.error("删除会话信息失败!"+e)


# 标题
st.title('AI聊天助手')
# logo
st.logo('aislogo.png')
# 系统提示词
system_prompt = """
叮咚!你的亲密聊天助手已上线~
我叫 %s
风格:贴心,像学霸一样靠谱,语气软绵绵的!
我会:
1️.用🌈表情包和比喻让答案活起来
2️.把复杂问题拆成简单问题
3. 悄悄记住你的偏好
4.用符合亲密朋友的方式对话
5.回复的内容要充分体现亲密朋友性格特征
助手性格:
    -%s
"""
# 存储聊天记录
if 'messages' not in st.session_state:
    st.session_state.messages = []
# 历史昵称
if 'nick_name' not in st.session_state:
    st.session_state.nick_name = "小美"
# 历史性格
if 'nature' not in st.session_state:
    st.session_state.nature = "一个温柔可爱的中国姑娘"

# 会话标识
if 'session_id' not in st.session_state:
    st.session_state.session_id = create_session_id()
# 显示聊天记录
st.text(f"会话名称:{st.session_state.session_id}")
for message in st.session_state['messages']:
    # if message['role'] == 'user':
    #     st.chat_message("user").write(message['content'])
    # else:
    #     st.chat_message("assistant").write(message['content'])
    st.chat_message(message['role']).write(message['content'])

# 侧边栏
with st.sidebar:
    # 会话信息
    st.subheader("助手设置面板")
    # 新建会话
    if st.button("新建会话",use_container_width= True,icon="📖"):
        # 保存当前会话
        save_sessions()
        # 重置创建新会话
        if st.session_state.messages:
            st.session_state.messages = []
            st.session_state.nick_name = ""
            st.session_state.nature = ""
            st.session_state.session_id = create_session_id()
            save_sessions()
            st.rerun()  # 重新运行当前页面使对话框清空
    # 历史会话
    st.subheader("历史会话")
    save_sessions()
    session_list = load_sessions()
    if not session_list:
        st.info("没有历史会话")
    for session in session_list:
        col1, col2 =st.columns([5,1])
        with col1:
            if st.button(session,use_container_width= True,icon="🗒️",key=f"load_{session}",type="primary" if session==st.session_state.session_id else "secondary"):
                load_session(session)
                st.rerun()
        with col2:
            if st.button("",use_container_width= True,icon="❌",key=f"delete_{session}"):
                delete_session(session)

    # 分割线
    st.divider()
    st.subheader("助手信息")
    nick_name=st.text_input("昵称",placeholder="请输入昵称",value=st.session_state.nick_name)
    if nick_name:
        st.session_state.nick_name = nick_name
    nature=st.text_area("性格",placeholder="请输入性格",value=st.session_state.nature)
    if nature:
        st.session_state.nature = nature




# 输入框
prompt = st.chat_input("请输入你的问题:")
if prompt:# 字符串会转为布尔值,如果字符串非空,则返回True
    st.chat_message("user").write(prompt)
    print("-------->调用AI大模型,prompt:", prompt)
    # 添加用户输入
    st.session_state['messages'].append({"role": "user", "content": prompt})

    #调用AI大模型
    client = OpenAI(api_key=os.environ.get('DEEPSEEK_API_KEY'),
                    base_url="https://api.deepseek.com")
    # 创建聊天
    print("-------->创建聊天")
    print([
        {"role": "system", "content": system_prompt},
        *st.session_state.messages
    ])
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system_prompt % (st.session_state.nick_name,st.session_state.nature)},
            *st.session_state.messages # 解包,对话记录
        ],
        stream=True
    )
    # print("<--------大模型返回消息",response.choices[0].message.content)
    # st.chat_message("assistant").write(response.choices[0].message.content)
    # # 添加AI大模型返回
    # st.session_state['messages'].append({"role": "assistant", "content": response.choices[0].message.content})

    # 输出大模型返回结果(流式输出)
    response_message=st.empty()
    full_response=""
    for chunk in response:
        if chunk.choices[0].delta.content is not None:
            context=chunk.choices[0].delta.content
            full_response+=context
            response_message.chat_message("assistant").write(full_response)
    # 输出保存大模型返回结果
    st.session_state.messages.append({"role": "assistant", "content": full_response})
    # 保存会话
    save_sessions()

页面效果如下:

拜拜!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐