小白学大模型 —— LangChain在AI中应用

内容分享2周前发布
1 0 0

小白学大模型 —— LangChain在AI中应用

一、是什么

想象你要做一个“会聊天的 AI 小秘书”,它不仅能回答你问题,还能:
• 翻公司内部资料 → 找到答案
• 打开日历 → 帮你订会议室
• 上网 → 查今天天气
• 打开计算器 → 帮你算利润

LangChain 就是帮你把这些动作串起来的“乐高说明书”+“万能胶水”
它本身不是大模型,而是让你把大模型(ChatGPT、Llama 等)和各种工具(搜索、数据库、计算器)拼在一起,变成“会动手的 AI 应用”。Chain的英文就是链,LangChain的功能顾名思义就是链接起来各种功能,形成一个链式的调用路径。一条线的走下来,无需你手动干预。

LangChina的三大积木模块

1️⃣ Model I/O – 跟大模型说话
把“用户说的话”包装好,送给大模型;再把大模型的回答拆回来。

举例:用户问“今天上海几度?”
这块积木负责把问题转成 GPT 能看懂的格式,再把 GPT 的“25℃”转回人话。

2️⃣ Retrieval – 给大模型配“资料库”
把 PDF、Word、网页切成小片 → 变成向量 → 存进向量库 → 搜最相关的片段给大模型看,避免它胡说八道(这就是 RAG)。

举例:公司规定 PDF 有 100 页,用户问“年假几天?”
该积木先把 100 页切成 200 段,找到“年假规定在第 3 章第 2 段”,再把这段塞进大模型的“眼前”,让它回答时不瞎编。

3️⃣ Chains & Agents – 让 AI 能动手

Chain(固定流程):像“先查资料→再回答问题”的流水线,一步接一步。
Agent(自主决策):让AI自己决定下一步该干什么:该查资料?还是该上网?还是该调用计算器?
举例:用户说“帮我订明天下午 3 点的会议室并通知小王”。
该积木让 AI 先查日历→再预订→再发邮件,全自动化。

把三块积木随意拼,你就能做出会聊天、会查资料、会干活的 AI 应用。LangChain就封装了大量的方法可以直接调用,无需手写,不过你知道了这些原理,自己手写也很好用,由于LangChain包装的就不够灵活,自己实现的可以自行定制。LangChain还能记录history,下一次提问可以直接将history带进去给大模型。

二、如何用

跑通一个“会读 PDF 的聊天机器人”,代码步骤如下所示:

 1. 安装
pip install langchain langchain-openai pypdf chromadb

# 2. 准备一份 PDF,例如 company_rule.pdf

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import ConversationalRetrievalChain
from langchain.chat_models import ChatOpenAI

# 3. 把 PDF 切成小片,500个token一组
docs = PyPDFLoader("company_rule.pdf").load()
chunks = RecursiveCharacterTextSplitter(chunk_size=500).split_documents(docs)

# 4. 做成向量库
vectordb = Chroma.from_documents(chunks, OpenAIEmbeddings())

# 5. 创建链
qa = ConversationalRetrievalChain.from_llm(
        llm=ChatOpenAI(temperature=0),
        retriever=vectordb.as_retriever())

# 6. 聊天
chat_history = []
while True:
    q = input("你:")
    ans = qa({"question":q, "chat_history":chat_history})
    print("AI:", ans["answer"])
    chat_history.append((q, ans["answer"]))

小白学大模型 —— LangChain在AI中应用

跑起来后,你就可以问PDF里面的内容:
“年假几天?” → AI 从 PDF 里找到答案并回答。

三、原理讲解

1️⃣ 把长资料切成小块
像把一本书撕成一页一页,方便快速翻到相关页。

2️⃣ 把文字变成“数字密码”(向量)
用 OpenAI / BGE 模型把每页文字变成一个 1024 维的点,语义相近的点挨得近。

3️⃣ 搜索 + 问答
你提的问题也变成一个点 → 在库里找最近的 N 个点 → 把对应文字喂给大模型 → 大模型组织答案。

4️⃣ Chain vs Agent 必定要理解Chain和Agent的区别
• Chain:像“做菜流程图”,先洗菜→再切菜→再炒。
• Agent:像“会思考的小厨师”,发现没盐了自己去柜子拿。

下面层层拆解下,想象下如果没有LangChain的时候我们如何处理PDF的呢?

  1. 先把 PDF/网页切成块,按照字数,或者按照页码拆分。
  2. 调 OpenAI Embedding 把块变成向量
  3. 把向量塞进向量库(Faiss )
  4. 用户提问 → 向量化 → 在库里搜 Top-k → 把结果拼成 prompt → 调 gpt → 拿到回答
  5. 还要写循环、维护历史记录、处理异常、切换模型……

这些步骤每一步都要自己写胶水代码去粘连下一步,LangChain 说:“我来帮你把胶水写好,你只关心搭积木。” 也就是你只需要写model,然后每个模块按照自己的想法摆放顺序后,让LangChain直接连到一起即可。

LangChain 的 5 条核心抽象
下面 5 个词在任何一段 LangChain 代码里都会出现,先混个眼熟。

抽象

比喻

真实作用

Document

一张小纸条

一段文本 + 元数据(来源、页码等)

VectorStore

抽屉柜

存 & 取向量的地方(Chroma、FAISS、Pinecone…)

Retriever

图书管理员

接收问题 → 在抽屉柜里找出最相关纸条

Chain

流水线传送带

把“输入 → 若干步骤 → 输出”串起来

Agent

带脑子的小秘书

先思考“我需要哪几个工具”,再一步步调用

一条典型的 RAG Chain 在 LangChain 里到底发生了什么?
下面用伪代码 + 时序图,把刚才 python代码示例拆开:

① 加载 PDF → ② 切分 → ③ 向量化 → ④ 存库 → ⑤ 用户提问 → ⑥ 检索 → ⑦ 拼 prompt → ⑧ 调大模型 → ⑨ 返回答案

复制

┌─────────────┐
│ PyPDFLoader │ ① 把 PDF 变成 List[Document]
└────┬────────┘
     │
┌────▼────────┐
│TextSplitter │ ② 切成更小 List[Document]
└────┬────────┘
     │
┌────▼────────┐
│OpenAIEmbeddings│ ③ 把每段变成向量
└────┬────────┘
     │
┌────▼────────┐
│  Chroma     │ ④ 存进向量库(内部调用 FAISS)
└────┬────────┘
     │
┌────▼────────┐
│Conversational│ ⑥ Retriever 拿用户问题 → 找 Top-k
│RetrievalChain│ ⑦ 把 Top-k 拼成 Prompt 模板
│             │ ⑧ 调 ChatOpenAI → 拿到 answer
└────┬────────┘
     │
    ⑨ 返回给用户

小白学大模型 —— LangChain在AI中应用

每一步 LangChain 都帮你写好了“默认模板”,你可以随时换掉其中任意一块。

Chain & Agent 的决策逻辑(重点看源码)

  1. Chain 的 run() 方法实则就是一个 Python 函数:
  2. def _call(inputs): docs = self.retriever.get_relevant_documents(inputs[“question”]) context = ”
    “.join([d.page_content for d in docs]) prompt = self.prompt_template.format(context=context, question=inputs[“question”]) answer = self.llm(prompt) return {“answer”: answer}
  3. 这就是“流水线”——固定步骤、不拐弯。
  4. Agent 的 run() 方法则是一个 while 循环:
  5. while not done: action = self.agent.plan(intermediate_steps) # LLM 决定下一步调哪个工具 observation = tool.run(action.tool_input) # 真正去查 API / 数据库 intermediate_steps.append((action, observation))
  6. LangChain 内置了 ZeroShotAgent, ReAct, OpenAIFunctionsAgent 等不同策略,它们只是 prompt 模板不同而已。
    ZeroShotAgent prompt:“You have access to tools: Search, Calculator… Think step by step.”
    OpenAIFunctionsAgent prompt:利用 GPT-3.5/4 的 function_call 原生能力,省掉解析步骤。

Prompt Template 与 Memory 的细节

Prompt Template = 带占位符的字符串

template = """Use the following pieces of context to answer the question.
Context: {context}
Question: {question}
Helpful Answer:"""

小白学大模型 —— LangChain在AI中应用

LangChain 用 Python 的 str.format() 或 Jinja2 渲染,你可以随时插入 {chat_history}、{today} 等变量。

Memory = 在多次调用之间缓存对话历史
本质是维护一个 List[HumanMessage, AIMessage],在每一次 _call 时把历史拼进 prompt。
不同实现:
• ConversationBufferMemory(全记住,耗 token)
• ConversationSummaryMemory(让 LLM 先总结,省 token,大部分对话用的是这种模式)

VectorStoreRetrieverMemory(把历史向量化,按相关性召回)

用户问题 → Prompt Template → LLM → 工具/Retriever → 结果 → Prompt Template → LLM → 回答
                    ↑Memory 提供历史/变量

小白学大模型 —— LangChain在AI中应用

LangChain 只是把“胶水 + 模板 + 抽象”三件事做到极致,让你 几行代码就能跑通上面整个循环。

还是那句话,AI应用工程师,懂这个是什么会用就行,在日常使用中,如果你需要定制化,说不定都用不着LangChain,或者私人定制一套LangChain。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...