LangChain实战:从零构建一个智能问答机器人,解锁大模型应用新姿势
引言随着ChatGPT的爆火大语言模型LLM的能力被广泛认可。然而单靠模型本身去解决实际问题往往不够它无法访问实时数据、不能调用外部API还容易“遗忘”上下文。LangChain正是为了解决这些痛点而生的框架——它像胶水一样把LLM、数据库、搜索引擎、工具等串联起来让你能用几行代码构建出复杂的AI应用。本文将带你从核心概念入手通过一个完整的智能问答机器人实战项目掌握LangChain的四大核心能力模型交互、链式调用、记忆管理、工具集成。全部代码可直接运行建议收藏后动手实操。一、LangChain核心概念速览在动手之前我们先快速理解LangChain的几个关键组件Model模型大语言模型的抽象支持OpenAI、HuggingFace、本地LLM等。Prompt提示词管理提示模板支持变量、Few-shot示例等。Chain链将多个组件按顺序组合成流水线是实现复杂逻辑的核心。Memory记忆为对话添加状态让模型“记住”历史。Agent Tools智能体工具LLM通过推理决定调用哪个工具搜索、计算器等实现自主行动。本文实战将用到除Agent外的所有组件帮助你打好坚实基础。二、环境准备确保Python 3.9环境安装依赖pip install langchain langchain-openai chromadb tiktoken python-dotenv在项目根目录创建.env文件填写你的OpenAI API Key或其他模型KeyOPENAI_API_KEYsk-your-key-here接下来我们将构建一个智能问答机器人它能记忆对话上下文还能根据提问动态搜索外部文档库。三、实战智能问答机器人全流程3.1 基础对话链首先实现一个最简单的对话功能接收用户问题调用LLM生成回答。# basic_chain.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.schema.output_parser import StrOutputParser load_dotenv() # 1. 初始化模型 llm ChatOpenAI( modelgpt-3.5-turbo, # 经济实惠的选择 temperature0.7, # 控制创造性0最保守1最随机 max_tokens500 ) # 2. 构建提示词模板 prompt ChatPromptTemplate.from_messages([ (system, 你是一个乐于助人的知识问答助手回答要准确、简洁。), (human, {user_input}) ]) # 3. 组装链输入 → 提示词 → LLM → 字符串输出 chain prompt | llm | StrOutputParser() # 4. 运行测试 if __name__ __main__: question 什么是量子纠缠用一句话解释。 response chain.invoke({user_input: question}) print(fQ: {question}\nA: {response})运行结果示例Q: 什么是量子纠缠用一句话解释。 A: 量子纠缠是指两个粒子无论相隔多远状态都会瞬间相互关联就像“心灵感应”。这就是LangChain的链式调用LCEL语法通过|操作符把各组件串联数据从左到右流动清晰且易扩展。3.2 加入对话记忆现在的机器人每次都是全新对话无法记住之前的内容。LangChain提供多种记忆组件我们使用ConversationBufferMemory把聊天历史注入到提示词中。pythonchat_with_memory.pyfrom langchain_openai import ChatOpenAIfrom langchain.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain.memory import ConversationBufferMemoryfrom langchain.schema.runnable import RunnablePassthroughfrom langchain.schema.output_parser import StrOutputParserfrom dotenv import load_dotenvload_dotenv()1. 模型llm ChatOpenAI(modelgpt-3.5-turbo, temperature0.7)2. 提示词模板用MessagesPlaceholder接纳历史消息prompt ChatPromptTemplate.from_messages([(system, 你是一个友好的问答助手能记住我们之前的对话。),MessagesPlaceholder(variable_namehistory), # 自动插入历史(human, {input})])3. 记忆组件memory ConversationBufferMemory(return_messagesTrue, # 以消息对象形式返回历史memory_keyhistory # 与提示词中的变量名对应)4. 构建带记忆的链chain (RunnablePassthrough.assign(historylambda x: memory.load_memory_variables(x)[history])| prompt| llm| StrOutputParser())5. 交互循环print(