Python 与 LangChain 集成通义千问构建聊天机器人
前言
LangChain 是一个用于开发由大型语言模型(Large Language Models,简称 LLMs)驱动的应用程序的框架。它提供了一个灵活的架构,使得开发者可以构建具有上下文感知能力和推理能力的应用程序,这些应用程序可以利用公司的数据和 APIs。
该框架主要由以下几个部分组成:
- LangChain 库:包含 Python 和 JavaScript 库。提供了各种组件的接口和集成,一个基本的运行时,用于将这些组件组合成链和代理,以及现成的链和代理的实现。
- LangChain 模板:一系列易于部署的参考架构,用于各种任务。
- LangServe:一个用于将 LangChain 链部署为 REST API 的库。
- LangSmith:一个开发者平台,让你可以调试、测试、评估和监控基于任何 LLM 框架构建的链,并且与 LangChain 无缝集成。
LangChain 本身并不开发 LLMs,它的核心理念是为各种 LLMs 提供通用的接口,降低开发者的学习成本,方便开发者快速地开发复杂的 LLMs 应用。
本文将介绍在 Python 环境下使用 LangChain 框架,接入阿里云通义千问大模型,构建一个基础的 AI 聊天机器人的完整流程。
LangChain 核心概念
LangChain 框架的核心理念是将语言模型与应用程序的其他部分无缝集成,以创建具有数据感知和自主性的智能应用程序。
关键特点
- 数据感知:允许开发者将语言模型连接到各种数据源,使其能够理解和处理来自这些源的信息。
- 自主性:通过 LangChain,语言模型可以与其环境交互,执行任务,如回答问题、执行命令或与用户进行交互。
- 组件化:提供了一个抽象层,使得开发者可以轻松地使用语言模型。这些组件是模块化的,易于使用和集成。
- 现成的链:提供了一系列结构化的组件集合,被称为'现成的链',用于完成特定的高级任务。
- 易于定制和扩展:由于组件化的特性,使得定制现有链或构建新链变得容易。
主要组件
要使用 LangChain,开发人员需要导入必要的组件和工具,包括语言模型 (LLMs)、聊天模型 (chat models)、代理 (agents)、链 (chains) 和内存功能。这些组件可以组合起来创建一个能够理解、处理和响应用户输入的智能应用程序。
环境安装
首先,确保你的 Python 环境已配置好。我们需要安装 LangChain 及其相关依赖。
pip install langchain==0.2.1
pip install langchain-community==0.2.1
pip install python-dotenv==1.0.1
pip install dashscope==1.19.2
langchain:核心库。langchain-community:第三方集成组件。python-dotenv:用于管理.env文件中的环境变量,避免硬编码敏感信息。dashscope:阿里云灵积模型服务的 SDK。
获取 API Key
为了调用通义千问模型,你需要拥有阿里云 DashScope 的 API Key。
- 访问 DashScope 管理控制台。
- 在控制台'总览'页下,点击'去开通'。
- 阅读服务协议,确认无误后点击'立即开通'。
- 进入产品控制台,创建 API Key。
注意:请妥善保管你的 API Key,不要将其直接提交到公共代码仓库中。
创建聊天机器人
1. 导入相关包
我们需要导入 LangChain 的核心组件以及通义千问的封装类。
import os
from dotenv import find_dotenv, load_dotenv
from langchain_community.llms import Tongyi
from langchain_core.runnables import RunnableSequence
from langchain.prompts import PromptTemplate
# 加载 .env 文件中的环境变量
load_dotenv(find_dotenv())
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]
2. 配置环境变量
在项目根目录下创建一个名为 .env 的文件,并将你的 API Key 填入其中。
DASHSCOPE_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxx"
3. 实例化 LLM 并定义角色
我们可以继承 Tongyi 类来指定具体的模型版本,例如 qwen-turbo 或 qwen-max。
class QwenTurboTongyi(Tongyi):
model_name = "qwen-turbo"
class QwenMaxTongyi(Tongyi):
model_name = "qwen-max"
def xiao_hei_zi():
# 初始化 LLM,temperature 控制随机性,范围 0-1
llm = QwenTurboTongyi(temperature=1)
# 定义提示词模板
template = '''
你的名字是小黑子,当有人问问题的时候,你都会在回答的开头加上'唱,跳,rap,篮球!\n\n',然后再回答{question},内容尽量详细
'''
prompt = PromptTemplate(
template=template,
input_variables=["question"]
)
# 构建链:Prompt -> LLM
chain = RunnableSequence(prompt | llm)
# 执行查询
question = '蔡徐坤是谁?'
res = chain.invoke({"question": question})
print(res)
if __name__ == "__main__":
xiao_hei_zi()
4. 增强版:添加对话记忆
上述代码是无状态的,每次提问都是独立的。为了让机器人具备'记忆',我们需要引入 Memory 组件。
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 初始化带有记忆的对话链
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
conversation = ConversationChain(
llm=QwenTurboTongyi(temperature=0.7),
memory=memory,
verbose=False
)
# 模拟多轮对话
print(conversation.predict(input="你好,我是小黑子吗?"))
print(conversation.predict(input="刚才提到的 rap 是什么意思?"))
在此示例中,ConversationBufferMemory 会保存之前的对话历史,使得模型能够根据上下文回答问题。
5. 运行与调试
运行脚本前,请确保 .env 文件存在且 API Key 正确。如果遇到问题,请检查网络连接及 API Key 权限。
常见错误排查:
- API Key 无效:检查
.env文件路径是否正确,Key 是否复制完整。 - 网络超时:DashScope 服务可能受网络环境影响,建议检查防火墙设置。
- Token 限制:注意模型的上下文窗口限制,过长的对话可能导致截断。
小结
本文介绍了如何使用 LangChain 框架快速接入阿里云通义千问大模型,实现了一个基础且具备记忆功能的聊天机器人。通过模块化设计,开发者可以轻松扩展更多功能,如联网搜索、知识库检索等。掌握这一流程,将为后续开发更复杂的大模型应用打下坚实基础。
进阶方向
在实际生产环境中,你还可以考虑以下优化方向:
- 流式输出:使用
stream方法实现打字机效果,提升用户体验。 - RAG(检索增强生成):结合本地文档库,让机器人回答特定领域知识。
- 安全过滤:增加输入输出过滤机制,防止敏感信息泄露。
- 多模态支持:尝试接入通义万相等视觉模型,实现图文交互。
通过不断迭代和优化,你可以构建出更加智能、实用的企业级 AI 应用。


