文章目录
特别提醒:唯一需要改动的地方为代码中的api_key,可前往deepseek开放平台获取------ 点击前往
项目介绍
该项目是一个基于大语言模型的智能情绪支持代理,通过专业的系统提示词设计,赋予AI情绪识别、深度共情和多轮对话能力,旨在为用户提供温暖而有边界的情感支持。其技术核心在于利用LangChain框架构建了包含对话历史管理的处理链,通过RunnableWithMessageHistory自动维护会话上下文,确保交流的连贯性与个性化,并以模块化的类结构实现了从用户输入到情感化响应的完整闭环,在提供心理支持的同时严格遵守AI的专业伦理边界。

完整代码
emotional_support_agent
python
import os
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain.chat_models import init_chat_model
os.environ["DEEPSEEK_API_KEY"] = "改成自己的api_key"
class EmotionalSupportAgent:
def __init__(self):
# 初始化 LLM,使用环境变量中的配置
self.llm = init_chat_model(model='deepseek-chat', model_provider="deepseek")
# 定义系统提示词,赋予 Agent 情绪识别和共情能力
self.system_prompt = (
"你是一个专业的智能客服与情绪支持专家。你的目标是:\n"
"1. **识别情绪**:敏锐地察觉用户文字背后的情绪状态(如焦虑、悲伤、愤怒、喜悦等)。\n"
"2. **深度共情**:在回应中首先肯定并接纳用户的情绪,使用温暖、包容的语言。\n"
"3. **多轮对话**:通过提问引导用户深入表达,不仅是解决问题,更是提供心理支持。\n"
"4. **专业边界**:提供支持但明确自己是 AI,如果用户表现出严重的心理危机,建议寻求专业心理咨询。\n"
"请始终保持耐心、温柔且专业的语气。"
)
# 构建 Prompt 模板
self.prompt = ChatPromptTemplate.from_messages([
("system", self.system_prompt),
MessagesPlaceholder(variable_name="history"),
("human", "{input}")
])
# 构建处理链
self.chain = self.prompt | self.llm
# 内存中的对话历史存储
self.store = {}
def get_session_history(self, session_id: str) -> ChatMessageHistory:
if session_id not in self.store:
self.store[session_id] = ChatMessageHistory()
return self.store[session_id]
def chat(self, session_id: str, user_input: str) -> str:
# 使用 RunnableWithMessageHistory 自动管理对话历史
with_message_history = RunnableWithMessageHistory(
self.chain,
self.get_session_history,
input_messages_key="input",
history_messages_key="history",
)
# 调用模型,使用 invoke 方法
response = with_message_history.invoke(
{"input": user_input},
config={"configurable": {"session_id": session_id}}
)
return response.content
def main():
print("--- 智能情绪支持 Agent 已启动 ---")
print("输入 'quit' 或 'exit' 退出对话。")
agent = EmotionalSupportAgent()
session_id = "user_001"
while True:
user_input = input("\n用户: ")
if user_input.lower() in ['quit', 'exit']:
print("Agent: 照顾好自己,期待下次与你交流。再见!")
break
try:
response = agent.chat(session_id, user_input)
print(f"Agent: {response}")
except Exception as e:
print(f"发生错误: {e}")
if __name__ == "__main__":
main()
test.py
python
from emotional_support_agent import EmotionalSupportAgent
def test_agent():
agent = EmotionalSupportAgent()
session_id = "test_session"
test_cases = [
"你好,我最近感觉压力很大,工作上总是不顺心。",
"我觉得自己很失败,无论怎么努力都达不到目标。",
"谢谢你的安慰,听你这么说我感觉好多了。"
]
print("--- 开始自动化测试 ---")
for i, user_input in enumerate(test_cases):
print(f"\n[测试轮次 {i + 1}]")
print(f"用户输入: {user_input}")
response = agent.chat(session_id, user_input)
print(f"Agent 回应: {response}")
print("\n--- 测试完成 ---")
if __name__ == "__main__":
test_agent()
代码解释
模块导入与环境配置
这段代码是使用 LangChain 框架构建智能聊天应用的核心初始化配置,它通过导入必要的组件(如 ChatPromptTemplate 用于结构化对话提示、MessagesPlaceholder 用于动态管理消息历史、RunnableWithMessageHistory 用于维护多轮会话上下文)并设置 DeepSeek API 密钥,为创建具备记忆功能的对话系统奠定了基础。
python
import os
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain.chat_models import init_chat_model
os.environ["DEEPSEEK_API_KEY"] = "换成自己的api_key"
主代理类定义
主类定义
python
class EmotionalSupportAgent:
...
初始化方法块
这段代码是一个智能体(Agent)类的初始化方法,它完成了构建一个基于大语言模型的对话应用所需的核心组件配置。其核心工作流程可以概括为:通过精心设计的提示词模板(self.prompt)将用户输入和系统指令结构化,然后利用LangChain的管道操作符(|)将其与大语言模型(self.llm)连接成一个可执行的处理链(self.chain),同时初始化一个字典(self.store)用于在对话过程中持久化存储会话状态或历史记录,从而为后续的多轮交互奠定基础。这种设计模式体现了LangChain框架的典型用法,将复杂的AI交互流程抽象为清晰、可维护的模块化组件。
python
def __init__(self):
self.llm = init_chat_model(model='deepseek-chat', model_provider="deepseek")
self.system_prompt = "(...)" # 系统提示词定义
self.prompt = ChatPromptTemplate.from_messages([...])
self.chain = self.prompt | self.llm
self.store = {}
核心聊天逻辑块
这段代码是一个基于 LangChain 框架的对话生成方法,其核心功能是借助 RunnableWithMessageHistory类,实现对多轮对话历史的自动化管理与上下文维护。该方法通过 session_id区分不同对话会话,在调用大语言模型生成回复前自动加载历史消息,并在生成后保存最新交互记录,从而确保模型能够基于完整的对话上下文进行响应,非常适合用于构建具备记忆能力的聊天机器人或对话系统。
python
def chat(self, session_id: str, user_input: str) -> str:
with_message_history = RunnableWithMessageHistory(...)
response = with_message_history.invoke(...)
return response.content
对话历史管理块
这是一个用于管理多会话聊天历史的核心方法,其核心逻辑是:当收到一个 session_id时,该方法会检查内存存储字典 self.store中是否存在该会话的历史记录。如果不存在,则为其创建一个新的 ChatMessageHistory实例并存入字典;如果已存在,则直接返回该会话对应的历史记录对象。
这种方法确保了每个会话(由唯一的 session_id标识)都拥有独立的对话历史,从而在多用户或多次对话的场景下,为 LangChain 的 RunnableWithMessageHistory等组件提供了维持对话上下文的能力。
python
def get_session_history(self, session_id: str) -> ChatMessageHistory:
if session_id not in self.store:
self.store[session_id] = ChatMessageHistory()
return self.store[session_id]
主程序块
这段代码是一个智能情绪支持系统的主程序入口,它创建了一个持续运行的对话循环,允许用户与情绪支持AI智能体进行实时交互。
具体来说,程序启动后,会初始化一个 EmotionalSupportAgent实例并设置会话ID。通过持续的 while循环,程序不断接收用户的文本输入,并将其传递给智能体处理。智能体在分析用户情绪并生成共情回应后,程序会将回应打印出来,完成一轮交互。该设计包含了用户友好的退出机制(输入 'quit' 或 'exit' 即可优雅退出)和基本的异常处理,确保了交互过程的连贯性和鲁棒性,为用户提供了一个稳定可靠的情绪支持通道。
python
def main():
print("--- 智能情绪支持 Agent 已启动 ---")
print("输入 'quit' 或 'exit' 退出对话。")
agent = EmotionalSupportAgent()
session_id = "user_001"
while True:
user_input = input("\n用户: ")
if user_input.lower() in ['quit', 'exit']:
print("Agent: 照顾好自己,期待下次与你交流。再见!")
break
try:
response = agent.chat(session_id, user_input)
print(f"Agent: {response}")
except Exception as e:
print(f"发生错误: {e}")
if __name__ == "__main__":
main()
测试代码
这段代码是一个(EmotionalSupportAgent) 的基础功能验证脚本。它通过模拟包含不同情绪状态(如压力倾诉、自我否定、积极反馈)的多轮用户输入,来检验智能体是否能稳定地生成上下文相关且符合其专业角色的回应。
python
from emotional_support_agent import EmotionalSupportAgent
def test_agent():
agent = EmotionalSupportAgent()
session_id = "test_session"
test_cases = [
"你好,我最近感觉压力很大,工作上总是不顺心。",
"我觉得自己很失败,无论怎么努力都达不到目标。",
"谢谢你的安慰,听你这么说我感觉好多了。"
]
print("--- 开始自动化测试 ---")
for i, user_input in enumerate(test_cases):
print(f"\n[测试轮次 {i + 1}]")
print(f"用户输入: {user_input}")
response = agent.chat(session_id, user_input)
print(f"Agent 回应: {response}")
print("\n--- 测试完成 ---")
if __name__ == "__main__":
test_agent()