在数字化时代,人们对信息的需求日益增长。无论是在学术研究、工作中还是日常生活中,我们都需要快速、准确地获取答案。构建一个自然语言问答系统可以帮助我们在海量信息中迅速找到所需的答案,这不仅提高了工作效率,还增强了用户体验。
然而,要构建一个强大的自然语言问答系统并不容易。幸运的是,OpenAI提供了一种强大的工具,可以帮助我们轻松构建自然语言问答系统,而Langchain则是一个集成了OpenAI API和Tair的框架,使构建问答系统更加容易。
在本教程中,我们将向您展示如何使用OpenAI API和Langchain构建一个自然语言问答系统。首先,我们需要准备好OpenAI API密钥和Tair URL,然后加载数据,定义Langchain的链条,最后进行搜索数据。
准备您的OpenAI API密钥和Tair URL
首先,我们需要获取OpenAI API密钥和Tair URL。您可以在OpenAI的官方网站上申请API密钥。一旦您获得了API密钥和Tair URL,我们可以继续下一步。
import getpass
openai_api_key = getpass.getpass("输入您的OpenAI API密钥:")
TAIR_URL = getpass.getpass("输入您的Tair URL:")
加载数据
在构建自然语言问答系统之前,我们需要加载一些包含自然问题和答案的数据。这些数据将用于创建Langchain应用,其中Tair将作为知识库。
import wget
import json
# 从Google提供的数据集中下载问题和答案的JSON文件
wget.download("https://storage.googleapis.com/dataset-natural-questions/questions.json")
wget.download("https://storage.googleapis.com/dataset-natural-questions/answers.json")
# 读取问题和答案数据
with open("questions.json", "r") as fp:
questions = json.load(fp)
with open("answers.json", "r") as fp:
answers = json.load(fp)
定义Langchain链条
接下来,我们将定义Langchain链条,以便使用OpenAI API和Tair存储答案数据。
from langchain.vectorstores import Tair
from langchain.embeddings import OpenAIEmbeddings
from langchain import VectorDBQA, OpenAI
# 创建OpenAI嵌入
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
# 创建Tair存储
doc_store = Tair.from_texts(
texts=answers, embedding=embeddings, tair_url=TAIR_URL,
)
# 定义整个QA链条
llm = OpenAI(openai_api_key=openai_api_key)
qa = VectorDBQA.from_chain_type(
llm=llm,
chain_type="stuff",
vectorstore=doc_store,
return_source_documents=False,
)
搜索数据
一旦我们将数据放入Tair中,就可以开始提问了。每个问题都将由OpenAI模型自动矢量化,然后使用这个矢量找到Tair中可能匹配的答案。一旦检索到答案,最相似的答案将被合并到发送给OpenAI大型语言模型的提示中。
import random
import time
# 随机选择一些问题进行提问
random.seed(52)
selected_questions = random.choices(questions, k=5)
for question in selected_questions:
print(">", question)
print(qa.run(question), end="\n\n")
# 由于速率限制,等待20秒
time.sleep(20)
自定义提示模板
Langchain的"stuff"链条类型使用特定的提示,其中包含问题和上下文文档。下面是默认提示的样式:
使用以下上下文信息来回答最后的问题。如果你不知道答案,只需说你不知道,不要试图编造答案。
{context}
问题: {question}
有帮助的回答:
然而,我们可以提供自定义提示模板,改变OpenAI LLM的行为,仍然使用"stuff"链条类型。重要的是要保持{context}和{question}作为占位符。
from langchain.prompts import PromptTemplate
custom_prompt = """
使用以下上下文信息来回答最后的问题。请提供一个简短的单句摘要答案。如果你不知道答案或上下文中没有,不要试图编造答案,而是建议我一首随机无关的歌曲名。
上下文: {context}
问题: {question}
有帮助的答案:
"""
custom_prompt_template = PromptTemplate(
template=custom_prompt, input_variables=["context", "question"]
)
custom_qa = VectorDBQA.from_chain_type(
llm=llm,
chain_type="stuff",
vectorstore=doc_store,
return_source_documents=False,
chain_type_kwargs={"prompt": custom_prompt_template},
)
# 随机选择一些问题进行提问
random.seed(41)
for question in random.choices(questions, k=5):
print(">", question)
print(custom_qa.run(question), end="\n\n")
# 由于速率限制,等待20秒
time.sleep(20)
结论
在本教程中,我们展示了如何使用OpenAI API和Langchain构建一个自然语言问答系统。从获取API密钥和Tair URL,到加载数据,定义Langchain链条,搜索数据,以及自定义提示模板,我们详细介绍了每一步。希望这个教程能帮助您构建自己的自然语言问答系统,以满足各种信息需求。
无论是在教育、研究还是商业领域,自然语言问答系统都具有广泛的应用前景。通过结合OpenAI的强大语言模型和Langchain的便捷工具,您可以轻松构建出色的问答系统,为用户提供更好的体验。
如果您有任何问题或需要进一步的帮助,请随时联系我们。愿您的自然语言问答系统在各个领域都取得成功!