LangChain从入门到精通
全面介绍LangChain的核心概念、基础组件和实战应用,帮助你构建强大的AI应用
LangChain 是一个强大的框架,专门用于开发由语言模型驱动的应用程序。本文将从基础开始,逐步深入,帮助你全面掌握 LangChain 的使用。
什么是 LangChain?
LangChain 是一个用于构建 LLM(大语言模型)应用的框架,它提供了以下核心优势:
- 模块化设计: 提供了可重用的组件,便于构建复杂的 AI 应用
- 链式处理: 可以将多个组件串联起来,构建复杂的处理流程
- 灵活集成: 支持多种 LLM 模型和外部工具的集成
- 场景丰富: 内置多种应用场景的解决方案
快速开始
首先,让我们安装 LangChain 并创建一个简单的应用:
# 安装必要的包
pip install langchain openai
# 基础示例
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
# 初始化 LLM
llm = OpenAI(temperature=0.7)
# 创建提示模板
prompt = PromptTemplate(
input_variables=["topic"],
template="给我讲一个关于{topic}的笑话。"
)
# 创建链
chain = LLMChain(llm=llm, prompt=prompt)
# 运行
result = chain.run(topic="程序员")
print(result)
核心概念
1. Prompts(提示)
Prompts 是与 LLM 交互的基础:
from langchain.prompts import (
PromptTemplate,
ChatPromptTemplate,
SystemMessagePromptTemplate
)
# 基础提示模板
prompt = PromptTemplate(
input_variables=["product"],
template="写一个关于{product}的产品描述"
)
# 对话提示模板
system_template = "你是一个专业的{role}"
system_prompt = SystemMessagePromptTemplate.from_template(system_template)
human_template = "{question}"
chat_prompt = ChatPromptTemplate.from_messages([
system_prompt,
("human", human_template)
])
2. Chains(链)
Chains 允许我们将多个组件组合成一个处理流程:
from langchain.chains import SimpleSequentialChain, LLMChain
# 创建两个链
chain1 = LLMChain(
llm=llm,
prompt=PromptTemplate(
input_variables=["topic"],
template="生成一个关于{topic}的标题"
)
)
chain2 = LLMChain(
llm=llm,
prompt=PromptTemplate(
input_variables=["title"],
template="根据标题'{title}'写一篇短文"
)
)
# 组合成顺序链
overall_chain = SimpleSequentialChain(
chains=[chain1, chain2],
verbose=True
)
# 运行
result = overall_chain.run("人工智能")
3. Memory(记忆)
Memory 组件允许 Chains 保持对话上下文:
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 创建带记忆的对话链
conversation = ConversationChain(
llm=llm,
memory=ConversationBufferMemory(),
verbose=True
)
# 进行对话
conversation.predict(input="你好!")
conversation.predict(input="我们刚才在聊什么?")
高级应用
1. 文档问答系统
构建一个能够回答文档相关问题的系统:
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 加载文档
loader = TextLoader('document.txt')
documents = loader.load()
# 分割文本
text_splitter = CharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
texts = text_splitter.split_documents(documents)
# 创建向量存储
embeddings = OpenAIEmbeddings()
db = Chroma.from_documents(texts, embeddings)
# 创建问答链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever()
)
# 提问
query = "文档的主要内容是什么?"
qa_chain.run(query)
2. 代理系统
使用 Agent 来动态决定使用什么工具:
from langchain.agents import load_tools, initialize_agent
from langchain.agents import AgentType
# 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# 初始化代理
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 运行代理
agent.run("今天的日期是什么?计算 2023 减去今年是多少年?")
3. 自定义工具
创建自定义工具扩展 Agent 的能力:
from langchain.tools import Tool
from langchain.agents import tool
@tool
def get_weather(location: str) -> str:
"""获取指定位置的天气信息"""
# 实现天气查询逻辑
return f"{location}的天气晴朗,温度25度"
# 创建工具列表
tools = [
Tool(
name="Weather",
func=get_weather,
description="获取天气信息"
)
]
# 使用自定义工具初始化代理
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
最佳实践
1. 提示工程
编写有效的提示模板:
# 使用 Few-shot 学习
few_shot_prompt = PromptTemplate(
input_variables=["input", "examples"],
template="""
示例:
{examples}
现在,请处理以下输入:
{input}
"""
)
2. 错误处理
实现健壮的错误处理机制:
from langchain.callbacks import BaseCallbackHandler
class ErrorHandler(BaseCallbackHandler):
def on_llm_error(self, error: Exception, **kwargs):
print(f"LLM 错误: {error}")
# 实现错误处理逻辑
def on_chain_error(self, error: Exception, **kwargs):
print(f"Chain 错误: {error}")
# 实现错误处理逻辑
3. 性能优化
优化 LangChain 应用的性能:
# 使用缓存
from langchain.cache import InMemoryCache
import langchain
langchain.llm_cache = InMemoryCache()
# 批量处理
async def batch_process(queries):
tasks = [chain.arun(query) for query in queries]
return await asyncio.gather(*tasks)
实际应用场景
1. 智能客服系统
from langchain.chains import ConversationalRetrievalChain
def create_customer_service():
# 加载知识库
docs = load_knowledge_base()
# 创建向量存储
vectorstore = Chroma.from_documents(docs, embeddings)
# 创建对话链
chain = ConversationalRetrievalChain.from_llm(
llm,
vectorstore.as_retriever(),
memory=ConversationBufferMemory()
)
return chain
2. 文档摘要生成
from langchain.chains.summarize import load_summarize_chain
def generate_summary(document):
# 加载文档
docs = text_splitter.split_documents([document])
# 创建摘要链
chain = load_summarize_chain(llm, chain_type="map_reduce")
# 生成摘要
summary = chain.run(docs)
return summary
结语
LangChain 是一个强大而灵活的框架,它极大地简化了 AI 应用的开发过程。通过本文的学习,你应该已经掌握了:
- LangChain 的基础概念和核心组件
- 如何构建各种类型的 AI 应用
- 高级特性的使用方法
- 实际应用场景的实现方案
随着 AI 技术的不断发展,LangChain 也在持续进化,建议定期关注官方文档以了解最新特性和最佳实践。
记住,构建 AI 应用不仅需要了解技术细节,还需要考虑实际应用场景和用户需求。希望这篇教程能够帮助你在 AI 应用开发的道路上走得更远。
评论