LangChain基础用法详解
LangChain是一个强大的框架,用于开发由大语言模型(LLM)驱动的应用程序。它提供了丰富的工具和抽象,让开发者能够轻松构建复杂的AI应用。本文将详细介绍LangChain的核心概念和基础用法。
1. 安装与环境配置
首先,安装LangChain:
pip install langchain
pip install openai # 以OpenAI为例
配置环境变量:
import os
os.environ["OPENAI_API_KEY"] = "your-api-key-here"
2. 核心概念
LangChain有以下几个核心组件:
- Models:大语言模型(如GPT-4、Claude等)
- Prompts:提示词模板
- Chains:链式调用组件
- Memory:记忆组件
- Agents:智能代理
3. 基本模型调用
3.1 文本生成模型
from langchain.llms import OpenAI
# 创建模型实例
llm = OpenAI(temperature=0.7, model_name="gpt-3.5-turbo")
# 直接调用
response = llm("介绍一下Python编程语言")
print(response)
3.2 聊天模型
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
chat = ChatOpenAI(temperature=0)
messages = [
SystemMessage(content="你是一个Python编程专家"),
HumanMessage(content="请解释什么是装饰器")
]
response = chat(messages)
print(response.content)
4. 提示词模板
4.1 基础模板
from langchain.prompts import PromptTemplate
template = """
请用{language}写一个{function}函数:
- 功能:{description}
- 输入参数:{inputs}
"""
prompt = PromptTemplate(
input_variables=["language", "function", "description", "inputs"],
template=template
)
# 格式化模板
formatted_prompt = prompt.format(
language="Python",
function="计算器",
description="实现基本的加减乘除运算",
inputs="两个数字和一个运算符"
)
print(formatted_prompt)
4.2 聊天模板
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.schema import SystemMessage
chat_template = ChatPromptTemplate.from_messages([
SystemMessage(content="你是一个{role}专家"),
HumanMessagePromptTemplate.from_template("请解释{topic}的概念")
])
messages = chat_template.format_messages(
role="机器学习",
topic="决策树"
)
5. 链(Chains)
5.1 简单链
from langchain.chains import LLMChain
# 创建链
chain = LLMChain(
llm=llm,
prompt=prompt
)
# 执行链
result = chain.run(
language="Python",
function="排序",
description="对列表进行排序",
inputs="一个数字列表"
)
print(result)
5.2 顺序链
from langchain.chains import SimpleSequentialChain
# 第一个链:生成问题
chain1 = LLMChain(
llm=llm,
prompt=PromptTemplate(
input_variables=["topic"],
template="生成一个关于{topic}的问题"
)
)
# 第二个链:回答问题
chain2 = LLMChain(
llm=llm,
prompt=PromptTemplate(
input_variables=["question"],
template="请回答这个问题:{question}"
)
)
# 组合链
overall_chain = SimpleSequentialChain(
chains=[chain1, chain2],
verbose=True
)
result = overall_chain.run("人工智能")
6. 记忆组件
6.1 对话记忆
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 多轮对话
conversation.predict(input="你好,我叫张三")
conversation.predict(input="你还记得我叫什么吗?")
6.2 其他记忆类型
from langchain.memory import ConversationSummaryMemory, ConversationBufferWindowMemory
# 摘要记忆
summary_memory = ConversationSummaryMemory(llm=llm)
# 窗口记忆(只保留最近N轮对话)
window_memory = ConversationBufferWindowMemory(k=3)
7. 文档加载与处理
7.1 加载文档
from langchain.document_loaders import TextLoader, PDFLoader, WebBaseLoader
# 加载文本文件
text_loader = TextLoader("example.txt")
documents = text_loader.load()
# 加载PDF文件(需要安装PyPDF2)
# pdf_loader = PDFLoader("document.pdf")
# 加载网页内容
web_loader = WebBaseLoader("https://example.com")
7.2 文本分割
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len
)
chunks = text_splitter.split_documents(documents)
8. 向量存储与检索
8.1 创建向量存储
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)
8.2 检索问答
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
response = qa_chain.run("文档中提到了什么重要概念?")
9. 代理(Agents)
9.1 创建代理
from langchain.agents import create_react_agent, Tool
from langchain.agents import AgentExecutor
from langchain.tools import tool
@tool
def calculate(expression: str) -> str:
"""执行数学计算"""
return str(eval(expression))
tools = [calculate]
agent = create_react_agent(
llm=llm,
tools=tools,
prompt=... # 需要合适的提示词模板
)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True
)
result = agent_executor.run("计算 23 * 45 的结果")
9.2 预构建代理
from langchain.agents import load_tools, initialize_agent, AgentType
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
response = agent.run("搜索最新的AI新闻并总结")
10. 实践示例:完整的问答系统
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SimpleSequentialChain
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
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
class SimpleQA:
def __init__(self, llm_api_key=None):
self.llm = OpenAI(temperature=0)
self.memory = ConversationBufferMemory()
def load_document(self, file_path):
loader = TextLoader(file_path)
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
self.vectorstore = FAISS.from_documents(texts, embeddings)
self.qa_chain = RetrievalQA.from_chain_type(
llm=self.llm,
chain_type="stuff",
retriever=self.vectorstore.as_retriever()
)
def ask(self, question):
return self.qa_chain.run(question)
# 使用示例
qa_system = SimpleQA()
qa_system.load_document("knowledge_base.txt")
answer = qa_system.ask("这个文档的主要内容是什么?")
print(answer)
11. 最佳实践
- 提示词设计:清晰的提示词能显著提升模型输出质量
- 错误处理:添加try-catch处理API调用异常
- 速率限制:注意API调用频率限制
- 缓存策略:对重复查询使用缓存
- 日志记录:记录关键操作和错误信息
结语
LangChain提供了构建LLM应用所需的所有基础组件。从简单的模型调用到复杂的多步骤工作流,它都能很好地支持。掌握这些基础用法后,你可以进一步探索更高级的特性,如流式处理、回调机制、自定义工具等。
记住,好的实践是循序渐进地学习和使用,从简单的链开始,逐步增加复杂性。随着你对LangChain的理解加深,你将能构建出更加智能和强大的AI应用。