使用 LLM 模型通过 LangChain 构建基于文档的问答系统。
这里使用 LLM 模型作为 AzureOpenAI,使用 Vector Store 作为 Pincone 和 LangChain 框架。
1. 简介
这篇博文深入探讨了创建高效基于文档的问答系统的分步过程。通过利用 LangChain 和 Pinecone 这两种尖端技术,我们利用了大型语言模型 (LLM) 的最新进展,包括 AzureOpenAI GPT-3 和 ChatGPT。
LangChain 是一个专为开发语言模型驱动应用程序而设计的强大框架,也是我们项目的基础。它为我们提供了必要的工具和功能,以创建一个能够根据特定文档准确回答问题的智能系统。
为了提高问答系统的性能和效率,我们集成了 Pinecone,这是一个高效的矢量数据库,以构建高性能矢量搜索应用程序而闻名。通过利用其功能,我们可以显著提高系统搜索和检索过程的速度和准确性。
该项目的主要重点是仅依靠目标文档中包含的信息来生成精确且具有上下文感知的答案。通过将语义搜索的强大功能与 GPT 等 LLM 的卓越功能相结合,我们实现了最先进的文档问答系统。
通过这篇博文,我们旨在指导读者构建自己的基于文档的先进问答系统。通过利用人工智能技术的最新进展,我们展示了结合语义搜索和大型语言模型的强大功能,最终形成了一个基于特定文档回答问题的高准确率和高效系统。
使用 LangChain 和 VectorStore 的问答架构。
2. 具体上下文答案:
语义搜索 + GPT QnA 可以通过将答案建立在相关文档的特定段落中来生成更具有上下文针对性和更精确的答案。但是,经过微调的 GPT 模型可能会根据模型中嵌入的一般知识生成答案,这可能不太精确或与问题的上下文无关。
3. LangChain 模块
LangChain支持几个主要模块:
- 模型:LangChain 支持的各种模型类型和模型集成。
- 索引:语言模型与您自己的文本数据相结合时通常会更加强大——该模块涵盖了执行此操作的最佳实践。
- 链:链不仅仅是单个 LLM 调用,而且是调用序列(无论是对 LLM 还是其他实用程序)。LangChain 为链提供了标准接口、与其他工具的大量集成以及用于常见应用程序的端到端链。
4.让我们深入探讨实际实施:
导入库:
导入os
导入openai
导入pinecone
从langchain.document_loaders导入DirectoryLoader
从langchain.text_splitter导入RecursiveCharacterTextSplitter
从langchain.embeddings.openai导入OpenAIEmbeddings
从langchain.vectorstores导入Pinecone
从langchain.llms导入OpenAI
从langchain.chains.question_answering导入load_qa_chain
正在加载文件:
首先,我们需要使用 LangChain 的 DirectoryLoader 从目录中加载文档。在此示例中,我们假设文档存储在名为“data”的目录中。
directory = '/content/data'# 在数据文件夹中保存多个文件(.txt、.pdf)。def'/content/data' # 在数据文件夹中保存多个文件(.txt、.pdf)。def load_docs(目录): loader = DirectoryLoader(目录) documents = loader.load()返回文档documents = load_docs(目录)
len (文档)
拆分文档:
现在,我们需要将文档拆分成更小的块进行处理。我们将使用 LangChain 的 RecursiveCharacterTextSplitter,默认情况下它会尝试按字符 [“\n\n”, “\n”, “ “, “”] 进行拆分。
def split_docs ( documents, chunk_size= 1000 , chunk_overlap= 20 ):
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
docs = text_splitter.split_documents(documents)
返回docs
docs = split_docs(documents)
打印( len (docs))
使用 OpenAI 嵌入文档:
文档分割完成后,我们需要使用 OpenAI 的语言模型嵌入它们。首先,我们需要安装 tiktoken 库。
!pip 安装 tiktoken -q
现在,我们可以使用 LangChain 中的 OpenAIEmbeddings 类来嵌入文档。
嵌入 = OpenAIEmbeddings(model_name =“ada”)“ada”)
query_result = embeddings.embed_query(“Hello world”)
len(query_result)
使用 Pinecone 进行矢量搜索:
Pinecone 是一款高性能向量数据库,能够快速、准确地对高维向量进行相似性搜索。其友好的 API、可扩展性和先进的算法,让开发者能够轻松处理海量向量数据,实现实时检索,构建高效的推荐系统和搜索引擎。
!pip 安装 pinecone-client -q
然后,我们可以初始化 Pinecone 并创建 Pinecone 索引。
pinecone.init(
api_key="pinecone api key",“pinecone api key”,
环境= “env”
)
index_name = “langchain-demo”
索引=Pinecone.from_documents(docs,embeddings,index_name=index_name)
我们正在使用该Pinecone.from_documents()
方法创建一个新的 Pinecone 向量索引。此方法接受三个参数:
docs
:使用 RecursiveCharacterTextSplitter 分割成较小块的文档列表。这些较小的块将在 Pinecone 中编入索引,以便以后更轻松地搜索和检索相关文档。embeddings
:OpenAIEmbeddings 类的实例,负责使用 OpenAI 的语言模型将文本数据转换为嵌入(即数值表示)。这些嵌入将存储在 Pinecone 索引中并用于相似性搜索。index_name
:表示 Pinecone 索引名称的字符串。此名称用于在 Pinecone 的数据库中标识索引,并且应具有唯一性,以避免与其他索引冲突。
该Pinecone.from_documents()
方法处理输入文档,使用提供的 OpenAIEmbeddings 实例生成嵌入,并创建一个具有指定名称的新 Pinecone 索引。生成的索引对象可以执行相似性搜索并根据用户查询检索相关文档。
5.查找类似文档:
现在,我们可以定义一个函数来根据给定的查询查找类似的文档。
def get_similiar_docs ( query, k= 2 , score= False ): # 我们可以控制 k 值来获取与问题相关的上下文数量。
if score:
similar_docs = index.similarity_search_with_score(query, k=k)
else :
similar_docs = index.similarity_search(query, k=k)
return similar_docs
6. 使用 LangChain 和 OpenAI LLM 进行问答:
有了必要的组件,我们现在可以使用 LangChain 中的 OpenAI 类和预先构建的问答链来创建一个问答系统。
从langchain.llm导入AzureOpenAI
model_name = "text-davinci-003"
llm = AzureOpenAI(model_name=model_name)
chain = load_qa_chain(llm, chain_type= "stuff" ) # 我们也可以使用 map_reduce chain_type。def get_answer ( query ): similar_docs = get_similiar_docs(query) print (similar_docs) answer = chain.run(input_documents=similar_docs, question=query)
返回 答案
7. 示例查询和答案:
最后,让我们用一些示例查询来测试我们的问答系统。
query = “印度经济如何?”“印度经济状况如何?”
答案 = get_answer(query)
打印(answer)
查询 = “印度和美国的关系如何改善?”
答案 = get_answer(query)
打印(answer)
上面我们将获得具有特定查询的上下文,然后我们将查询和上下文作为提示传递给 LLM 模型以获得响应。
8.结论:
在这篇博文中,我们展示了利用 LangChain 和 Pinecone 构建基于文档的问答系统的过程。通过利用语义搜索和大型语言模型的功能,这种方法提供了一种强大而通用的解决方案,可以从大量文档集合中提取有价值的信息。此外,该系统可以轻松定制和定制,以满足个人需求和特定领域,为用户提供高度适应性和个性化的解决方案。
8.结论:**
在这篇博文中,我们展示了利用 LangChain 和 Pinecone 构建基于文档的问答系统的过程。通过利用语义搜索和大型语言模型的功能,这种方法提供了一种强大而通用的解决方案,可以从大量文档集合中提取有价值的信息。此外,该系统可以轻松定制和定制,以满足个人需求和特定领域,为用户提供高度适应性和个性化的解决方案。
希望这段愉快的文字之旅能振奋你的精神,带给你微笑,让你的内心充满喜悦和积极。祝你阅读愉快,愿快乐永远陪伴你!
博客原文:专业人工智能社区