文章目录
LangChain本质上就是对各种大模型提供的API的套壳,是为了方便我们使用这些API,搭建起来的一些框架、模块和接口。
一. 架构
LangChain 简化了LLM应用程序生命周期的每个阶段:
二. 快速入门
快速入门中我们将学到如下技能
- 将从一个简单的LLM链开始,它只依赖于提示模板中的信息来回复。
- 我们将添加聊天记录,以创建一个对话检索链。这使您可以以聊天方式与此LLM进行交互,因此它会记住以前的问题。
- 我们将构建一个代理,该代理利用LLM来确定是否需要获取数据来回答问题。
- 使用LangServe为您的应用程序提供服务
1. LLM Chain:LLM问答步骤串联成链
实现了:
- langchain调用openai
- 使用OpenApi进行模型对话
- 通过(提示模版)设置system来指导chat回答
- 将上面的步骤组成调用链,以便调用
- 输出解析器:使用字符提取器提取回答
from langchain_openai import ChatOpenAI
# 1. 调用大模型
# 通过langchain设置chatapi
llm = ChatOpenAI()
llm.invoke("how can langsmith help with testing?")
# 2. 使用提示模版:更加专业的回答
# 使用提示模板来指导其回答。 # 提示模板将原始用户输入转换为更好的输入以供LLM使用。
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "You are world class technical documentation writer."),
("user", "{input}")
])
# 3. 引入字符解析器:提取ChatMessage中的回答
from langchain_core.output_parsers import StrOutputParser
output_parser = StrOutputParser()
#4. 将前面三步组成调用链
chain = prompt | llm | output_parser
#5. 链调用
Output = chain.invoke({
"input": "how can langsmith help with testing?"})
# 答案现在将是一个字符串(而不是ChatMessage)。
print(Output)
2. Retrieval Chain: 检索链:检索文档来提供专业材料
2.1. 检索链(利用向量查询提供context)
利用检索器检索文档并给LLM提供上下文
总体思路
为了正确回答原始问题(“langsmith如何帮助测试?”),我们需要为LLM提供附加上下文。我们可以通过检索来实现这一点。
- 我们可以把数据传递给LLM,检索工具仅搜索(HOW?)相关数据并传递给LLM。
- 我们从检索器中查找相关文档,然后将它们传递给
提示符prompt
。检索器可以由任何东西支持一个SQL表、互联网等
。在本例中,我们将填充一个向量存储并将其用作检索器。
有关向量存储的更多信息,请参阅此文档。
加载数据 加载数据:使用BeautifulSoup(opens in a new tab)加载网页数据
shell pip install beautifulsoup4
数据加载到向量存储中生成索引
创建文档链:用来创建问答链
基于文本链与检索器创建检索链,这样就能基于文档来回答具体问题。
# 1. 加载要索引的数据。
# 使用WebBaseLoader加载网页数据
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://docs.smith.langchain.com/user_guide")
docs = loader.load()
# 2. 文档分片,并通过向量存储构建文档索引
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
# FAISS:轻量化的本地存储
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
#文档分片
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
# 分片数据添加索引
vector = FAISS.from_documents(documents, embeddings)
# 3. 创建文本检索链(prompt+llm),来接收文档和问题
# 现在,我们在向量存储中索引了这些数据,我们将创建一个检索链。该链将接收一个输入问题,查找相关文档,然后将这些文档连同原始问题一起传递给LLM,并要求它回答原始问题。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(