Appearance
LangChain 组件
LangChain 由多个核心组件组成,这些组件共同构成了构建 LLM 应用的基础。本节将详细介绍 LangChain 1.2 的主要组件及其功能。
1. 模型(Models)
模型是 LangChain 的核心组件,负责处理文本生成和理解。LangChain 支持多种类型的模型:
语言模型(LLMs)
语言模型是最基本的模型类型,接受文本输入并生成文本输出。
示例代码:使用 OpenAI 的语言模型
python
from langchain_openai import OpenAI
# 初始化语言模型
llm = OpenAI(api_key="your-api-key")
# 生成文本
response = llm("What is LangChain?")
print(response)聊天模型(Chat Models)
聊天模型专门用于对话场景,接受消息列表作为输入并生成消息作为输出。
示例代码:使用 OpenAI 的聊天模型
python
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
# 初始化聊天模型
chat_model = ChatOpenAI(api_key="your-api-key")
# 发送消息
messages = [
SystemMessage(content="You are a helpful assistant"),
HumanMessage(content="What is LangChain?")
]
response = chat_model(messages)
print(response.content)嵌入模型(Embedding Models)
嵌入模型用于将文本转换为向量表示,常用于语义搜索和知识检索。
示例代码:使用 OpenAI 的嵌入模型
python
from langchain_openai import OpenAIEmbeddings
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(api_key="your-api-key")
# 生成嵌入向量
text = "LangChain is a framework for building LLM applications"
embedding = embeddings.embed_query(text)
print(len(embedding)) # 输出向量维度2. 提示词(Prompts)
提示词是指导模型生成特定输出的输入文本。LangChain 提供了提示词模板,使开发者可以更灵活地构建和管理提示词。
提示词模板
提示词模板允许开发者创建可重用的提示词结构,并在运行时填充变量。
示例代码:使用提示词模板
python
from langchain_core.prompts import PromptTemplate
# 创建提示词模板
template = "What is a good name for a {product} company that makes {description}?"
prompt = PromptTemplate(template=template, input_variables=["product", "description"])
# 填充变量
formatted_prompt = prompt.format(product="tech", description="smartphones")
print(formatted_prompt)聊天提示词模板
聊天提示词模板专门用于聊天模型,允许开发者创建结构化的对话提示。
示例代码:使用聊天提示词模板
python
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import HumanMessage, SystemMessage
# 创建聊天提示词模板
chat_template = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant"),
("human", "What is a good name for a {product} company?")
])
# 填充变量
formatted_messages = chat_template.format_messages(product="tech")
print(formatted_messages)3. 链(Chains)
链是将多个组件组合在一起的方式,形成一个完整的工作流。在 LangChain 1.2 中,推荐使用 LCEL(LangChain Expression Language)语法来创建链。
基础链(LCEL)
使用 LCEL 语法,可以通过管道操作符 | 将组件组合在一起。
示例代码:使用 LCEL 创建链
python
from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAI
from langchain_core.output_parsers import StrOutputParser
# 创建提示词模板
template = "What is a good name for a {product} company that makes {description}?"
prompt = PromptTemplate(template=template, input_variables=["product", "description"])
# 初始化语言模型
llm = OpenAI(api_key="your-api-key")
# 创建输出解析器
output_parser = StrOutputParser()
# 使用 LCEL 语法创建链
chain = prompt | llm | output_parser
# 运行链
response = chain.invoke({"product": "tech", "description": "smartphones"})
print(response)复合链(RunnableSequence)
使用 RunnableSequence 可以将多个链按顺序组合,前一个链的输出作为后一个链的输入。
示例代码:使用 RunnableSequence
python
from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableSequence, RunnableParallel
# 初始化语言模型
llm = OpenAI(api_key="your-api-key")
# 创建输出解析器
output_parser = StrOutputParser()
# 创建第一个链
prompt1 = PromptTemplate(
template="What is a good name for a {product} company that makes {description}?",
input_variables=["product", "description"]
)
chain1 = prompt1 | llm | output_parser
# 创建第二个链
prompt2 = PromptTemplate(
template="Write a tagline for a company named {company_name} that makes {description}.",
input_variables=["company_name", "description"]
)
chain2 = prompt2 | llm | output_parser
# 创建组合链
combined_chain = (
RunnableParallel(
company_name=chain1,
description=lambda x: x["description"]
)
| (lambda x: {"company_name": x["company_name"], "description": x["description"]})
| chain2
)
# 运行组合链
response = combined_chain.invoke({"product": "tech", "description": "smartphones"})
print("Tagline:", response)4. 代理(Agents)
代理是能够自主决策和执行任务的组件,它可以使用工具来完成复杂的任务。
示例代码:使用代理
python
from langchain_openai import OpenAI
from langchain.agents import AgentType, initialize_agent, load_tools
# 初始化语言模型
llm = OpenAI(api_key="your-api-key")
# 加载工具
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("What is the current temperature in New York?")
print(response)5. 工具(Tools)
工具是代理可以使用的外部服务或功能,如搜索、计算、数据库查询等。
内置工具
LangChain 提供了多种内置工具,如:
serpapi:用于搜索网络llm-math:用于数学计算python_repl:用于执行 Python 代码wikipedia:用于查询维基百科
自定义工具
开发者也可以创建自定义工具,扩展代理的能力。
示例代码:创建自定义工具
python
from langchain.tools import BaseTool
from langchain_openai import OpenAI
from langchain.agents import AgentType, initialize_agent
from typing import Optional, Type
from pydantic import BaseModel, Field
# 定义工具输入模式
class CalculatorInput(BaseModel):
expression: str = Field(description="数学表达式")
# 创建自定义工具
class CalculatorTool(BaseTool):
name = "calculator"
description = "用于计算数学表达式"
args_schema: Type[BaseModel] = CalculatorInput
def _run(self, expression: str) -> str:
try:
result = eval(expression)
return f"计算结果: {result}"
except Exception as e:
return f"计算错误: {str(e)}"
# 初始化语言模型
llm = OpenAI(api_key="your-api-key")
# 初始化工具
tools = [CalculatorTool()]
# 初始化代理
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 运行代理
response = agent.run("3 + 5 * 2 等于多少?")
print(response)6. 记忆(Memory)
记忆是用于存储和管理会话历史的组件,使 LLM 应用能够保持上下文信息。
使用 RunnableWithMessageHistory(推荐)
在 LangChain 1.2 中,推荐使用 RunnableWithMessageHistory 来管理对话历史。
示例代码:使用 RunnableWithMessageHistory
python
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
# 创建消息历史存储
store = {}
def get_session_history(session_id: str):
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
# 创建提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant."),
MessagesPlaceholder(variable_name="history"),
("human", "{input}")
])
# 初始化模型
llm = ChatOpenAI(api_key="your-api-key")
# 创建输出解析器
output_parser = StrOutputParser()
# 使用 LCEL 语法创建链
chain = prompt | llm | output_parser
# 创建带记忆的链
chain_with_history = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="input",
history_messages_key="history"
)
# 运行链
response1 = chain_with_history.invoke(
{"input": "What is LangChain?"},
config={"configurable": {"session_id": "user_123"}}
)
print("Response 1:", response1)
response2 = chain_with_history.invoke(
{"input": "Can you give me an example?"},
config={"configurable": {"session_id": "user_123"}}
)
print("Response 2:", response2)传统记忆类型(向后兼容)
LangChain 还提供了传统记忆类型,如:
ConversationBufferMemory:简单地存储对话历史ConversationBufferWindowMemory:只保留最近的对话历史ConversationSummaryMemory:对对话历史进行总结
7. 向量存储(Vector Stores)
向量存储用于存储和检索文本的向量表示,是实现语义搜索和知识检索的关键组件。
示例代码:使用向量存储
python
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
# 加载文档
loader = TextLoader("path/to/document.txt")
documents = loader.load()
# 分割文档
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(api_key="your-api-key")
# 创建向量存储
vectorstore = FAISS.from_documents(texts, embeddings)
# 相似度搜索
query = "What is LangChain?"
docs = vectorstore.similarity_search(query)
print(docs[0].page_content)总结
LangChain 的组件系统为构建复杂的 LLM 应用提供了强大的基础。在 LangChain 1.2 中,推荐使用 LCEL 语法来创建链,使用 RunnableWithMessageHistory 来管理对话历史。通过灵活组合这些组件,开发者可以构建各种功能强大的 LLM 应用,如聊天机器人、问答系统、文档分析工具等。
在接下来的章节中,我们将详细介绍如何使用这些组件构建实际的 LLM 应用。