从文档和数据中提取见解对于做出明智的决策至关重要。 然而,处理敏感信息时存在隐私问题。 LangChain,与此相结合 OpenAI 该 API 允许您分析本地文档,而无需在线上传它们。
他们通过在本地存储数据、使用嵌入和矢量化进行分析以及在您的环境中运行流程来实现这一目标。 OpenAI 不使用客户通过其 API 提交的数据来训练其模型或改进其服务。
设置您的环境
创建一个新的Python虚拟环境。 这可确保不存在库版本冲突。 然后运行以下终端命令来安装所需的库。
pip install langchain openai tiktoken faiss-cpu pypdf
以下是如何使用每个库的详细信息:
- 浪链:您可以使用它来创建和管理用于文本处理和分析的语言链。 它提供文档加载、文本分割、嵌入和矢量存储模块。
- OpenAI:您将使用它来运行查询并从语言模型获取结果。
- 抖音:您可以使用它来计算给定文本中的标记(文本单元)数量。 这是为了在交互过程中跟踪令牌计数 OpenAI API 的费用基于您使用的代币数量。
- FAISS:您将使用它来创建和管理矢量存储,该存储允许根据嵌入快速检索相似的矢量。
- pyPDF:该库从 PDF 中提取文本。 它有助于加载 PDF 文件并提取其文本以进行进一步处理。
安装所有库后,您的环境现已准备就绪。
得到一个 OpenAI API密钥
如果您直接询问 OpenAI API,您必须提供 API 密钥作为请求的一部分。 此密钥允许 API 提供商验证请求是否来自合法来源,以及您是否拥有访问其功能所需的权限。
领取一份 OpenAI API 密钥,转到那个 OpenAI 平台。
然后点击您帐户资料下的右上角 查看 API 密钥。 这 API密钥 出现页面。
点击 这 创建新的秘密 钥匙 按钮。 命名您的密钥并单击 创建一个新的密钥。 OpenAI 生成您的 API 密钥,您应该复制该密钥并将其保存在安全的地方。 出于安全原因,您无法通过您的帐户再次查看 OpenAI 帐户。 如果您丢失了该密钥,则必须生成一个新密钥。
完整的源代码可在 GitHub 存储库。
导入所需的库
要使用虚拟环境中安装的库,您必须导入它们。
from langchain.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
请注意,您正在从 LangChain 导入依赖库。 这允许您使用 LangChain 框架的某些功能。
加载文档进行分析
首先,创建一个包含您的 API 密钥的变量。 您稍后将在代码中使用此变量进行身份验证。
# Hardcoded API key
openai_api_key = "Your API key"
如果您打算与第三方共享代码,则不建议对您的 API 密钥进行硬编码。 对于要分发的生产代码,请改用环境变量。
接下来,创建一个加载文档的函数。 该函数应加载 PDF 或文本文件。 如果文档两者都不是,则该函数应该触发 数值错误。
def load_document(filename):
if filename.endswith(".pdf"):
loader = PyPDFLoader(filename)
documents = loader.load()
elif filename.endswith(".txt"):
loader = TextLoader(filename)
documents = loader.load()
else:
raise ValueError("Invalid file type")
加载文档后,创建一个 字符文本分割器。 该分割器根据字符将加载的文档分割成更小的部分。
text_splitter = CharacterTextSplitter(chunk_size=1000,
chunk_overlap=30, separator="n")
return text_splitter.split_documents(documents=documents)
拆分文档可确保块的大小易于管理,同时仍连接到重叠的上下文。 这对于文本分析和信息检索等任务很有用。
查询文档
您需要一种方法来查询上传的文档以从中获取见解。 为此,创建一个需要 询问 字符串和一个 猎犬 作为输入。 然后它创建一个 检索QA 实例与 猎犬 和它的一个例子 OpenAI 语言模型。
def query_pdf(query, retriever):
qa = RetrievalQA.from_chain_type(llm=OpenAI(openai_api_key=openai_api_key),
chain_type="stuff", retriever=retriever)
result = qa.run(query)
print(result)
该函数使用创建的 QA 实例来执行查询并打印结果。
创建主函数
main函数控制整个程序流程。 它将接受用户输入的文档文件名并加载该文档。 然后创建一个 OpenAI 嵌入 嵌入实例并构造一个 矢量内存 基于加载的文档和 嵌入。 将此矢量存储保存到本地文件。
接下来,从本地文件加载持久向量存储。 然后提供一个循环供用户输入查询。 这 主要是 该函数将这些查询传递给 查询_pdf 与持久向量内存检索器一起使用。 循环继续,直到用户输入“退出”。
def main():
filename = input("Enter the name of the document (.pdf or .txt):n")
docs = load_document(filename)
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
vectorstore = FAISS.from_documents(docs, embeddings)
vectorstore.save_local("faiss_index_constitution")
persisted_vectorstore = FAISS.load_local("faiss_index_constitution", embeddings)
query = input("Type in your query (type 'exit' to quit):n")
while query != "exit":
query_pdf(query, persisted_vectorstore.as_retriever())
query = input("Type in your query (type 'exit' to quit):n")
嵌入捕获单词之间的语义关系。 向量是一种可以表示文本部分的形式。
此代码使用生成的嵌入将文档中的文本数据转换为向量 OpenAI 嵌入。 然后使用这些向量进行索引 FAISS,用于有效检索和比较相似的向量。 这允许分析上传的文档。
最后,当用户独立运行程序时,使用 __name__ == “__main__” 构造来调用 main 函数:
if __name__ == "__main__":
main()
这个应用程序是一个命令行应用程序。 作为扩展,您可以使用 Streamlit 向应用程序添加 Web 界面。
执行文档分析
要执行文档分析,请将要分析的文档保存在与项目相同的文件夹中,然后运行程序。 系统会询问您要分析的文档的名称。 Enter 输入全名,然后输入您希望程序分析的查询。
下面的屏幕截图显示了分析 PDF 的结果。
以下输出显示了分析包含源代码的文本文件的结果。
确保您要分析的文件是 PDF 或文本格式。 如果您的文档是其他格式,您可以使用在线工具将其转换为 PDF 格式。
了解大型语言模型背后的技术
LangChain 使用大型语言模型简化了应用程序的创建。 这也意味着幕后发生的事情是抽象的。 要准确了解您正在构建的应用程序是如何工作的,您应该了解大型语言模型背后的技术。