LangChain入门:构建LLM应用链

最近 LLM 应用开发火了,LangChain 成了最流行的框架。这篇梳理它的核心概念,用几个例子快速上手。

LangChain 解决什么问题

直接调 OpenAI API 写一个 chatbot 很简单,但真正做应用会碰到很多问题:Prompt 管理、上下文记忆、外部工具调用、多步推理编排。LangChain 把这些封装成了标准化的组件。

核心概念:

  • LLM/ChatModel:底层模型的统一接口
  • PromptTemplate:Prompt 模板,支持变量替换
  • Chain:将 Prompt + LLM 串联起来的调用链
  • Agent:让 LLM 自主决定调用哪些工具
  • Memory:对话记忆管理
  • Tool:外部工具(搜索、计算器、数据库等)

PromptTemplate

from langchain.prompts import PromptTemplate

template = PromptTemplate(
    input_variables=["product"],
    template="给{product}写一个简短的广告语,不超过20个字。"
)

prompt = template.format(product="蓝牙耳机")
print(prompt)
# 输出:给蓝牙耳机写一个简短的广告语,不超过20个字。

LLMChain

把 Prompt 和模型组合起来:

from langchain.llms import OpenAI
from langchain.chains import LLMChain

llm = OpenAI(temperature=0.7)
chain = LLMChain(llm=llm, prompt=template)

result = chain.run("蓝牙耳机")
print(result)  # 模型生成的广告语

SequentialChain

多步串联,前一步的输出作为后一步的输入:

from langchain.chains import SequentialChain

# 第一步:生成产品描述
desc_template = PromptTemplate(
    input_variables=["product"],
    template="用一段话描述{product}的核心卖点。"
)
desc_chain = LLMChain(llm=llm, prompt=desc_template, output_key="description")

# 第二步:基于描述生成广告语
ad_template = PromptTemplate(
    input_variables=["description"],
    template="基于以下产品描述,写一句20字以内的广告语:\n{description}"
)
ad_chain = LLMChain(llm=llm, prompt=ad_template, output_key="ad_copy")

# 组合
overall = SequentialChain(
    chains=[desc_chain, ad_chain],
    input_variables=["product"],
    output_variables=["description", "ad_copy"]
)

result = overall({"product": "智能手表"})
print(result["ad_copy"])

简单 QA 链

基于文档的问答是 LangChain 最常见的用例:

from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA

# 1. 加载文档
loader = TextLoader("knowledge.txt")
docs = loader.load()

# 2. 切分
splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)

# 3. 向量化并存储
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(chunks, embeddings)

# 4. 构建 QA 链
qa = RetrievalQA.from_chain_type(
    llm=OpenAI(),
    chain_type="stuff",
    retriever=db.as_retriever()
)

answer = qa.run("这个项目用了什么技术栈?")
print(answer)

小结

LangChain 的抽象层做得不错,能快速搭建 LLM 应用原型。但它更新非常快,API 经常变,文档也时常跟不上。建议先理解核心概念,具体 API 以官方文档为准。