本文主要从Why、What、How的角度,拆解目前主流的大模型应用开发框架LangChain,之后给到一个带RAG能力的聊天机器人(Chatbot)项目,来感受下LangChain在大模型应用开发方面的实战效果。
你将获得什么?
- 开发一个AI大模型应用需要考虑哪些内容?
- LangChain的核心架构都有哪些?
- RAG的核心思路是什么?
- 实战:如何5分钟实现一个极简智能聊天机器人Chatbot?
一、Why:为啥会有LangChain
假如从OpenAI 的API开始构建大模型应用的话,那么就得需要考虑这些问题。
- Prompt 管理:不同的场景需要手写不同的提示词(Prompt),还要维护多个 prompt 的版本和结构,很容易混乱。
- 调用逻辑的组织: 如果你想让模型先问用户问题,然后再去查资料,再回答——你得自己写一整套逻辑流程。
- 多模型集成: 假如你不想用OpenAI的大模型,想尝试下HuggingFace上的其他大模型,就得需要自己封装和管理它们的接口。
- 与外部工具对接: 想要模型查数据库、搜索引擎、文件系统?你要自己写代码去连接、格式化、处理这些数据。
- 内存管理(聊天上下文): 比如:让 AI 记住用户之前说过什么,你要自己存储这些对话记录,并加到 prompt 里。
- 调试 & 追踪: 如果模型表现不对,你很难知道是哪一步出了问题。没有自动化的 trace 系统。
现在,有了LangChain,你可以不用特别关注那些底层的工作,专注在你的业务即可。比如你想基于LLM开发一个问答系统,几行代码就可以完成最内核的功能:
from langchain_community.chat_models import ChatOllama
from langchain_core.messages import HumanMessage
# 初始化模型
model = ChatOllama(
model="qwen2.5:1.5b",
base_url="http://localhost:11434"# Ollama 服务地址
)
# 发送请求
response = model.invoke([
HumanMessage(content="用中文写一首关于秋天的短诗")
])
print(response.content)
对,就是这么简洁。
二、What:LangChain框架拆解
官网的定义是,LangChain是一个用于开发由大型语言模型 (LLMs) 驱动的应用程序的框架。想要理解LangChain的封装逻辑,就得先理解LLM的技术堆栈思路。
2.1 LLM技术栈设计思路
当你想开发一款大模型应用的时候,直接使用其已经封装好的组件就可以。甚至针对常规的应用流程,它利用链(LangChain中Chain的由来)这个概念已经内置标准化方案了。
这里我们从新兴的大语言模型(LLM)技术栈的角度来看看为何它的理念这么受欢迎。
LLM技术栈主要由四个主要部分组成:
数据预处理(data preprocessing pipeline):主要包括了数据源连接、数据转化、下游连接器(如向量数据库),特别是对于繁杂的数据源,如数千个PDF、PPTX、聊天记录、抓取的HTML等,这里需要大量的数据提取、清理、转换工作,这点上跟大数据分析任务的前期步骤很类似,不同的是大模型的数据处理可能会用到OCR模型、Python脚本和正则表达式等方式,并以API方式向外部提供JSON数据,以便嵌入终端和存储在向量数据库中。
嵌入与向量存储(embeddings +vector store ):以往嵌入主要用于如文档聚类之类的特定任务,新的架构中,直接将文档及其嵌入存储在向量数据库中,可以通过LLM端点实现关键的交互模式。直接存储原始嵌入,意味着数据可以以其自然格式存储,从而实现更快的处理时间和更高效的数据检索。
LLM 终端(LLM endpoints):LLM终端负责管理模型的资源,包括内存和计算资源,并提供可扩展和容错的接口,用于向下游应用程序提供LLM输出。
LLM 编程框架(LLM programming framework):LLM编程框架提供了一套工具和抽象,用于使用语言模型构建应用程序。在现代技术栈中出现了各种类型的组件,包括:LLM提供商、嵌入模型、向量存储、文档加载器、其他外部工具(谷歌搜索等),这些框架的一个重要功能是协调各种组件。
2.2 LangChain框架核心模块
langchain-core:聊天模型和其他组件的基础抽象。
Integration packages:负责维护不同厂家的大模型,由轻量级的包组成,例如 langchain-openai、langchain-anthropic 等。
langchain:构成应用程序认知架构的链、代理和检索策略。
langchain-community:由社区维护的第三方集成工具。
langgraph:编排框架,用于将 LangChain 组件组合成具有持久化、流式处理和其他关键功能的生产就绪型应用程序。
完整的框架如:
这里补充框架中的两个组成:
- LangGraph:是一个基于 LangChain 的扩展库,用于构建有状态、多角色的智能体(Agents)应用。它通过将任务流程建模为状态图(StateGraph),实现对复杂任务的精细控制和管理。
- LangSmith:通俗一点来说,LangSmith 是一个用于开发、调试、测试和监控基于大语言模型(LLM)应用的平台,它有点像你写 LLM 应用时的 “全能开发调试仪表盘”。
三、How:基于LangChain开发带RAG能力的ChatBot项目
3.1 项目效果
先直接看下项目效果。
注:用户在位置1进行输入,在位置2 Jupyter的Cell底部,可以看到大模型回复的结果。
3.2 关键步骤解析
项目技术开发环境:LangChain+Ollama+Qwen2.5+Jupyter
1. 基础构建
可以看到这里主要引用了LangChain框架中的langchain_core、langchain_community,并进行了模型初始化和文件的加载处理。
import os
from typing import List, Optional
from langchain_community.chat_models import ChatOllama
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.document_loaders import PyPDFLoader, TextLoader
# 配置常量
DEFAULT_MODEL = "qwen2.5:1.5b"
OLLAMA_BASE_URL = "http://localhost:11434"
# 初始化模型
def init_model(model_name: str = DEFAULT_MODEL) -> ChatOllama:
return ChatOllama(
model=model_name,
base_url=OLLAMA_BASE_URL,
temperature=0.7,
num_ctx=4096,
stream=True,
stop=["<|im_end|>"] # 防止模型无限生成
)
# 加载文档(支持PDF/TXT)
def load_documents(file_path: str) -> Optional[List]:
ifnot os.path.exists(file_path):
print(f"⚠️ 文件不存在: {file_path}")
returnNone
try:
if file_path.endswith(".pdf"):
loader = PyPDFLoader(file_path)
elif file_path.endswith(".txt"):
loader = TextLoader(file_path)
else:
print("❌ 不支持的文件格式(仅支持PDF/TXT)")
returnNone
return loader.load()
except Exception as e:
print(f"❌ 文档加载失败: {str(e)}")
returnNone
2. 构建智能链
这一步是整个应用的核心。在这一步中完成应用的,文件解析、向量化、查询检索。并结合用户输入完成对LLM的交互。
def build_chain(model: ChatOllama, documents: Optional[List] = None):
# ===== 提示模板设计 =====
base_prompt = ChatPromptTemplate.from_messages([
("system", "你是{persona},请用{language}回答。对话历史:{history}"),
("human", "{input}")
])
doc_prompt = ChatPromptTemplate.from_messages([
("system", """
根据以下上下文和对话历史回答问题:
---上下文---
{context}
---历史记录---
{history}
请用{language}以{persona}的身份回答:
"""),
("human", "{input}")
])
# ===== 链式逻辑 =====
if documents:
# 文档处理流程
embeddings = OllamaEmbeddings(model="nomic-embed-text")
splits = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
).split_documents(documents)
vectorstore = FAISS.from_documents(splits, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
chain = (
RunnablePassthrough.assign(
context=lambda x: "\n".join(
f"[来源{i+1}]: {doc.page_content}"
for i, doc in enumerate(retriever.get_relevant_documents(x["input"]))
),
persona=lambda _: "专业AI助手",
language=lambda _: "中文",
history=lambda x: "\n".join(
f"{msg.type}: {msg.content}"
for msg in x.get("history", [])
)
)
| doc_prompt
| model
| StrOutputParser()
)
else:
# 基础对话流程
chain = (
RunnablePassthrough.assign(
persona=lambda _: "友好AI伙伴",
language=lambda _: "中文",
history=lambda x: "\n".join(
f"{msg.type}: {msg.content}"
for msg in x.get("history", [])
)
)
| base_prompt
| model
| StrOutputParser()
)
return chain
3.构建交互式聊天框架
这一步主要构建起用于与大模型聊天的用户界面。可以看到从用户输入到LLM相应,以及保留最近10轮的对话上下文信息。
def chat(model_name: str = DEFAULT_MODEL, file_path: Optional[str] = None):
# 初始化
model = init_model(model_name)
documents = load_documents(file_path) if file_path elseNone
chain = build_chain(model, documents)
history = []
print(f"\n🚀 已启动 {model_name} 聊天机器人({'文档模式' if documents else '纯对话模式'})")
print("输入 'exit' 退出 | 'reset' 清空历史 | 'switch' 切换模型\n")
whileTrue:
try:
# 用户输入
user_input = input("👤 你: ")
if user_input.lower() == 'exit':
break
elif user_input.lower() == 'reset':
history = []
print("🔄 历史已清空")
continue
elif user_input.lower() == 'switch':
new_model = input(f"当前模型: {model_name} → 输入新模型名(如 deepseek-r1:7b): ")
model_name = new_model.strip()
model = init_model(model_name)
chain = build_chain(model, documents)
print(f"🔄 已切换至模型: {model_name}")
continue
# 流式输出
print("\n🤖 AI: ", end="", flush=True)
full_response = ""
for chunk in chain.stream({"input": user_input, "history": history}):
print(chunk, end="", flush=True)
full_response += chunk
# 更新历史(限制最大长度)
history.extend([
HumanMessage(content=user_input),
AIMessage(content=full_response)
])
history = history[-10:] # 保留最近10轮对话
print("\n" + "─" * 50 + "\n")
except KeyboardInterrupt:
print("\n⏹️ 对话已终止")
break
except Exception as e:
print(f"\n❌ 错误: {str(e)}")
4.运行应用程序
这个应用不仅支持纯LLM对话的,还支持RAG的方式进行对话。
if __name__ == "__main__":
# 示例:带PDF文档的聊天
# chat(file_path="knowledge.pdf")
# 纯对话模式
chat()
普通人如何抓住AI大模型的风口?
领取方式在文末
为什么要学习大模型?
目前AI大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。
目前,开源人工智能大模型已应用于医疗、政务、法律、汽车、娱乐、金融、互联网、教育、制造业、企业服务等多个场景,其中,应用于金融、企业服务、制造业和法律领域的大模型在本次调研中占比超过 30%。
随着AI大模型技术的迅速发展,相关岗位的需求也日益增加。大模型产业链催生了一批高薪新职业:
人工智能大潮已来,不加入就可能被淘汰。如果你是技术人,尤其是互联网从业者,现在就开始学习AI大模型技术,真的是给你的人生一个重要建议!
最后
如果你真的想学习大模型,请不要去网上找那些零零碎碎的教程,真的很难学懂!你可以根据我这个学习路线和系统资料,制定一套学习计划,只要你肯花时间沉下心去学习,它们一定能帮到你!
大模型全套学习资料领取
这里我整理了一份AI大模型入门到进阶全套学习包,包含学习路线+实战案例+视频+书籍PDF+面试题+DeepSeek部署包和技巧,需要的小伙伴文在下方免费领取哦,真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发
部分资料展示
一、 AI大模型学习路线图
整个学习分为7个阶段
二、AI大模型实战案例
涵盖AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,皆可用。
三、视频和书籍PDF合集
从入门到进阶这里都有,跟着老师学习事半功倍。
四、LLM面试题
五、AI产品经理面试题
六、deepseek部署包+技巧大全
😝朋友们如果有需要的话,可以V扫描下方二维码联系领取~