当前位置: 首页 > news >正文

Langchain实战:如何用ChatGLM-4搭建你的第一个AI对话机器人(附完整代码)

Langchain实战:如何用ChatGLM-4搭建你的第一个AI对话机器人(附完整代码)

最近两年,大模型技术以惊人的速度渗透到各个领域。从智能客服到内容创作,从代码生成到数据分析,AI对话机器人正在重塑人机交互的方式。对于开发者而言,如何快速将前沿的大模型能力整合到自己的应用中,成为一个亟待解决的问题。这正是Langchain这类框架的价值所在——它像一座桥梁,连接了强大的基础模型与实际业务需求。

本文将带你从零开始,用ChatGLM-4和Langchain构建一个具备实用功能的对话机器人。不同于简单的API调用教程,我们会深入探讨如何设计对话流程、处理上下文记忆、优化响应质量等实战问题。无论你是想为产品添加智能交互功能,还是单纯探索大模型的应用可能性,这篇指南都能提供清晰的路径。

1. 环境准备与基础配置

在开始编码之前,我们需要搭建一个稳定的开发环境。ChatGLM-4作为最新一代的大语言模型,对硬件有一定要求。如果本地运行有困难,可以考虑使用云服务提供的API方案。

1.1 安装核心依赖

首先创建一个干净的Python环境(建议3.9+版本),然后安装以下关键包:

pip install langchain==0.1.0 pip install chatglm-client==1.2.3 pip install python-dotenv

这些包分别提供了:

  • Langchain:框架核心功能
  • ChatGLM-client:官方API客户端
  • python-dotenv:管理环境变量

提示:如果遇到版本冲突,可以使用pip install --upgrade强制更新依赖项。

1.2 获取API密钥

访问ChatGLM开发者平台申请API密钥,将其保存在项目根目录的.env文件中:

CHATGLM_API_KEY=your_api_key_here CHATGLM_API_BASE=https://api.chatglm.cn/v4

2. 构建基础对话链

Langchain的核心概念是"链"(Chain)——将不同组件连接起来形成完整的工作流。让我们先实现一个最简单的问答机器人。

2.1 初始化模型

创建chatbot.py文件,添加以下代码:

from langchain.llms import ChatGLM from langchain.chains import LLMChain from langchain.prompts import PromptTemplate import os from dotenv import load_dotenv load_dotenv() llm = ChatGLM( api_key=os.getenv("CHATGLM_API_KEY"), endpoint=os.getenv("CHATGLM_API_BASE"), temperature=0.7 )

关键参数说明:

  • temperature:控制生成文本的随机性(0-1之间)
  • max_tokens:限制响应长度(默认2048)

2.2 设计提示模板

好的提示(Prompt)设计能显著提升模型表现。下面是一个通用对话模板:

template = """ 你是一个专业、友好的AI助手。请根据以下对话历史和最新问题,给出有帮助的回答。 对话历史: {history} 当前问题:{question} """ prompt = PromptTemplate( input_variables=["history", "question"], template=template )

2.3 创建对话链

将组件组合成可执行的链:

conversation = LLMChain( llm=llm, prompt=prompt, verbose=True ) response = conversation.run( history="", question="你好,能介绍一下你自己吗?" ) print(response)

运行后会看到类似输出:

我是基于ChatGLM-4构建的AI助手,擅长回答各类问题并提供专业建议。无论您需要学习新知识、解决技术难题,还是获取日常信息,我都会尽力提供准确、有帮助的回答。

3. 实现多轮对话记忆

基础问答只是开始,真正的对话机器人需要记住上下文。Langchain提供了多种记忆(Memory)方案。

3.1 使用ConversationBufferMemory

修改之前的代码,引入记忆功能:

from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory( memory_key="history", return_messages=True ) conversation = LLMChain( llm=llm, prompt=prompt, memory=memory, verbose=True )

现在可以测试连续对话:

questions = [ "Langchain是什么?", "它最适合解决哪些问题?", "如何集成到现有系统中?" ] for q in questions: print(f"用户: {q}") response = conversation.run(question=q) print(f"AI: {response}\n")

观察输出会发现,AI能够基于前面的问答内容进行连贯回应,而不是孤立地回答每个问题。

3.2 优化记忆策略

默认的缓冲区记忆可能不够高效。对于长对话,可以考虑:

from langchain.memory import ConversationSummaryMemory memory = ConversationSummaryMemory( llm=llm, memory_key="history" )

这种记忆方式会生成对话摘要而非完整记录,更适合长期对话场景。

4. 增强机器人能力

基础对话功能已经实现,接下来通过Langchain的模块化设计添加实用功能。

4.1 集成工具调用

让机器人能够执行实际任务,比如查询天气:

from langchain.agents import Tool from langchain.utilities import OpenWeatherMapAPIWrapper weather = OpenWeatherMapAPIWrapper() tools = [ Tool( name="天气查询", func=weather.run, description="查询城市天气情况" ) ] from langchain.agents import initialize_agent agent = initialize_agent( tools, llm, agent="conversational-react-description", memory=memory, verbose=True ) response = agent.run("上海明天天气怎么样?") print(response)

4.2 添加文档检索

结合RAG(Retrieval-Augmented Generation)技术,让机器人能够基于特定文档回答:

from langchain.document_loaders import TextLoader from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS loader = TextLoader("knowledge.txt") documents = loader.load() embeddings = HuggingFaceEmbeddings() db = FAISS.from_documents(documents, embeddings) retriever = db.as_retriever() qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, memory=memory ) response = qa.run("我们公司的退货政策是什么?")

5. 部署与优化

完成开发后,需要考虑如何将机器人部署到生产环境。

5.1 构建Web接口

使用FastAPI创建简单的HTTP服务:

from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Query(BaseModel): question: str user_id: str @app.post("/chat") async def chat(query: Query): response = conversation.run( question=query.question, history=get_history(query.user_id) ) return {"response": response}

5.2 性能优化建议

实际部署时需要考虑:

  • 缓存机制:对常见问题缓存响应
  • 速率限制:防止API滥用
  • 监控:跟踪响应时间和质量
  • 回退策略:当主模型不可用时使用轻量级替代方案
from langchain.cache import InMemoryCache from langchain.callbacks import get_openai_callback langchain.llm_cache = InMemoryCache() with get_openai_callback() as cb: response = conversation.run(question="复杂问题") print(f"本次消耗token数: {cb.total_tokens}")

6. 处理常见问题

在实际使用中,开发者常会遇到一些典型问题。以下是解决方案:

6.1 响应速度慢

优化策略:

  • 调整max_tokens限制响应长度
  • 使用流式传输逐步显示结果
  • 对简单问题启用缓存
# 流式响应示例 for chunk in conversation.stream(question="长问题"): print(chunk, end="", flush=True)

6.2 回答质量不稳定

改进方法:

  • 优化提示工程
  • 设置更严格的停止序列
  • 添加后处理过滤
from langchain.output_parsers import RegexParser parser = RegexParser( regex=r"Answer: (.*)", output_keys=["answer"] ) prompt = PromptTemplate( template="问题: {question}\n回答规则:...\nAnswer: ", input_variables=["question"], output_parser=parser )

6.3 处理敏感内容

确保机器人不会生成不当内容:

from langchain.filters import SensitiveContentFilter filter = SensitiveContentFilter() chain = filter | conversation # 组合过滤器 response = chain.run(question="敏感问题")

7. 完整代码示例

将所有功能整合到一个可运行的脚本中:

# chatbot_full.py import os from dotenv import load_dotenv from langchain.llms import ChatGLM from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemory from fastapi import FastAPI import uvicorn load_dotenv() # 初始化模型 llm = ChatGLM( api_key=os.getenv("CHATGLM_API_KEY"), endpoint=os.getenv("CHATGLM_API_BASE"), temperature=0.7, max_tokens=1024 ) # 配置记忆和对话链 memory = ConversationBufferMemory() conversation = ConversationChain( llm=llm, memory=memory, verbose=True ) # 创建Web服务 app = FastAPI() @app.get("/chat") async def chat(question: str): response = conversation.run(question) return {"response": response} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)

启动服务后,可以通过http://localhost:8000/chat?question=你的问题进行测试。

在实际项目中使用时,有几个小技巧值得分享:一是为不同用户维护独立的内存空间,二是对API响应添加结构化解析,三是实现对话状态的持久化存储。这些措施能显著提升用户体验和系统可靠性。

http://www.jsqmd.com/news/630928/

相关文章:

  • AI开发-python-langchain框架(--并行流程 )颗
  • SQL如何实现同比环比增长率计算_通过LAG函数与聚合计算
  • 如何3分钟快速配置Android开发环境:智能驱动安装终极指南
  • 2026年广东选有机肥,广正丰性价比首选别错过! - 企业推荐官【官方】
  • 从NOJ到算法实战:一份西工大编程训练题的解题思路与代码精讲
  • c语言的基础知识点
  • 八大网盘直链获取工具:告别限速,拥抱高速下载体验
  • AudioSeal Pixel Studio一文详解:AudioSeal抗重采样/变速/噪声叠加鲁棒性测试
  • Linux内核中的系统调用机制详解
  • 在 Go 语言中声明包级全局 map 的正确方式
  • 市场正规的东莞geo优化公司哪个好 - 企业推荐官【官方】
  • 万字拆解 LLM 运行机制:Token、上下文与采样参数巡
  • Java开发中Lombok插件失效的常见问题与解决方案
  • 基于对比学习的无监督图片旋转判断方法
  • HDMI/DP/TypeC接口检测的硬件实现与设计考量
  • 虾破苍穹(一):RTX 3060 养一只本地“呆呆”龙虾
  • 别再只会ping了!用Wireshark亲手抓个包,看看你的网络请求到底说了啥
  • 告别数据丢失!用GD32F4的USART DMA空闲中断,手把手教你实现高效串口数据流处理
  • 搭建个人飞行雷达:用dump1090实时追踪航班,开启航空监控新体验
  • 论文免费降AI率实操攻略:比话降AI+率零双工具组合打法
  • 东莞靠谱的geo优化品牌哪个好 - 企业推荐官【官方】
  • 深入解析JVM内存模型与引用类型:从原理到实战避坑
  • NoteDiscovery:如何用开源方案构建你的私有知识库?
  • VSCode插件开发:Hunyuan-MT Pro代码注释翻译工具
  • 两块4090显卡,在内网用vLLM跑通Qwen3-30B-AWQ模型,并接入Dify的完整流程
  • Python Scrcpy Client终极指南:如何用Python轻松控制Android设备
  • CANoe之UDS诊断自动化测试(二):核心诊断窗口实战解析
  • Trea实战:零代码改造,借助CMake与vcpkg无缝集成glog日志库
  • 永磁同步电机PMSM的在线参数辨识:模型参考自适应MRAS与最小二乘法结合的电阻电感磁链辨识方...
  • Any metadata 的内存布局