LangChain文档应答生成器——基于人工智能的文档问答工具

ChatGPT中文站

在本帖中,我们将探讨一款名为“LangChain文档响应生成器”的令人兴奋的Python应用程序,它利用先进的语言处理和人工智能来生成对用户提示的响应,并执行文档相似性搜索。该应用程序利用了OpenAI的GPT-3.5 Turbo模型和LangChain的工具链,提供智能响应和深入的文档分析。

您可以在此处检查代码。

理解代码

“LangChain文档响应生成器”的代码库是用Python编写的,并使用了几个强大的库和包来实现无缝执行。让我们深入了解代码的关键组件:

导入依赖项

代码的初始行导入了必要的库和模块。

import os
from config import openai_api_key
import streamlit as st
from langchain.chat_models import ChatOpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import PyPDFLoader
from langchain.vectorstores import Chroma
from langchain.agents.agent_toolkits import (
create_vectorstore_agent, VectorStoreToolkit, VectorStoreInfo)

每个模块都在应用的功能性中扮演着至关重要的角色。

  • 操作系统 (os):该模块提供一种使用操作系统依赖功能的方式,例如读取或写入环境变量。
  • 配置:包含OpenAI的API密钥。
  • Streamlit(流动性)是一个开源的Web应用程序框架,允许Python开发者以最少的编码创建漂亮的交互式Web应用程序。
  • Langchain是一个提供与LLM模型、加载文档、存储和搜索向量等功能相关的框架。

设置应用程序

导入模块之后,代码配置环境。

os.environ["OPENAI_API_KEY"] = openai_api_key

在这里,我们将OpenAI API密钥设置为环境变量。此密钥将用于对我们对OpenAI API的请求进行身份验证。

使用Streamlit创建用户界面

st.title('LangChain Document Response Generator')
user_prompt = st.text_input('Enter your prompt here:')

在这里,我们使用Streamlit来创建应用程序的用户界面。我们定义一个标题和一个文本输入框,供用户输入他们的问题。

设置聊天模型和嵌入

llm_chat = ChatOpenAI(temperature=0.9, max_tokens=150, model='gpt-3.5-turbo-0613', client='')
embeddings = OpenAIEmbeddings(client='')

我们正在初始化ChatOpenAI,这是来自OpenAI的GPT-3.5聊天模型。温度和最大令牌控制着回答的随机性和长度。我们还在初始化OpenAIEmbeddings,它将用于创建文档的向量表示。

加载并处理文档

pdfLoader = PyPDFLoader('How_Conversational_Business_Can_Help_You_Get_and_Stay_Closer_to_Customers.pdf')
pages = pdfLoader.load_and_split()

我们正在使用PyPDFLoader模块来加载和拆分PDF文档的页面。

创建和设置矢量店

store = Chroma.from_documents(pages, embedding=embeddings, collection_name='sample')

在这里,我们将从之前加载的文档中初始化一个 Chroma 向量存储。该向量存储将用于根据用户的问题搜索相关信息。

创建一个VectorStore代理

# Create vectorstore info object
vectorstore_info = VectorStoreInfo(
name='vectorStoreTool',
description='a sample vectorstore',
vectorstore=store,
)


# Convert vectorstore info object to agent toolkit
toolkit = VectorStoreToolkit(vectorstore_info=vectorstore_info, llm=llm_chat

# Create the agent executor
PREFIX = """You are an agent designed to answer questions about sets of documents.
You have access to tools for interacting with the documents, and the inputs to the tools are questions.
"""
agent_executor = create_vectorstore_agent(
llm=llm_chat, toolkit=toolkit, prefix=PREFIX, verbose=True)

在这段代码中,我们正在创建一个VectorStoreInfo对象的实例。此对象是一个数据实体,包装了有关特定向量存储的各种详细信息。这些详细信息包括:

  • 名称:向量存储的标签或标识符。在本例中,为'向量存储工具'。
  • 描述: 矢量存储是什么或代表的简要解释。在这里,它被定义为“一个示例矢量存储”。
  • vectorstore:实际的向量存储对象,此对象在脚本中之前被创建。运行Agent和处理错误。

接下来,将初始化一个VectorStoreToolkit对象,将之前创建的vectorstore_info和一个语言模型(llm_chat)作为参数。该工具包是一组专门设计用于与VectorStoreInfo和给定语言模型一起工作的方法和功能。

最后,我们使用一个名为create_vectorstore_agent的函数创建了一个agent_executor。它使用语言模型(llm_chat)和工具包(包含向量存储信息)来根据加载的文档回答问题。

前缀是描述代理程序高级功能的提示。在这种情况下,代理程序设计为回答关于一组文档的问题,并且可以使用工具与文档进行交互。此前缀可能用于为代理程序的交互设置上下文。

verbose=True参数控制在代理执行期间显示的调试或日志信息的详细程度。

运行代理和处理错误

if user_prompt:
try:
response = agent_executor.run(user_prompt)
st.write(response)
except Exception as e:
st.write('It looks like you entered an invalid prompt. Please try again.')
print(e)

这里是与用户进行互动的实际发生的地方。如果用户提供了输入,将尝试使用代理执行器生成回应。

try-except 块是 Python 中的错误处理机制。在这种情况下,如果发生任何异常(例如,如果用户输入是无效的或导致错误的),程序将捕获该异常,而不是停止,它将打印一个用户友好的消息。这增强了程序的健壮性和用户体验,因为它提供了纠正问题的机会,而不仅仅是失败。

文档相似度搜索

with st.expander('Document Similarity Search'):
search = store.similarity_search_with_score(user_prompt)
st.write(search[0][0].page_content)

最后,脚本使用用户的输入作为查询,在向量库中进行相似性搜索。这样可以找到并显示出与用户查询最相似或相关的文档段落。相似性搜索是信息检索中常见的任务,对于在大型数据集中找到相关信息非常有效。

搜索结果以可展开的方式显示在Streamlit用户界面的一个部分中。代码st.write(search[0][0].page_content)向用户界面写入最相似的页面内容。

结论

我们细分了一个使用OpenAI、Streamlit和各种自定义模块的Python脚本的工作原理,用于创建一个交互式的基于文档的响应生成应用程序。从设置聊天模型和加载文档,到创建向量存储和与用户交互,这个应用程序是现代技术组合在自然语言处理领域和构建交互式用户界面方面可能性的一个很好的例子。

每个代码片段在应用程序的总体功能中都起着至关重要的作用。除了处理用户输入并使用AI聊天模型生成响应之外,该应用程序还有效地处理错误,并利用相似性搜索来找到并显示与用户相关的信息。我们希望这个详细的分解为您提供了更深入的理解,以了解如何将这些不同的部分组合在一起构建一个复杂而强大的应用程序。

感谢阅读,并祝您愉快地探索文档并得到问题的解答!

请注意:本帖解释了“LangChain文档响应生成器”的代码。有关LangChain工具链及其组件的更多信息,请参考官方文档和相关资源。

2023-10-20 17:09:05 AI中文站翻译自原文