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是实现会话功能,成型效果如下

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

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

相关推荐
蕤葳-几秒前
非编程背景学习AI的方法
人工智能
北京耐用通信3 分钟前
不换设备、不重写程序:耐达讯自动化网关如何实现CC-Link IE转Modbus TCP的高效互通?
人工智能·科技·物联网·网络协议·自动化·信息与通信
计算机毕业设计指导4 分钟前
基于机器学习和深度学习的恶意WebURL检测系统实战详解
人工智能·深度学习·机器学习·网络安全
珂朵莉MM5 分钟前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--多策略混合算法
人工智能·算法
GlobalInfo7 分钟前
2026-2032全球AI服务器连接器市场洞察:规模、竞争与趋势深度解析
人工智能
Elastic 中国社区官方博客11 分钟前
使用 Jina-VLM 小型多语言视觉语言模型来和图片对话
大数据·人工智能·elasticsearch·语言模型·自然语言处理·jina
罗西的思考12 分钟前
【OpenClaw】通过 Nanobot 源码学习架构---(6)Skills
人工智能·深度学习·算法
uzong12 分钟前
软件人员可以关注的 Skill,亲测确实不错,值得试一下
人工智能·后端
志栋智能13 分钟前
超自动化巡检:实现运维“事前预防”的关键拼图
大数据·运维·网络·人工智能·机器学习·自动化
枫叶林FYL15 分钟前
【自然语言处理 NLP】7.2 红队测试与对抗鲁棒性(Red Teaming & Adversarial Robustness)
人工智能·算法·机器学习