AI智能伴侣项目

首先怎么调用ai大模型

复制代码
import os
from openai import OpenAI

#创建与ai大模型交互的客户端
client = OpenAI(
    api_key=os.environ.get('DEEPSEEK_API_KEY'),
    base_url="https://api.deepseek.com")

#与AI大模型进行交互(参数)
response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "Hello"},
    ],
    stream=False
)

#输出大模型返回的结果
print(response.choices[0].message.content)  

至于为什么能返回结果,这是我们调用API时,返回的JSON数据是:

{

"choices": [

{

"message": {

"content": "Hello! How can I help you today?",

"role": "assistant"

}

}

]

}

设置页面的配置项

复制代码
#设置页面的配置项
st.set_page_config(
    page_title="AI智能伴侣",
    page_icon="💗",
    #布局
    layout="wide",
    #控制的式侧边栏的状态
    initial_sidebar_state="expanded",
    menu_items={}
)

page_title 和page_icon是这个效果

#大标题

st.title()

#消息输入框

st.char_input("请输入您要问的问题")

括号里面的是提示词
那怎么调用呢

复制代码
prompt = st.chat_input("请输入您要问的问题")

if prompt:   # 字符串会自动转换为布尔值,如果字符串为非空,则为True
    st.chat_message("user").write(prompt)
    print("----->调用AI大模型,提示词",prompt)

    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": sys_prompt},
            {"role": "user", "content": prompt},
        ],
        stream=False
    )

    print("<----------大模型返回的结果:",response.choices[0].message.content)
    st.chat_message("assistant").write(response.choices[0].message.content)

chat_input和chat_message是配对的。

其中 chat_message第一个参数不能乱用,每个名字会对应一种形式user对应上面,assistant对应下面便于区分

sys_prompt是设定一个角色,比如什么性格之类的

但是这串代码有个问题,做不到对话回滚的功能,也就是问一个答一个做不到,问答与上文连接

另外,还有问题

我们现在代码开头上添加一句

于是我们发现这一句话每次一次对话都会执行一次,那么就有问题了,也就是无法记录和缓存,只能进行单词对话,这就说明现在得不具备会话记忆得功能

https://docs.streamlit.io/develop/api-reference/caching-and-state/st.session_state

SessionState解决了这个问题

代码示例

Initialization

if 'key' not in st.session_state:

st.session_state['key'] = 'value'

Session State also supports attribute based syntax

if 'key' not in st.session_state:

st.session_state.key = 'value'

怎么展示之前的聊天记录

复制代码
st.session_state.messages.append({"role":"user","content":promp
st.session_state.messages.append({"role":"assistant","content":response.choices[0].message.content});

我们将他放进session_state.message里面然后每次for循环将之前访问的展示出来

复制代码
for message in st.session_state.messages:
    st.chat_message(message["role"]).write(message["content"])

这样效果就能达到

但是这只是把信息展示出来,并不能让ai做到联系上下文

接下来就是会话记忆问题(AI大模型本身没有真正的会话记忆功能)

我们其实上面已经用将每次对话存到列表里面了,那么我们只需要把每次对话的内容记录一下发送给ai的就能实现了。

复制代码
st.session_state.messages.append({"role":"user","content":prompt})
复制代码
st.session_state.messages.append({"role":"assistant","content":response.choices[0].message.content});

我们之前已经把内容存到ai里面了,那么每次对话我们都将并且是一个元组的形式,所以我们只需要解一下即可

复制代码
messages=[
    {"role": "system", "content": sys_prompt},
    *st.session_state.messages,
],将信息每次发给ai就行这样就会具有会话记忆的功能

流式输出:

我们一直有个参数 stream = false 这个参数代表这ai给我们的回答是一次行还是间断性,就是ai一下子回完我们还是一字字的回。

如果当stream = True,则是开启了流式输出,就跟网页版的deepseek一样了开始慢慢回答我,而不用让用户等那么久

stream=True之后我们的输出方式也得变一变,首先我们要先弄一个容器,st.empty()进行占位

复制代码
response_message=st.empty()
full_response = ""
for chunk in response:
    if chunk.choices[0].delta.content is not None:
        full_response += chunk.choices[0].delta.content
        response_message.chat_message("assistant").write(full_response)

st.session_state.messages.append({"role":"assistant","content":full_response})

为什么式 chunk.choices[0].delta.content

这里我解释下一[0] 为什么是:因为图中choice后面跟着[ ] 这是队列的意思,所以我们可以用chunk.choice[0].delta.content来找到ai回答得内容,最后进行拼接,放到容器里进行输出

接下里便是实现左侧右边栏的功能

st.sidebar.subheader()

文本框,一个小号,一个大号的

st.input_text()

st.input_area()

也就是我们要操作左侧边栏,那么我们要加上 siderbar这个东西

怎么做到文本框有个默认值

复制代码
nick_name = st.text_input("昵称",placeholder="请输入昵称",value=st.session_state.nick_name)
if nick_name:
   st.session_state.nick_name = nick_name
# 性格输入框
character = st.text_area("性格",placeholder="请输入性格",value=st.session_state.character)
if character:
   st.session_state.character = character

placeholder 就类似于如果我们输入框什么也没写,就会提示词,而value有值则会覆盖掉placeholder

另外如何提高随机性

复制代码
sys_prompt="""
       你叫%s,现在是用户的真实伴侣,请完全代入伴侣角色。:
       规则:
           1. 每次只回1条消息
           2. 禁止任何场景或状态描述性文字
           3. 匹配用户的语言
           4. 回复简短,像微信聊天一样
           5. 用符合伴侣性格的方式对话
           6. 回复的内容,要充分体现伴侣的性格特征:
            - %s
        你必须严格遵守上述规则来回复用户
"""j就像这样我们%s换成个固值那么ai的性格和名字固定,如何让他具有可变性,那就是用%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 "character" not in st.session_state:
    st.session_state.character = "活泼开朗的东北姑娘"
复制代码
nick_name = st.text_input("昵称",placeholder="请输入昵称",value=st.session_state.nick_name)
if nick_name:
   st.session_state.nick_name = nick_name
# 性格输入框
character = st.text_area("性格",placeholder="请输入性格",value=st.session_state.character)
if character:
   st.session_state.character = character

上面3个if则是默认值,如果我们输入则会进行代替

复制代码
messages=[
    {"role": "system", "content": sys_prompt %(st.session_state.nick_name,st.session_state.character)},
    *st.session_state.messages,
],

同时在发送请求的方案中

实现之后的效果

接下来就i是实现会话功能,成型效果如下

那么这些对话应该保存在哪?

内存中存放的数据在计算机关机后就会消失,要永久保存数据,就需要将数据保存在文件中。

相关推荐
Pyeako2 小时前
基于Qt和PaddleOCR的工业视觉识别报警系统开发
人工智能·python·深度学习·数码相机·opencv·ocr·pyqt5
wq8973872 小时前
[AI问答]Ubuntu 24.04 上 PyTorch的环境搭建
人工智能·pytorch·ubuntu
安逸sgr2 小时前
MCP 协议深度解析(八):Prompts 提示模板与 Sampling 采样机制!
人工智能·分布式·学习·语言模型·协议·mcp
东离与糖宝2 小时前
小米MiMo-V2-Pro开放调用,Java后端快速接入全流程实战
java·人工智能
balmtv2 小时前
GPT-5.4镜像实测:gpt技术拆解——当AI学会操控电脑
人工智能·gpt·电脑
大傻^2 小时前
Spring AI 2.0 生产部署指南:从 1.x 迁移、性能调优与云原生实践
人工智能·spring·云原生·springai
不懒不懒2 小时前
【机器学习模型评估:8种算法对比实战(本篇文章先介绍6种)】
人工智能·机器学习
ejjdhdjdjdjdjjsl2 小时前
halcon算子
人工智能·算法·计算机视觉
JEECG低代码平台2 小时前
JeecgBoot低代码 AI工作流变量聚合节点:多路数据择优合并与智能兜底方案
人工智能·低代码