news 2026/3/15 5:11:21

零基础 | 基于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/3/13 19:25:27

C++项目文档汉化:用AI镜像批量生成英文说明

C项目文档汉化:用AI镜像批量生成英文说明 🌐 AI 智能中英翻译服务 (WebUI API) 从技术痛点出发:为何需要自动化文档翻译? 在跨国协作日益频繁的软件开发场景中,C项目的国际化文档需求愈发迫切。许多国内团队开发的核心…

作者头像 李华
网站建设 2026/3/13 12:20:20

开发者必备:一键部署的中英翻译服务,告别环境报错

开发者必备:一键部署的中英翻译服务,告别环境报错 🌐 AI 智能中英翻译服务 (WebUI API) 在跨语言开发、内容本地化和国际交流日益频繁的今天,高质量的自动翻译工具已成为开发者和内容创作者的核心生产力组件。然而,传…

作者头像 李华
网站建设 2026/3/13 1:17:01

新闻资讯多语言发布:媒体机构AI翻译落地真实案例

新闻资讯多语言发布:媒体机构AI翻译落地真实案例 在当今全球化的信息传播格局中,新闻媒体机构面临着将内容快速、准确地推向国际受众的迫切需求。传统人工翻译成本高、周期长,难以满足实时发布的节奏;而通用机器翻译服务又常因语境…

作者头像 李华
网站建设 2026/3/14 2:53:28

本地化部署翻译服务:安全可控,数据不出内网

本地化部署翻译服务:安全可控,数据不出内网 🌐 AI 智能中英翻译服务 (WebUI API) 在企业级AI应用日益普及的今天,数据隐私与安全性成为智能翻译系统落地的关键考量。尤其在金融、医疗、法律等敏感领域,用户对“数据是…

作者头像 李华
网站建设 2026/3/14 6:27:22

离线环境可用:无外网连接仍能运行的AI翻译方案

离线环境可用:无外网连接仍能运行的AI翻译方案 🌐 AI 智能中英翻译服务 (WebUI API) 在跨国协作、学术研究与内容本地化日益频繁的今天,高质量的中英翻译工具已成为开发者和企业不可或缺的技术基础设施。然而,大多数AI翻译服务…

作者头像 李华
网站建设 2026/3/14 4:02:31

学到的知识点 1.8

一.风机布局图二.电钻的使用1.正反转2.上钻头顺时针,用手扶住,按住启动,知道钻头不掉下来3.旋转的快慢第一档:最快档第二档:减慢档4.旋转的N力通过旋转,来控制多少N三.风机,冷凝棒,动力系统,锅炉,水箱1.水箱存放水资源2.锅炉回水温度 回去的水温度通过冷凝棒 出水温度 …

作者头像 李华