AI虚拟伴侣配置:用Python脚本对接大模型实现角色对话
配置AI虚拟伴侣,核心不是从零训练模型,而是用脚本把角色设定、对话历史和大模型接口串成一个可重复运行的流程。
本文以Python脚本为例,演示如何配置一个能记住上下文的虚拟伴侣,并说明密钥管理、参数调整和常见报错的处理方式。
先明确你要的“伴侣”是哪种形态
AI虚拟伴侣的配置方式取决于使用场景。
如果你只是想快速体验,直接使用现成的聊天应用即可;
如果希望自定义角色性格、对话风格和记忆逻辑,就需要自己写脚本调用大模型API。
本文针对后者:通过Python脚本调用兼容OpenAI接口的大模型服务,实现角色对话。
开始前需要准备:
- 一台能运行Python 3.8及以上版本的电脑或服务器
- 一个大模型API密钥(以你实际使用的服务商为准)
- 基础命令行操作能力,知道如何安装依赖和运行脚本
- 一个文本编辑器,用于修改配置和提示词
配置脚本:把角色设定和对话历史拼进请求
创建一个工作目录,安装依赖:
mkdir ai-companion && cd ai-companion
python3 -m venv venv
source venv/bin/activate
pip install openai
新建 companion.py,写入以下示例。
代码中的 base_url 和 model 需要替换成你所用服务商的实际值:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("API_KEY"),
base_url="https://你的服务商接口地址/v1"
)
SYSTEM_PROMPT = "你是一个温和、耐心的虚拟伴侣,名字叫小满。回答要简短自然,每次不超过三句话。"
history = [{"role": "system", "content": SYSTEM_PROMPT}]
def chat(user_input):
history.append({"role": "user", "content": user_input})
# 只保留最近10轮对话,避免请求体过大
recent = history[-20:]
resp = client.chat.completions.create(
model="你的模型名称",
messages=recent,
temperature=0.8
)
reply = resp.choices[0].message.content
history.append({"role": "assistant", "content": reply})
return reply
if __name__ == "__main__":
while True:
text = input("你:")
if text.lower() in ("exit", "quit"):
break
print("小满:" + chat(text))
运行前设置环境变量,避免把密钥写死在代码里:
export API_KEY="你的API密钥"
python3 companion.py
预期结果是:输入一句话后,终端返回符合角色设定的回复;
连续对话时,模型能引用前面的内容。
调参和上下文管理的关键点
温度参数决定回复的随机性。
虚拟伴侣场景通常用0.7到0.9,太低会显得机械,太高容易跑题。
上下文长度需要控制。
示例中只保留最近20条消息,实际使用时可调整。
如果对话轮次很多,建议按token数截断,而不是固定条数,避免超出模型上限。
角色提示词要写具体。
与其写“你是一个好伴侣”,不如写清楚称呼、语气、回复长度和禁忌话题。
提示词越明确,角色越稳定。
常见报错和避坑说明
- 401 鉴权失败:检查
API_KEY环境变量是否生效,执行echo $API_KEY确认密钥已设置。 - 404 接口不存在:核对
base_url是否包含正确的路径,有些服务商要求结尾带/v1,有些不需要。 - 429 请求频率超限:降低调用频率,或检查账户余额和配额。
- 回复内容不符合角色:先检查
SYSTEM_PROMPT是否被后续消息覆盖,再适当降低温度。
避坑提醒:不要把API密钥提交到公开代码仓库;
脚本中的模型名称和接口地址必须与服务商文档一致,本文不保证某一特定服务商的可用性。
验证配置是否生效
完成配置后,按以下顺序检查:
- 单独运行一次脚本,输入“你好”,确认能收到回复。
- 连续输入两到三轮,观察模型是否记得前文。
- 故意输入超出角色设定的内容,确认回复仍在合理范围内。
- 查看终端是否有异常堆栈,根据报错信息定位问题。
如果以上步骤都能通过,说明基础的AI虚拟伴侣配置已经跑通。
后续可以在此基础上增加持久化存储、多角色切换或语音接口,按需扩展即可。