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

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

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

相关推荐
数智化精益手记局6 小时前
拆解物料管理erp系统的核心功能,看物料管理erp系统如何解决库存积压与缺料难题
大数据·网络·人工智能·安全·信息可视化·精益工程
Flying pigs~~6 小时前
RAG 完整面试指南:原理、优化、幻觉解决方案
人工智能·prompt·rag·智能体·检索增强生成·rag优化
博.闻广见6 小时前
AI_概率统计-2.常见分布
人工智能·机器学习
企业架构师老王6 小时前
2026制造业安全生产隐患识别AI方案:从主流产品对比看企业级AI Agent的非侵入式落地路径
人工智能·安全·ai
Aleeeeex6 小时前
RAG 那点事:从 8 份企业文档到能用的问答系统,全过程拆给你看
人工智能·python·ai编程
冬奇Lab6 小时前
一天一个开源项目(第87篇):Tank-OS —— Red Hat 工程师用一个周末,把 AI Agent 塞进了一个可启动的 Linux 镜像
人工智能·开源·资讯
小糖学代码6 小时前
LLM系列:2.pytorch入门:8.神经网络的损失函数(criterion)
人工智能·深度学习·神经网络
Captaincc7 小时前
转发-中央网信办部署开展“清朗·整治AI应用乱象”专项行动
人工智能·vibecoding
AI自动化工坊7 小时前
Late框架技术深度解析:5GB VRAM实现10倍AI编码效率的工程架构
人工智能·5g·架构·ai编程·late
我是大聪明.7 小时前
DeepSeek V4 Pro + 华为昇腾910:国产大模型落地的性能实测与深度解析
人工智能·华为