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 模块

  1. 提示词模板:通过PromptTemplate类,我们可以创建可重用的提示词结构,支持变量替换,使提示词更加灵活。

  2. 语言模型:LangChain封装了各种LLM API,如OpenAI、Hugging Face等,提供统一的接口,使切换模型变得简单。

  3. 输出解析器StructuredOutputParser等解析器可以将模型的自由文本输出转换为结构化数据(如JSON),方便后续处理。

Retrieval 模块

  1. 文档加载TextLoader等加载器支持从各种来源(文件、网页、数据库等)加载文档。

  2. 文档分割CharacterTextSplitter等分割器将长文档分割成小块,以便于嵌入和检索。

  3. 向量存储Chroma等向量存储用于存储文档嵌入,并支持高效的相似性搜索。

  4. 检索器:检索器封装了向量存储的查询逻辑,提供简单的接口来获取相关文档。

Chains 模块

  1. LLMChain:最基本的链,将提示词模板和语言模型组合在一起。

  2. SimpleSequentialChain:按顺序执行多个链,将一个链的输出作为下一个链的输入。

  3. RetrievalQA:专门用于基于检索的问答任务,将检索器和语言模型组合在一起。

总结

LangChain的核心概念(Model I/O、Retrieval、Chains)提供了一种模块化、可组合的方式来构建基于LLM的应用。通过这些概念,我们可以:

  1. 更有效地与语言模型交互
  2. 轻松集成外部知识源
  3. 构建复杂的工作流程

这些概念为我们后续构建更复杂的智能体系统奠定了基础。在接下来的几集中,我们将深入探讨LangChain的更多高级特性,以及如何使用它来构建功能强大的AI智能体。

课后思考

  1. LangChain的模块化设计有什么优势?
  2. 如何根据具体任务选择合适的Chain类型?
  3. 除了本集介绍的组件,LangChain还提供了哪些其他有用的组件?

在下一集中,我们将深入探讨LangChain中的模型封装与输出解析器,进一步掌握LangChain的核心功能。

« 上一篇 原生调用OpenAI API实现简单的"反射"智能体 下一篇 » 深入LangChain:模型封装与输出解析器