LangChain核心概念:Model I/O、Retrieval、Chains
核心知识点讲解
什么是LangChain?
LangChain是一个专为构建基于大语言模型(LLM)的应用程序而设计的框架。它提供了一套工具、组件和接口,使开发者能够更轻松地构建复杂的AI应用,特别是智能体系统。
LangChain的核心概念
LangChain的设计围绕几个核心概念展开,这些概念构成了其模块化架构的基础:
1. Model I/O(模型输入输出)
Model I/O模块负责处理与语言模型的交互,包括:
- 提示词模板(Prompt Templates):标准化和可重用的提示词结构
- 语言模型(Language Models):对各种LLM API的统一封装
- 输出解析器(Output Parsers):将模型输出转换为结构化数据
2. Retrieval(检索)
Retrieval模块专注于从外部数据源获取相关信息,包括:
- 文档加载器(Document Loaders):从各种来源加载文档
- 文档分割器(Document Transformers):将长文档分割成可管理的块
- 向量存储(Vector Stores):存储和检索嵌入向量
- 检索器(Retrievers):根据查询检索相关文档
3. Chains(链)
Chains模块允许将多个组件组合在一起,形成完整的工作流程:
- 基础链(Simple Chains):顺序执行的组件序列
- 复合链(Composite Chains):多个链的组合
- 路由链(Router Chains):根据输入选择不同的链
实用案例分析
案例1:使用Model I/O构建简单的问答系统
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
from langchain.output_parsers import ResponseSchema, StructuredOutputParser
# 1. 定义响应模式
response_schemas = [
ResponseSchema(name="answer", description="问题的答案"),
ResponseSchema(name="confidence", description="答案的置信度,范围0-100")
]
# 2. 创建输出解析器
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
# 3. 定义提示词模板
prompt_template = PromptTemplate(
template="请回答以下问题,并提供你的置信度(0-100):\n\n问题:{question}\n\n{format_instructions}",
input_variables=["question"],
partial_variables={"format_instructions": output_parser.get_format_instructions()}
)
# 4. 初始化语言模型
llm = OpenAI(temperature=0.7)
# 5. 构建链(手动)
def qa_chain(question):
# 生成提示词
prompt = prompt_template.format(question=question)
# 获取模型响应
response = llm(prompt)
# 解析输出
parsed_response = output_parser.parse(response)
return parsed_response
# 测试
result = qa_chain("什么是LangChain?")
print(f"答案:{result['answer']}")
print(f"置信度:{result['confidence']}")案例2:使用Retrieval构建基于文档的问答系统
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
from langchain.llms import OpenAI
# 1. 加载文档
loader = TextLoader("docs/ai_agent_intro.txt")
documents = loader.load()
# 2. 分割文档
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 3. 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)
# 4. 创建检索器
retriever = vectorstore.as_retriever()
# 5. 构建检索QA链
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
# 测试
query = "AI智能体的核心组件是什么?"
result = qa_chain({"query": query})
print(f"答案:{result['result']}")
print(f"来源文档:{[doc.metadata for doc in result['source_documents']]}")案例3:使用Chains组合多个组件
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
from langchain.chains import LLMChain, SimpleSequentialChain
# 1. 第一个链:生成问题
prompt1 = PromptTemplate(
input_variables=["topic"],
template="为{topic}生成一个有趣的问题:"
)
chain1 = LLMChain(llm=OpenAI(), prompt=prompt1)
# 2. 第二个链:回答问题
prompt2 = PromptTemplate(
input_variables=["question"],
template="回答以下问题:{question}"
)
chain2 = LLMChain(llm=OpenAI(), prompt=prompt2)
# 3. 组合成顺序链
overall_chain = SimpleSequentialChain(chains=[chain1, chain2], verbose=True)
# 测试
result = overall_chain.run("人工智能")
print(f"最终结果:{result}")代码解析
Model I/O 模块
提示词模板:通过
PromptTemplate类,我们可以创建可重用的提示词结构,支持变量替换,使提示词更加灵活。语言模型:LangChain封装了各种LLM API,如OpenAI、Hugging Face等,提供统一的接口,使切换模型变得简单。
输出解析器:
StructuredOutputParser等解析器可以将模型的自由文本输出转换为结构化数据(如JSON),方便后续处理。
Retrieval 模块
文档加载:
TextLoader等加载器支持从各种来源(文件、网页、数据库等)加载文档。文档分割:
CharacterTextSplitter等分割器将长文档分割成小块,以便于嵌入和检索。向量存储:
Chroma等向量存储用于存储文档嵌入,并支持高效的相似性搜索。检索器:检索器封装了向量存储的查询逻辑,提供简单的接口来获取相关文档。
Chains 模块
LLMChain:最基本的链,将提示词模板和语言模型组合在一起。
SimpleSequentialChain:按顺序执行多个链,将一个链的输出作为下一个链的输入。
RetrievalQA:专门用于基于检索的问答任务,将检索器和语言模型组合在一起。
总结
LangChain的核心概念(Model I/O、Retrieval、Chains)提供了一种模块化、可组合的方式来构建基于LLM的应用。通过这些概念,我们可以:
- 更有效地与语言模型交互
- 轻松集成外部知识源
- 构建复杂的工作流程
这些概念为我们后续构建更复杂的智能体系统奠定了基础。在接下来的几集中,我们将深入探讨LangChain的更多高级特性,以及如何使用它来构建功能强大的AI智能体。
课后思考
- LangChain的模块化设计有什么优势?
- 如何根据具体任务选择合适的Chain类型?
- 除了本集介绍的组件,LangChain还提供了哪些其他有用的组件?
在下一集中,我们将深入探讨LangChain中的模型封装与输出解析器,进一步掌握LangChain的核心功能。