共计 4379 个字符,预计需要花费 11 分钟才能阅读完成。
Langchain 能够帮忙开发人员构建由大型语言模型 (llm) 反对的应用程序。它提供一个框架将 LLM 与其余数据源 (如互联网或集体文件) 连接起来。这容许开发人员将多个命令链接在一起,以创立更简单的应用程序。包含最近比拟火爆的 AutoGPT 等都是应用了 Langchain 框架进行开发的。所以本文将介绍如何应用 LangChain 来创立咱们本人的论文汇总工具。
LangChain 的根本应用办法
咱们先理解 LangChain 的根本应用状况,所以这里应用 HuggingFace 为例,介绍 LangChain 最根本的用法。
1、整合 transformer
from langchain import PromptTemplate, HuggingFaceHub, LLMChain
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.indexes import VectorstoreIndexCreator
from langchain.callbacks.base import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain.chains.qa_with_sources import load_qa_with_sources_chain
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from huggface_hub import hf_hub_download
import textwrap
import glob
这里须要 HuggingFace 的 API key,如果你没有也不要紧,因为前面咱们会应用 OPEN AI 的 API,这里只是介绍基本功能
HUGGING_FACE_API_KEY = "hf_...."
而后就能够为咱们的问答模型创立一个提醒的模板。这是传递给问答模型的默认模板,其中蕴含一个蕴含问题的变量。例如:
template = """ You are going to be my assistant.
Please try to give me the most beneficial answers to my
question with reasoning for why they are correct.
Question: {input} Answer: """prompt = PromptTemplate(template=template, input_variables=["input"])
从 Huggingface 加载模型。咱们以 facebook/mbart-large-50 为例
model = HuggingFaceHub(repo_id="facebook/mbart-large-50",
model_kwargs={"temperature": 0, "max_length":200},
huggingfacehub_api_token=HUGGING_FACE_API_KEY)
chain = LLMChain(prompt=prompt, llm=model)
temperature 示意输入的随机性水平。max_length 则为咱们令牌的最大长度
当初就能够载入模型:
hf_embeddings = HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2')
2、创立 langchain 索引
Langhchain 反对多种数据加载器和多种数据格式,须要通过它的数据加载器将咱们的数据集加载并且放入索引中:
my_loader = DirectoryLoader('my_data', glob='**/*.txt')
docs = my_loader.load()
text_split = RecursiveCharacterTextSplitter(chunk_size = 700, chunk_overlap = 0)
text = text_split.split_documents(docs)
Langchain 反对很多类型的矢量存储,每个向量中的值示意相应文档中每个术语的重要性或频率。这种示意容许通过测量向量之间的余弦类似度来轻松计算文档类似度。
向量存储通常用于信息检索零碎和自然语言解决工作,如文档分类、搜索引擎和举荐零碎。它们还能够用于主题建模和集群等工作。
这个示例将应用 FAISS (Facebook AI 类似度搜寻),这是一个用于高效类似度搜寻和密集向量聚类的开源库。它用于构建大规模的向量数据库,能够通过查问来检索与给定查问向量最类似的向量。
在 FAISS 矢量数据库中,每个矢量都示意为高维空间中的一个点。能够应用不同的索引办法对向量进行疾速最近邻搜寻,例如 IVF、HNSW 和 PQ。FAISS 还反对用于计算类似度的各种间隔度量,例如 L2、内积和余弦类似度。
vectorstore = FAISS.from_documents(text, hf_embeddings)
3、发问
而后咱们就能够创立最乏味的局部,问答(QA) LLM 链。因为咱们心愿可能查看答案的起源,所以能够应用“load_qa_with_sources_chain”:
my_chain = load_qa_with_sources_chain(model, chain_type="refine")
query = "Any question that you want to ask the model"
documents = vectorstore.similarity_search(query)
result = with_sources_chain({"input_documents": documents, "question": query})
这样在 result 变量中就能取得咱们问题的答案了。
以上就是 LangChain 的根本应用办法,上面咱们来将他与 OpenAI 金正整合,创立一个咱们本人的我的项目。
论文汇总和查问
langchain 外面蕴含了很多实用的工具,比方 pdf 文件的读取,openai API 的对接,所以咱们能够间接拿来应用:
from langchain.chains.summarize import load_summarize_chain
from langchain.document_loaders import PyPDFLoader
from langchain import OpenAI, PromptTemplate
import glob
而后就能够通过 OpenAI 对象来与 openai 的 API 进行对接:
llm = OpenAI(temperature=0.2)
PyPDFLoader 对象曾经为咱们封装好了 PDF 的操作,所以能够间接应用,这里咱们遍历目录,读取目录中的所有文件进行操作:
def summarize_pdfs_from_folder(pdfs_folder):
summaries = []
for pdf_file in glob.glob(pdfs_folder + "/*.pdf"):
loader = PyPDFLoader(pdf_file)
docs = loader.load_and_split()
chain = load_summarize_chain(llm, chain_type="map_reduce")
summary = chain.run(docs)
print("Summary for:", pdf_file)
print(summary)
print("\n")
summaries.append(summary)
return summaries
将摘要保留为文本文件:
with open("summaries.txt", "w") as f:
for summary in summaries:
f.write(summary + "\n"*3)
而后应用 VectorStoreIndexCreator 来对摘要进行索引:
from langchain.indexes import VectorstoreIndexCreator
from langchain.document_loaders import PyPDFDirectoryLoader
loader = PyPDFDirectoryLoader("./pdfs/")
docs = loader.load()
index = VectorstoreIndexCreator().from_loaders([loader])
索引创立实现后就能够查问了:
query = "What is the core idea behind the CoOP (context optimization) paper?"
index.query(query)
# Output
# " The core idea behind the CoOP paper is to model
# a prompt's context words with learnable vectors
# while keeping the entire pre-trained parameters fixed,
# in order to adapt CLIP-like vision-language models for
# downstream image recognition tasks."
或者:
query = "What is the central idea that can allow for scaling transformers to 1 million tokens?"
index.query(query)
# Output
# 'The central idea is to use the Recurrent Memory Transformer (RMT) architecture to extend the context length of BERT, allowing it to store and process both local and global information across up to 2 million tokens.'
看样子还不错。
总结
应用 LangChain 来总结和查问钻研论文十分的简略,LangChain 很容易应用,也很容易学习。咱们能够通过它来实现咱们本人的自定义工作,这个论文汇总的代码在这里:
https://avoid.overfit.cn/post/72755915e57545dfa6673c1c4335ef0b
如果你测试能够间接下载来应用。