首先怎么调用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 = characterplaceholder 就类似于如果我们输入框什么也没写,就会提示词,而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是实现会话功能,成型效果如下

那么这些对话应该保存在哪?
内存中存放的数据在计算机关机后就会消失,要永久保存数据,就需要将数据保存在文件中。
page_title 和page_icon是这个效果
user对应上面,assistant对应下面便于区分

