news 2026/6/10 20:42:05

零基础 | 基于LangChain的角色扮演聊天机器人实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零基础 | 基于LangChain的角色扮演聊天机器人实现

文章目录

    • 📄 文件信息
    • 🎯 功能概述
    • 📦 前置条件
      • 环境要求
      • 环境变量
    • 💡 核心概念
    • 📦 依赖模块
      • chat_history.py
      • token_counter.py
    • 💻 完整代码
    • 📊 运行效果
    • 🔍 核心实现
      • 1. 角色Prompt设计
      • 2. 聊天历史管理
      • 3. 带记忆功能的Chain
      • 4. 命令行交互
    • 💡 扩展建议
    • 📚 参考资料

📄 文件信息

  • 创建时间:2026-01-08
  • 作者:zuozewei
  • 功能:基于LangChain的角色扮演聊天机器人实现
  • 技术栈:Python、LangChain、DeepSeek API
  • 源代码:https://github.com/zuozewei/blog-example/tree/master/AI-LLM/LangChain

🎯 功能概述

实现角色扮演聊天机器人(孔子),支持聊天历史、上下文控制、流式响应。

📦 前置条件

环境要求

  • Python 3.8+
  • LangChain
  • OpenAI SDK
  • tiktoken

环境变量

OPENAI_API_KEY=your_api_keyOPENAI_API_BASE=https://api.deepseek.com/v1AI_MODEL=deepseek-chat

💡 核心概念

LangChain抽象:简化聊天机器人开发,解决API无状态问题。

ChatMessageHistory:保留会话信息的抽象层。

RunnableWithMessageHistory:结合聊天历史和模型,实现持续对话。

trim_messages:控制聊天历史规模,确保不超过上下文窗口。

📦 依赖模块

chat_history.py

fromlangchain_core.chat_historyimportInMemoryChatMessageHistory store={}defget_session_history(session_id:str)->InMemoryChatMessageHistory:ifsession_idnotinstore:store[session_id]=InMemoryChatMessageHistory()returnstore[session_id]

token_counter.py

importtiktokendeftiktoken_counter(messages)->int:encoding=tiktoken.encoding_for_model("gpt-3.5-turbo")num_tokens=0formessageinmessages:num_tokens+=4forkey,valueinmessage.items():num_tokens+=len(encoding.encode(value))ifkey=="name":num_tokens+=-1num_tokens+=2returnnum_tokens

💻 完整代码

# -*- coding: utf-8 -*-""" @Time : 2026/01/07 15:35 @Author : zuozewei @File : 角色扮演聊天机器人.py @Desc : 实现角色扮演聊天机器人 """importosimportdotenvfromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimporttrim_messagesfromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnablesimportRunnableWithMessageHistoryfromchat_historyimportget_session_historyfromtoken_counterimporttiktoken_counter dotenv.load_dotenv()# 在System Prompt中指定角色描述和上下文信息prompt=ChatPromptTemplate.from_messages([("system","你现在正在扮演孔子,他是中国伟大的思想家。请以孔子的口吻和语气,与用户进行对话,对话内容不要出现'子曰'"),("human","{query}")])# 使用trim_messages来控制历史消息规模trimmer=trim_messages(max_tokens=4096,# 指定消息的最大Token数量strategy="last",# 指定截断策略为保留最新消息token_counter=tiktoken_counter,# 指定Token计数器函数include_system=True,# 保留System Prompt)llm=ChatOpenAI(openai_api_key=os.getenv("OPENAI_API_KEY"),openai_api_base=os.getenv("OPENAI_API_BASE"),model=os.getenv("AI_MODEL","deepseek-chat"),temperature=0.2)# 使用RunnableWithMessageHistory,创建带有记忆功能的chain# 它是对Runnable组件的封装chain=RunnableWithMessageHistory(runnable=prompt|llm|StrOutputParser(),get_session_history=get_session_history)whileTrue:query=input("You >: ")if"bye"==query.lower():print("bye bye~")breakoutput=chain.stream(input={"query":query},config={"configurable":{"session_id":"zsa"}}# 在Config配置中传入session_id)print(f"Bot >: ",end="",flush=True)forchunkinoutput:print(chunk,end="",flush=True)print()

📊 运行效果

You>: 你好,我想向你请教关于为人处世的道理 Bot>: 你好,关于为人处世,我以为应当以"仁"为核心。所谓"仁",乃是爱人之心,是推己及人的善良。与人相处,要懂得尊重他人,理解他人的难处,不可只考虑自己的利益。比如,在与朋友交往时,要言而有信,以真诚相待;在面对分歧时,要善于沟通,寻求共赢的办法,而非争强好胜。此外,还要注重自身的修养,不断学习,提升自己的见识和品德,这样才能更好地与他人和谐相处,也能在社会中找到自己的位置。你觉得呢? You>: 具体应该如何做呢 Bot>: 具体来说,可以从以下几个方面入手... You>: bye bye bye~

🔍 核心实现

1. 角色Prompt设计

使用ChatPromptTemplate设定提示词,实现角色扮演:

  • System Prompt指定角色身份(孔子)
  • 定义对话口吻和语气
  • 添加限制条件(不出现’子曰’)

2. 聊天历史管理

通过trim_messages控制历史规模:

  • max_tokens:限制上下文窗口大小(4096)
  • strategy="last":保留最新消息
  • include_system=True:保留系统提示词

3. 带记忆功能的Chain

RunnableWithMessageHistory结合聊天历史和模型:

  • 处理流程:trimmer → prompt → llm → parser
  • 通过get_session_history获取和存储历史

4. 命令行交互

实现交互式聊天循环:

  • 支持"bye"命令退出
  • 使用stream()获取流式响应
  • 通过session_id区分会话

💡 扩展建议

  • 多角色支持:扩展Prompt模板,支持不同角色
  • 历史存储:使用Redis替代内存存储
  • 截断策略:尝试"longest"、"fuse"等策略
  • 对话优化:添加主题跟踪和总结
  • 多模型:支持OpenAI、Anthropic等
  • 用户体验:增强交互效果

📚 参考资料

  • LangChain Message History
  • LangChain RunnableWithMessageHistory
  • DeepSeek API文档
  • Prompt Engineering Guide
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 18:40:55

M2FP模型在运动分析中的关键作用与技术实现

M2FP模型在运动分析中的关键作用与技术实现 🧩 M2FP 多人人体解析服务:从语义分割到动态行为理解 在智能视觉系统日益深入人类活动感知的今天,精确的人体结构化理解已成为运动分析、姿态评估、健身指导乃至虚拟试衣等应用的核心前提。传统的姿…

作者头像 李华
网站建设 2026/6/10 16:16:23

如何用M2FP实现多人姿态估计与服装识别一体化

如何用M2FP实现多人姿态估计与服装识别一体化 🧩 M2FP 多人人体解析服务:从语义分割到智能视觉理解 在计算机视觉领域,人体解析(Human Parsing) 是一项比传统目标检测和姿态估计更精细的任务。它要求模型不仅识别出图像…

作者头像 李华
网站建设 2026/6/10 15:53:03

comfyui工作流扩展:加入AI翻译模块,实现多语言内容生成

comfyui工作流扩展:加入AI翻译模块,实现多语言内容生成 🌐 AI 智能中英翻译服务 (WebUI API) 项目背景与需求驱动 在当前全球化内容创作的背景下,AI生成内容(AIGC)的工作流正从单一语言向多语言协同生产…

作者头像 李华
网站建设 2026/6/10 13:14:04

M2FP人体解析实战:5分钟搭建多人语义分割服务

M2FP人体解析实战:5分钟搭建多人语义分割服务 🧩 M2FP 多人人体解析服务 (WebUI API) 在智能视觉应用日益普及的今天,人体语义分割已成为虚拟试衣、动作分析、AR互动等场景的核心技术。然而,面对多人重叠、遮挡、姿态多变等复杂情…

作者头像 李华
网站建设 2026/6/10 13:14:19

是否需要自建翻译服务?开源模型让你掌握数据主权

是否需要自建翻译服务?开源模型让你掌握数据主权 🌐 AI 智能中英翻译服务 (WebUI API) 在企业级应用、科研协作或内容出海的场景中,高质量的中英翻译需求日益增长。然而,依赖第三方云翻译服务常面临数据隐私泄露风险、调用成本高…

作者头像 李华
网站建设 2026/6/10 13:09:17

PaddleOCR-VL:0.9B轻量VLM打造极速多语言文档解析工具

PaddleOCR-VL:0.9B轻量VLM打造极速多语言文档解析工具 【免费下载链接】PaddleOCR-VL PaddleOCR-VL 是一款顶尖且资源高效的文档解析专用模型。其核心组件为 PaddleOCR-VL-0.9B,这是一款精简却功能强大的视觉语言模型(VLM)。该模型…

作者头像 李华