基于LangChain构建AI应用入门指南

LangChain 是围绕大型语言模型(LLMs)构建应用的强大框架,适合开发问答系统、聊天机器人、自动化工具等。本指南从 环境配置完整项目示例,逐步覆盖核心功能与实战技巧。


一、LangChain 核心概念

  1. LLM(Large Language Model)
    如 OpenAI GPT、Llama 等,负责生成文本。
  2. 链(Chains)
    将多个任务组合成流程(如「提问 → 调用工具 → 总结」)。
  3. 记忆(Memory)
    维护上下文信息,支持多轮对话。
  4. 代理(Agents)
    让 LLM 自主决定调用哪些工具(如搜索、计算)。
  5. 向量数据库(Vector Stores)
    结合外部数据(文档、知识库)实现精准回答。

二、环境搭建

  1. 安装依赖
    确保 Python≥3.8,安装 LangChain 和 LLM 提供方(如 OpenAI):
    1
    2
    3
    pip install langchain openai python-dotenv
    # 按需添加其他工具(如向量数据库、PDF解析库)
    pip install faiss-cpu pypdf chromadb tiktoken
  2. 配置密钥
    创建 .env 文件保存密钥(如 OpenAI):
    1
    2
    OPENAI_API_KEY="sk-xxx"      # OpenAI
    SERPAPI_API_KEY="serpapi-key" # SerpAPI(搜索引擎工具)

三、基础步骤:构建问答流程

1. 初始化 LLM 并提问

1
2
3
4
5
6
7
8
from langchain.llms import OpenAI
from dotenv import load_dotenv

load_dotenv()
llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0.5)

response = llm("用一句话解释量子纠缠。")
print(response)

2. 定义 Prompt 模板

1
2
3
4
5
6
7
8
9
from langchain.prompts import PromptTemplate

template = """你是一个物理学教授,用通俗易懂的例子解释 {concept}。
要求:① 不超过100字 ② 包含一个生活案例"""
prompt = PromptTemplate(input_variables=["concept"], template=template)

formatted_prompt = prompt.format(concept="相对论")
response = llm(formatted_prompt)
print(response)

四、进阶功能:链(Chains)

1. 构建多步处理链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from langchain.chains import LLMChain

# 自定义 Prompt 链
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run("黑洞")
print(result)

# 组合多个链
from langchain.chains import SimpleSequentialChain

chain1 = LLMChain(llm=llm, prompt=PromptTemplate(
input_variables=["topic"],
template="总结 {topic} 的三大核心特点。"
))
chain2 = LLMChain(llm=llm, prompt=PromptTemplate(
input_variables=["features"],
template="将这些特点转化为科普短视频脚本:{features}"
))

combined_chain = SimpleSequentialChain(chains=[chain1, chain2], verbose=True)
final_output = combined_chain.run("量子计算机")
print(final_output)

五、记忆(Memory)与对话

1. 保留对话上下文

1
2
3
4
5
6
7
from langchain.memory import ConversationBufferWindowMemory

memory = ConversationBufferWindowMemory(k=3) # 保留最近3轮对话
conversation = ConversationChain(llm=llm, memory=memory)

print(conversation.run("如何用Python实现快速排序?"))
print(conversation.run("能详细说明每一步的作用吗?")) # 依赖上文

六、代理(Agents)与工具

1. 让模型自主调用工具

1
2
3
4
5
6
7
8
9
10
11
from langchain.agents import initialize_agent, load_tools

tools = load_tools(["serpapi", "llm-math"], llm=llm) # 搜索 + 数学工具
agent = initialize_agent(
tools,
llm,
agent="zero-shot-react-description",
verbose=True
)

agent.run("阿里巴巴集团2023年的营收是多少人民币?换算成美元是多少?")

输出示例

1
2
3
4
Action: Search阿里巴巴集团2023年营收
Observation: 阿里巴巴2023年营收8686亿人民币
Action: Calculator将8686亿人民币换算成美元(汇率1:7.2)
Final Answer: 阿里巴巴2023年营收约1206.39亿美元

七、结合外部数据(RAG)

1. 构建私有知识库问答系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS

# 从网页加载数据
loader = WebBaseLoader("https://news.cn/tech/20240401/article123.html")
documents = loader.load()

# 分割文本
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200
)
texts = text_splitter.split_documents(documents)

# 创建向量数据库
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(texts, embeddings)

# 结合检索的问答链
query = "文章提到哪些AI技术突破?"
retrieved_docs = db.similarity_search(query)
print(retrieved_docs[0].page_content[:300] + "...")

八、实战项目:合同分析助手

目标:上传 PDF 合同,自动回答关键条款问题。

1. 数据预处理

1
2
3
4
5
6
7
8
9
10
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter

# 加载 PDF 合同
loader = PyPDFLoader("contract.pdf")
pages = loader.load()

# 分割文本
text_splitter = CharacterTextSplitter(chunk_size=2000)
docs = text_splitter.split_documents(pages)

2. 构建完整流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from langchain.chains import RetrievalQA

# 创建检索式问答链
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)

# 提问
question = "合同中约定的违约金比例是多少?"
result = qa({"query": question})

print(f"答案:{result['result']}")
print("来源条款:", result['source_documents'][0].page_content)

九、部署与优化

1. 使用 FastAPI 搭建 API 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Query(BaseModel):
question: str

@app.post("/ask")
async def answer_question(query: Query):
result = qa({"query": query.question})
return {
"answer": result["result"],
"sources": [doc.page_content[:200] for doc in result["source_documents"]]
}

启动服务:

1
uvicorn main:app --reload

2. 性能优化技巧

  • 缓存嵌入向量:避免重复计算文档嵌入
  • 批量处理请求:利用 batch_generate 提升效率
  • 错误重试机制:处理 API 调用失败
1
2
3
4
5
from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(3))
def safe_llm_call(prompt):
return llm(prompt)

十、避坑指南

  1. Token 超限
    • 设置 max_tokens 参数限制输出长度
  2. 响应慢
    • 使用 model="gpt-3.5-turbo" 替换 gpt-4
    • 简化提示词(减少不必要修饰语)
  3. 数据泄露风险
    • 避免向 OpenAI 传输敏感数据(使用本地模型如 Llama)

十一、扩展应用场景

  1. 自动化报告生成
    • 接入数据库,自动分析数据并生成结论
  2. 企业知识库引擎
    • 整合 Confluence、Notion 等平台数据
  3. 智能客服系统
    • 结合对话历史和用户画像定制回复

通过以上步骤,你可以逐步构建一个功能完善的 AI 应用(如简历解析器、行业研报生成器、智能客服),涵盖从模型调用到部署的完整流程。如果需要更详细的代码示例或高级功能(如代理工具集成),可以参考 LangChain 官方文档 或相关教程。