【大模型】LangChain基础学习
前言:LangChain是一个用于构建端到端语言模型应用的框架
目录
- 1. 基础知识
- 2. 基本使用
- 2.1 安装
- 2.2 启动示例
- 2.3 使用prompt
- 2.4 输出解析器
- 3. 相关应用
- 3.1 RAG
- 参考文献
1. 基础知识
六大组件
- 模型(Models):包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。
- 提示模板(Prompts):使提示工程流线化,进一步激发大语言模型的潜力。
- 数据检索(Indexes):构建并操作文档的方法,接受用户的查询并返回最相关的文档,轻松搭建本地知识库。
- 记忆(Memory):通过短时记忆和长时记忆,在对话过程中存储和检索数据,让ChatBot记住你。
- 链(Chains):LangChain中的核心机制,以特定方式封装各种功能,并通过一系列的组合,自动而灵活地完成任务。
- 代理(Agents):另一个LangChain中的核心机制,通过“代理”让大模型自主调用外部工具和内部工具,使智能Agent成为可能。
基本架构
2. 基本使用
2.1 安装
pip install openai
pip install langchain
pip install langchain-openai
注意:
- 如果安装后使用langchain报错如下,说明pydantic版本过高,重新安装这个库,降到1.10.13
pydantic.errors.PydanticUserError: If you use
@root_validator
with pre=False (the default) you MUST specifyskip_on_failure=True
. Note that@root_validator
is deprecated and should be replaced with@model_validator
.
- langchain-openai安装不上,需要python3.8及以上
安装后需要设置openAI环境变量,可以用以下几种方式:
(1)终端
export OPENAI_API_KEY="..."
(2)python代码设置
os.environ["OPENAI_API_KEY"] = "..."
2.2 启动示例
- 示例一:
from langchain.llms import OpenAI
llm = OpenAI(temperature=0.9)
text = "What would be a good company name for a company that makes colorful socks?"
print(llm(text))
- 示例二:
# 初始化模型
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
# 安装并初始化选择的LLM,就可以尝试使用它
llm.invoke(" LangSmith 是什么?")
2.3 使用prompt
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "You are good at math."),
("user", "{input}")
])
chain = prompt | llm
print(chain.invoke({"input": "1+1=?"}))
2.4 输出解析器
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 初始化模型
llm = ChatOpenAI()
# 创建提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "您是世界级的技术文档编写者。"),
("user", "{input}")
])
# 使用输出解析器
output_parser = StrOutputParser()
# 将其添加到上一个链中
chain = prompt | llm | output_parser
# 调用它并提出同样的问题。答案是一个字符串,而不是ChatMessage
chain.invoke({"input": "Langsmith 如何帮助进行测试?"})
3. 相关应用
3.1 RAG
- 加载数据
- 转为embedding存储
- 查询操作转为对应的embedding
- 查找与查询操作最相似的向量
可以与多种数据库结合使用,这里以faiss数据库为例,该数据库利用 Facebook AI 相似性搜索 (FAISS) 库。
- 安装
pip install faiss-cpu
- 存储向量
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
# 加载文档,将其分割成块,嵌入每个块并将其加载到向量存储中。
raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
db = FAISS.from_documents(documents, OpenAIEmbeddings())
- 相似性搜索
embedding_vector = OpenAIEmbeddings().embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)
- 检索链
该链将接收一个传入的问题,查找数据库中相关文档,然后将这些文档与原始问题一起传递给LLM,要求它回答原始问题。
from langchain.chains.combine_documents import create_stuff_documents_chain
prompt = ChatPromptTemplate.from_template("""仅根据提供的上下文回答以下问题:
<context>
{context}
</context>
Question: {input}""")
# 创建链,该链获取文档列表并将它们全部格式化为提示,然后将该提示传递给LLM。它传递所有文档,因此应该确保它适合正在使用的 LLM 上下文窗口
document_chain = create_stuff_documents_chain(llm, prompt)
# 可以直接通过传入文档来运行它
from langchain_core.documents import Document
text ="langsmith can let you visualize test results"
document_chain.invoke({
"input": "Langsmith 如何帮助进行测试?",
"context": [Document(page_content=text)]
})
- 对话检索链
该链将接收最新的输入和对话历史记录,并使用 LLM 生成搜索查询。
from langchain.chains import create_history_aware_retriever
from langchain_core.prompts import MessagesPlaceholder
# First we need a prompt that we can pass into an LLM to generate this search query
prompt = ChatPromptTemplate.from_messages([
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}"),
("user", "鉴于上述对话,生成一个搜索查询以查找以获取与对话相关的信息")
])
retriever_chain = create_history_aware_retriever(llm, retriever, prompt)
# 通过传入用户提出后续问题来测试
from langchain_core.messages import HumanMessage, AIMessage
chat_history = [HumanMessage(content="LangSmith 可以帮助测试我的 LLM 应用程序吗?"), AIMessage(content="Yes!")]
retriever_chain.invoke({
"chat_history": chat_history,
"input": "告诉我怎么做"
})
参考文献
[1]【LangChain】向量存储(Vector stores)
[2]【AI大模型】初识LangChain的快速入门指南(附入门文档)