使用LangChain和GPT-4进行多语言FEMA灾害机器人研究

使用LangChain和GPT-4进行多语言FEMA灾害机器人研究' can be condensed to 'Research on multilingual FEMA disaster robots using LangChain and GPT-4

检索增强生成(RAG)在高风险聊天应用中的一些优缺点

使用提示“一张洪水肆虐的河流围绕着一个机器人的照片”由DALL-E2生成的图像

太长不看

在本文中,我们探讨了如何构建一个多语言的美国联邦应急管理局(FEMA)灾难聊天机器人,帮助人们准备和应对洪水、龙卷风、野火、地震和冬季风暴等灾害。我们使用LangChain和GPT-4从34个FEMA PDF文档创建了一个聊天界面。尽管这种流行的模式令人惊叹,但在灾难响应机器人等高风险应用中需要谨慎。虽然大型语言模型(LLM)的幻觉被最小化,但常见的文档语义搜索问题可能导致关键信息在聊天回复中被排除在外。我们测试了一些简单的技术来改善这种特定分析的性能,例如将文档元数据融入到嵌入中,使用LLM零样本上下文分类丰富用户问题,并使用Google Translate进行自动语言检测和翻译,以更好地支持斯瓦希里语等语言。应用的技术相当基本,但原型机器人从FEMA PDF文档高效地获取信息的能力显示出了潜力。如果将此技术用于高风险情况,理想情况下需要进行测试和验证,最好使用自动化的LLM技术创建问答验证数据。

几周前,佛蒙特州发生了一次严重的洪水事件。在我们家门前欢快流淌的小溪变成了一个狂暴的怪兽,决心要毁灭一切。幸运的是我们没有受到严重的损害,但很遗憾,许多人失去了财产和生计。在洪水期间的某个时刻,看起来我们可能不得不撤离,所以我开始查看美国联邦应急管理局(FEMA)网站上的建议。我已经做了一些准备,但当麻烦来临时,我想再确认一些事情。FEMA在PDF文档和网页中提供了非常出色、简练的资源,我开始搜索,但我有些疑惑…

  • 在紧急情况下,是否有一种更快捷的方式获得有用的信息,而不需要搜索和阅读多个文档?

一个明显的解决方案可能是问一个聊天机器人。我认为有时候聊天机器人可能被过度使用,但这似乎是一个很好的用例,因为在时间紧迫时,对话界面可能更高效。

这不是一个新的想法,像美国红十字会这样的组织已经开发了像Clara这样的用于灾难响应的机器人。然而,最近出现了一种有前景的新模式,使用生成式人工智能大型语言模型(LLM),如OpenAI的GPT-4、Meta的LLAMA 2以及HuggingFace上的越来越多的模型。这些模型可以用于索引指定的一组文档,并与之进行对话交互。这种叫做检索增强生成(RAG)的模式,在网络上有数百个教程展示了它与令人惊叹的LangChain Python包的使用,我完全希望这种技术很快会出现在我们每天使用的软件中。有趣的是,它将回复限制在提供的内容范围内,因此不容易出现幻觉,这可以避免在灾难响应等关键情况下使用LLM时出现问题。

但在信息可能拯救生命的情况下,它有多安全呢?

在本文中,我简要探讨了基于美国联邦应急管理局(FEMA)的一组文档创建LangChain GPT-4聊天界面,用于提问关于灾难安全的问题。如果在高风险情况下使用这种技术,我们将遇到一些需要考虑的限制。

美国联邦应急管理局(FEMA)的灾难准备和安全PDF文档

对于这项研究,我从FEMA下载了34个PDF文档(在此列出),涵盖了广泛的与准备和应对野火、龙卷风、洪水、地震和冬季风暴等紧急情况相关的主题。这并不是FEMA提供的所有令人惊叹的资源的完整集合,但应该足以测试我们的聊天界面。

为信息检索建立索引文档

下载完成后,我们可以使用LangChain读取PDF文档。文档被拆分为文本块,并使用嵌入模型为每个文本块生成一个指纹(嵌入)。在这个分析中,我们将使用OpenAI的嵌入,但LangChain支持许多其他嵌入。

import osfrom langchain.document_loaders import PyPDFDirectoryLoaderfrom langchain.document_loaders import PyPDFLoaderfiles = os.listdir(pdf_folder_path)files.sort()all_docs_list =[]for file in files:    if file.endswith('.pdf'):        print(file)        all_docs_list.append(file)loader = PyPDFDirectoryLoader(pdf_folder_path)all_docs = loader.load()print(pdf_folder_path)

cfpb_adult-fin-edyour-disaster-checklist.pdffema_protect-your-home_flooding.pdffema_protect-your-property-storm-surge.pdffema_protect-your-property_coastal-erosion.pdffema_protect-your-property_earthquakes.pdffema_protect-your-property_severe-wind.pdffema_protect-your-property_wildfire.pdffema_safeguard-critical-documents-and-valuables.pdffema_scenario_1-active_shooter-01102020.pdffema_scenario_10_power_outage_01102020.pdffema_scenario_10_power_outage_answer_key_01102020.pdffema_scenario_11_winter_storm_01102020.pdffema_scenario_11_winter_storm_answer_key_01102020.pdffema_scenario_12_small_business_01102020.pdffema_scenario_12_small_business_answer_key_01102020.pdffema_scenario_1_active_shooter_TTX_answer_key-01102020.pdffema_scenario_2-tornado_TTX_answer_key-01102020.pdffema_scenario_2_tornado-01102020.pdffema_scenario_3-wildfire_TTX_answer_key-01102020.pdffema_scenario_3_wildfire-01102020.pdffema_scenario_4-hurricane-01102020.pdffema_scenario_4_hurricane_flood_TTX_answer_key-01102020.pdffema_scenario_5_extreme_heat-01102020.pdffema_scenario_5_extreme_heat_TTX_answer_key_01102020.pdffema_scenario_6-pet_preparedness_01102020.pdffema_scenario_6-pet_preparedness_TTX_answer_key_01102020.pdffema_scenario_7-shelter_in_place_TTX_answer_key_01102020.pdffema_scenario_7_shelter_in_place_01102020.pdffema_scenario_8_earthquake_01102020.pdffema_scenario_8_earthquake_answer_key_01102020.pdffema_scenario_9_pandemic_Influenza_01102020.pdffema_scenario_9_pandemic_answer_key_01102020.pdfready_12-ways-to-prepare_postcard.pdfready_document-and-insure-your-property.pdf

正在查看提取的一份文档数据 https://www.fema.gov/sites/default/files/2020-11/fema_protect-your-home_flooding.pdf …

import jsonfor d in all_docs:    if 'fema_protect-your-home_flooding.pdf' in d.metadata['source']:        print('\n')        print(json.dumps(vars(d), indent=4))

{    "page_content": "  \n  \n \n保护您的\n房屋免受洪水侵害\n \n",    "metadata": {        "source": "docs_data/fema_protect-your-home_flooding.pdf",        "page": 0    }}{    "page_content": " \n \n \n  \n  \n \n \n \n \n \n \n \n \n \n \n -\n—\n- - -\n拥有房产是大多数人一生中最重要的投资之一。我们努力工作,为自己和我们所爱的人提供一个家和未来。为什么要冒险在恶劣天气来临时失去它呢?洪水是美国最常见和最昂贵的自然灾害,而且可能发生在任何地方。只有一英寸的水就足以对您的房屋造成25000美元的损失。虽然您无法阻止自然灾害的发生,但有办法保护您的财产,减少损失,保护您的家和未来。首先,确定您家的基础洪水标高(BFE)。BFE是预计在高风险区域的洪水中水位预计上升多高的标高。您需要知道您的BFE,因为它在您的社区的洪水管理法规中使用,这可能会影响您的房屋,例如建筑物应该高于BFE多高。您当地的洪水平面经理可以帮助您找到这些信息。如果您需要帮助找到您的洪水平面经理,请联系FEMA的洪水映射和保险交换\n a\nt FEMAMapSpecialist@ \nr\niskmapcds.com 或致电(877)FEMA MAP(1 877 336 2627)。以下是

我们可以看到,它通过页面将文档分割开来。碰巧的是,对于我们正在处理的FEMA文件来说,这不是一个不合理的方法,这些文件是非常简洁的指南,每一页都是一个独立的主题,但对于其他应用程序来说,通常最好使用LangChain的text_splitter在更细粒度的级别上拆分文本。

现在我们可以使用我们的文本摘录来创建一个嵌入数据库...

from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma embedding_model = OpenAIEmbeddings()embeddings = OpenAIEmbeddings()vectordb = Chroma.from_documents(all_docs, embedding=embedding_model,persist_directory=vecs_dir)vectordb.persist()

我们选择了一个简单的选项将嵌入持久化到文件系统中,但值得注意的是,如果您有大量的文档,性能可能是一个问题,Chroma支持更多的选项。

设置我们的对话界面

我们将先使用一个PDF,这样更容易验证结果...

import shutilfrom langchain.chains import ConversationalRetrievalChainfrom langchain.memory import ConversationBufferMemoryfrom langchain.llms import OpenAIfrom langchain.chat_models import ChatOpenAIfrom langchain import PromptTemplate, LLMChain# 从.env文件加载OPENAI_API_KEYfrom dotenv import load_dotenvdef setup_model(    vecs_dir: str,    docs_sublist: list,    all_docs: list) -> ConversationalRetrievalChain:    # 我们感兴趣的文档子集    docs = []    for d in all_docs:                d_dict = vars(d)    # 创建向量数据库目录    if os.path.exists(vecs_dir):        shutil.rmtree(vecs_dir)    os.makedirs(vecs_dir)    # 选择我们的模型    embedding_model = OpenAIEmbeddings()    chat_model = ChatOpenAI(temperature=temperature,model_name="gpt-4")    # 计算嵌入    embeddings = OpenAIEmbeddings()    vectordb = Chroma.from_documents(docs, embedding=embedding_model,persist_directory=vecs_dir)    vectordb.persist()        # 设置聊天    memory = ConversationBufferMemory(memory_key="chat_history", input_key='question', output_key='answer', return_messages=True)    pdf_qa = ConversationalRetrievalChain.from_llm(chat_model, vectordb.as_retriever(), memory=memory, \                                                   return_source_documents=True)    return pdf_qavecs_dir = './vector_dbs/one_flood_doc'docs = all_docs# 子集为一个文档docs_sublist = ['fema_protect-your-home_flooding.pdf']pdf_qa = setup_model(vecs_dir, docs_sublist, docs)

在上面的代码中,我们选择了GPT-4作为聊天模型,API密钥在.env文件中定义,变量名为OPENAI_API_KEY。LangChain还支持许多其他模型。

只需几行代码,我们就设置了一个对话界面,包括LLMs的所有功能。多年来,我开发了许多聊天机器人,可以说这种简洁的模式减少了很多复杂性。

向令人惊叹的LangChain软件包致敬!

提出我们的第一个问题

由于我们还想看到引用的文档以验证聊天回复,我们需要对LangChain的一个方法进行微调,以解决在使用聊天记忆时检索匹配文档时的问题(解决方案在此提出)...

# 一点修改以启用使用记忆和获取文档。详见:https://github.com/langchain-ai/langchain/issues/2256#issuecomment-1665188576import langchainfrom typing import Dict, Any, Tuplefrom langchain.memory.utils import get_prompt_input_keydef _get_input_output(    self, inputs: Dict[str, Any], outputs: Dict[str, str]) -> Tuple[str, str]:    if self.input_key is None:        prompt_input_key = get_prompt_input_key(inputs, self.memory_variables)    else:        prompt_input_key = self.input_key    if self.output_key is None:        output_key = list(outputs.keys())[0]    else:        output_key = self.output_key    return inputs[prompt_input_key], outputs[output_key]  langchain.memory.chat_memory.BaseChatMemory._get_input_output = _get_input_output

好的,现在我们准备提出一个关于我们的一个PDF文档的问题!

def ask_question(    query: str,    qa: object,    output_docs: bool = True) -> dict:    print(f"\n问题:\n{query}")    result = qa({"question": query})        print(f"\n答案:\n{result['answer']}")    if output_docs:        for doc in result['source_documents']:            print('\n')            print(json.dumps(vars(doc), indent=4))    return resultask_question("如何为洪水做好家庭准备?", pdf_qa)

问题:如何为洪水做好家庭准备?答案:有几个步骤可以帮助您为洪水做好家庭准备:1. 确定您家的基础洪水标高(Base Flood Elevation,BFE)。这是在高风险地区洪水期间水位预计会上升多高的标准。您当地的洪水管理机构可以帮助您找到这些信息。2. 将水流远离建筑物。确保您的院子朝建筑物的方向倾斜,并且有地方排水。清理您的排水沟,检查排水问题,或者使用雨水桶收集水。3. 锚定燃料罐,以防止其倾倒或在洪水中漂浮。4. 通过添加防水外墙板并密封它们来防止浅层洪水对您的家造成损害。5. 将移动式住宅固定在永久基础上,以抵抗漂浮、坍塌或横向移动。6. 在家中,准备或更新一份保险索赔物品清单。7. 购买洪水保险,因为大多数住宅保险政策不包括洪水损失。8. 将贵重物品和重要文件存放在高于基础洪水标高的防水容器中。9. 将公用事业设施提高到基础洪水标高以上。10. 将地毯更换为地砖,因为地砖更能抵抗洪水。11. 通过使用防水化合物密封墙壁并考虑安装抽水泵来防水地下室。12. 在地基墙壁、车库和其他封闭区域安装洪水通风口,以允许水流过并排水。13. 使用抗洪保温材料和抗洪石膏板。14. 请咨询管道工并根据需要安装污水反流阀来防止污水倒流。在对您的家进行更改之前,请记得咨询保险代理、建筑师、工程师、承包商或其他设计和建筑专家。

看起来非常合理,让我们看看用于生成这个摘要的内容...

{    "page_content": "  \n  \n \n保护您的\n财产免受洪水\n侵害\n \n",    "metadata": {        "page": 0,        "source": "docs_data/fema_protect-your-home_flooding.pdf"    }}{    "page_content": " \n \n \n  \n  \n \n \n \n \n \n \n \n \n \n \n -\n—\n- - -\n拥有一处房产是大多数人生命中最重要的投资之一。我们为自己和我们所爱的人提供一个家和未来而努力工作。当恶劣天气接近我们家时,为什么要冒险失去它呢?洪水是美国最常见和最昂贵的自然灾害,而且可能发生在任何地方。只有一英寸的水可以给您的房屋造成2.5万美元的损失。虽然您无法阻止自然灾害的发生,但可以采取措施来保护您的财产,减少损害,使您的家和未来更加安全。首先,确定您家的基础洪水标高(BFE)。BFE是在高风险区域洪水期间水位预计会上升多高的标准。您需要了解自己的BFE,因为它在您所在社区的洪水管理规定中会发挥作用,例如房屋或其他建筑物应该建在BFE以上多高的高度。您当地的洪水管理机构可以帮助您找到这些信息。如果您需要帮助找到洪水管理机构,请联系FEMA的洪水测绘和保险交换中心([email protected]或877-FEMA-MAP)。以下是您可以采取的一些额外措施来保护自己和财产免受洪水侵害。 ",    "metadata": {        "page": 1,        "source": "docs_data/fema_protect-your-home_flooding.pdf"    }}{    "page_content": " \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n  \n  \n \n \n \n \n \n \n \n \n  \n \n \n  \n将水流远离建筑物如果您拥有一栋独栋住宅,请确保您的院子朝建筑物的方向倾斜,并且有地方排水。清理您的排水沟,检查排水问题,或者使用雨水桶收集水。锚定燃料罐将所有燃料罐锚定到基础上,以防止其倾倒或在洪水中漂浮。泄漏的燃料可能会成为火灾隐患。确保通风口和加油口高于基础洪水标高。注意:这可能需要您的燃料供应商的许可。防水墙壁在墙壁上添加防水外墙板并密封它们,以防止浅层洪水对您的家造成损害。覆盖基础洪水标高以下的开口,并密封所有泵和设备周围的外部开口。固定制造房屋如果您拥有一栋制造房屋,并且希望从国家洪水保险计划中获得洪水保险,请将您的房屋固定在永久基础上,以使车轮和轴承不支撑房屋重量,并

答案看起来很棒,精彩地总结了匹配到的摘录。然而,它似乎错过了源文档中的一页。这个PDF是一个短文档,其中的*所有内容*都与洪水准备相关,因此丢失页面实际上是很重要的。

这表明,盲目接受网络上的LLM模式可能会产生看起来很棒的结果,但需要努力使它们真正有用。

文档上下文(元数据)可能很重要

对于这种情况,我们有一个与洪水相关的文档,即使单独的文本部分可能没有明确提到它。如果我们为每个文本摘录提供一些上下文,即一些文档元数据,可能会得到更好的结果。

对于我们的简单测试,让我们尝试在所有文本摘录前加上文件名(fema-protect-your-home-flooding.pdf),并去掉标点符号和后缀,再加上一段文字“此片段与之相关”。最终的前缀将是“此片段与fema保护您的家免受洪水影响相关:”,这为LLM提供了更多上下文...

def setup_model(    vecs_dir: str,    docs_sublist: list,    all_docs: list,    prefix_file_name_to_chunks: bool = False,    temperature: float = 0.0,    extra_prefix: str = '',) -> ConversationalRetrievalChain:    # Subset for docs we are interested in    docs = []    for d in all_docs:                d_dict = vars(d)        if d_dict['metadata']['source'].replace('docs_data/','') in docs_sublist:            if len(d.page_content) > 20:                # Add file name to content for more context                if prefix_file_name_to_chunks:                    file_clean = re.sub(r'docs_data\/|\.pdf', '', d_dict['metadata']['source'])                      file_clean = re.sub(r'\-|\_', ' ', file_clean)                                    d.page_content = f"{extra_prefix} {file_clean}: {d.page_content}"                docs.append(d)    # Create vector DB directory    if os.path.exists(vecs_dir):        shutil.rmtree(vecs_dir)    os.makedirs(vecs_dir)    # Choose our models    embedding_model = OpenAIEmbeddings()    chat_model = ChatOpenAI(temperature=temperature,model_name="gpt-4")    # Calculate embeddings    embeddings = OpenAIEmbeddings()    vectordb = Chroma.from_documents(docs, embedding=embedding_model,persist_directory=vecs_dir)    vectordb.persist()        # Set up chat    memory = ConversationBufferMemory(memory_key="chat_history", input_key='question', output_key='answer', return_messages=True)    pdf_qa = ConversationalRetrievalChain.from_llm(chat_model, vectordb.as_retriever(), memory=memory, \                                                   return_source_documents=True)    return pdf_qadocs = all_docs# Note the argument prefix_file_name_to_chunks=Truepdf_qa = setup_model(vecs_dir, docs_sublist, docs, prefix_file_name_to_chunks=True, extra_prefix="This snippet relates to ")ask_question("How do I prepare my home for floods?", pdf_qa)

问题:如何为洪水做好家庭准备?答案:您可以采取以下几个步骤来为洪水做好家庭准备:1. 将水引离建筑物:确保您的院子朝建筑物的方向倾斜,并确保水有地方排水。清理您的排水沟,评估排水问题,或者收集雨水。2. 固定燃料罐:将任何燃料罐固定在基座上,以防止其倾斜或在洪水中漂浮。泄漏的燃料可能会成为火灾隐患。3. 防洪墙:在墙上添加防水外覆层,并密封它们,以防止浅层洪水对您的家造成损害。覆盖低于基本洪水标高(BFE)的开口,并密封所有泵和设备周围的外部开口。4. 固定制造房屋:如果您有一座制造房屋,它必须固定在永久基础上,以使车轮和轴不支撑其重量,并抵抗浮动、坍塌或侧向移动。5. 提高您的家庭:提高您的家庭可以使您的财产免受洪水影响,并降低洪水保险费。最低楼层应高于BFE。6. 固定院子物品:未固定的物品可能会被洪水冲走或损坏。通过将它们固定或连接到更坚固的结构上来固定院子里的物品。7. 封堵裂缝和缝隙:检查窗户和门周围的填缝,确保它们没有破裂、损坏或缺失。填补进入建筑物的管道和电线周围的任何孔洞或缝隙。8. 准备或更新财产清单:记录您所有的财产将有助于保险索赔过程。9. 购买洪水保险:大多数房主保险政策不包括洪水损失。为您的房屋和财产购买洪水保险,保护您的投资。10. 存放贵重物品:将贵重物品和重要文件存放在高于BFE的防水或耐水容器中。11. 将公用事业设施提高到BFE以上:将机械设备、炉子、热水器、电气系统和其他公用事业设施提高到砖石、混凝土或防腐木板上,至少高出BFE 12英寸。12. 用瓷砖替换地毯:瓷砖比地毯更能抵抗洪水。在低于BFE的区域使用瓷砖或其他抗洪材料可以减少水灾损害。13. 防洪地下室:通过防洪处理地下室并用防水化合物密封墙壁来减少损害。考虑安装一个污水泵。14. 安装洪水通风口:在基础墙、车库和其他封闭区域安装洪水通风口,以允许水流过、排出,并降低结构损坏的风险。15. 使用抗洪保温材料和石膏板:抗洪保温材料和石膏板将有助于最小化损害,并且可以轻松清洁和消毒。16. 防止下水道倒流:在某些地区,洪水可能会导致下水道通过家庭的排水管倒流。咨询管道工,如果适用,投资于下水道倒流阀以防止这种潜在的健康危害。

在对您的家进行任何改变之前,请咨询保险代理、建筑师、工程师、承包商或其他设计和建筑专家。

太棒了!现在似乎已经成功捕获了PDF中的重要页面,并对其进行了很好的总结。显然,这是一种非常粗糙的方法,使用元数据而不仅仅是文件名来进行更正式的处理会更好。使用模板而不仅仅是添加前缀可能更加优雅,但这确实说明了一点上下文的帮助。

现在,如果我们使用我们集合中的所有文档...

vecs_dir = './vector_dbs/all_docs'docs = all_docs# 注意参数prefix_file_name_to_chunks=Truepdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="这段代码与")result = ask_question("如何为洪水做好家庭准备?", pdf_qa)

问题:如何为洪水做好家庭准备?答案:您可以采取以下几个步骤来为洪水做好家庭准备:1. 为您的家庭制定应急计划,并定期进行演练。当风暴来临时,及时疏散并将您的车辆移至较高地带。2. 为您的房屋及其内部物品购买洪水保险,即使您不居住在高风险洪水区域。3. 记录您的财物。如果需要提出索赔,这将有助于保险处理过程。4. 将贵重物品和重要文件存放在高于基本洪水标高(BFE)的防水或耐水容器中。5. 将水暖设备和水电设施(如热水器、洗衣机、烘干机和电力面板)置于较高楼层,以防止其受到洪水的损坏。6. 使用抗洪材料进行隔热、石膏板和地板覆盖,以减少损坏。7. 确保您的庭院朝建筑物外部倾斜,并确保有排水的地方。8. 锚固燃料罐,以防止其倾倒或在洪水中漂浮。9. 在墙壁上添加防洪隔热层,并密封它们,以防止浅层洪水对您的房屋造成损害。10. 如果您有一座移动式住宅,请确保它固定在永久基础上。11. 将您的房屋提高到基本洪水标高以上。12. 通过锚定或将物品固定在更牢固的结构上来保护庭院中的物品。13. 检查窗户和门的填缝胶,确保其没有开裂、破损或缺失。填补进入建筑物的管道和电线周围的任何孔洞或缝隙。14. 在建设您的住宅、车库、小屋或其他建筑物时,要远离河道和岸线。如果可能,要建在较高的地方。15. 将地毯更换为地砖,因为

这做得很好,它从我们的关键文章中提取了信息,这些文章位于https://www.fema.gov/sites/default/files/2020-11/fema_protect-your-home_flooding.pdf,并且还包括了来自https://www.fema.gov/sites/default/files/documents/fema_protect-your-property-storm-surge.pdf的一篇文章,这是该系列中唯一提到洪水的其他文件。

提取提示长度

此时值得注意的是,将文档摘录转化为合理答案的最终总结提示可能会相当长,具体取决于摘录的大小和数量。与LLMs的持续争斗是在不违反标记限制的情况下实现我们的目标。尽管对于我们的用例影响不大,但其他情况可能需要采用上下文压缩方法。

问题上下文可能很重要

我们故意混合了与(i)灾害规划和(ii)对危险事件立即做出反应相关的文件。这可能导致混淆的回答,混合了这两个上下文...

result = ask_question("我住在一个运河旁边,现在看到水位正在上涨,我该怎么办?", pdf_qa, output_docs=True)

问题:我住在一个运河旁边,现在看到水位正在上涨,我该怎么办?答案:如果您立即注意到水位上升,重要的是优先考虑您的安全。您可以采取以下一些步骤:1. 疏散:如果水位迅速上升,尽快疏散到较高的地方至关重要。2. 移动您的汽车:如果有时间,将您的汽车移动到较高的地方。根据国家气象局的数据,只有两英尺的水深就足以移动一辆车辆。3. 保护您的住宅:如果有时间,通过将贵重物品和重要文件搬到楼上或至少高于基准洪水标高(BFE)来保护您的住宅。将它们放在防水或耐水容器中。4. 沟通:让您的家人、朋友和邻居了解情况。如果您有预先确定的集合点,请前往那里或告知他人您的疏散计划。5. 联系当地当局:通知当地当局有关情况。他们可以提供指导,并警告可能处于危险中的其他人。6. 检查洪水图:如果您可以接入互联网,请查看您所在地区的洪水图,了解潜在风险。请记住,这些步骤只是一般指南。在洪水情况下,始终遵循当地当局和紧急服务的建议。

现在答案有些混合,一些点与立即行动有关,例如“将您的汽车移到较高的地方”,而其他点与准备工作有关,例如“购买洪水保险”。当人们在紧急情况下感到紧张时,他们可能不会考虑到提示工程,因此我们可以预期输入会有些模糊。

当然,我们可以通过使用更多的文档元数据将其分成子组来解决此问题,但如果没有可用的元数据,这就需要一些工作。另一种选择是为问题提供更多的上下文,以指示用户是否对灾害准备感兴趣,或者是否需要立即帮助。我们可以为此构建一个分类器,但在这个功能强大的LLMs时代,让我们使用GPT-4进行零样本分类...

def get_time_context(question):    template = """以下问题与“规划”或“立即采取行动”有关:{question}    请用以下选项之一回答:“我正在提前做准备:”或“我需要立即采取行动:”或“模糊”"""    prompt = PromptTemplate(template=template, input_variables=["question"])    llm = OpenAI()    llm_chain = LLMChain(prompt=prompt, llm=llm)    answer = llm_chain.run(question)    return answerquestions = [    "我住在一个运河旁边,水位正在上涨,我该怎么办?",    "救救,我的屋顶被吹走了!",    "我如何防止我的屋顶在飓风中被吹走",    "狗",    "如何为洪水做好家庭准备?"]for q in questions:    print(f"问题:{q}")    answer = get_time_context(q)    print(answer.strip(), "\n")

问题:我住在一个运河旁边,水位正在上涨,我该怎么办?我需要立即采取行动: 问题:救救,我的屋顶被吹走了!我需要立即采取行动: 问题:我如何防止我的屋顶在飓风中被吹走我正在提前做准备。 问题:狗模糊 问题:如何为洪水做好家庭准备?我正在提前做准备。 

很好!只需非常少的努力,我们就可以轻松确定一个问题是否与规划或立即采取行动有关。

现在我们可以用以下方式前缀用户问题...

def get_time_context(question: str) -> str:    template = """以下问题是否与“规划”或“立即采取行动”有关:{question}    请用以下答案之一回答:“我正在提前规划:”、“我需要立即采取行动:”或“模棱两可”"""    prompt = PromptTemplate(template=template, input_variables=["question"])    llm = OpenAI()    llm_chain = LLMChain(prompt=prompt, llm=llm)    answer = llm_chain.run(question)    return answerdef ask_question(    query: str,    qa: object,    output_docs: bool = True,    preprocess_time_context: bool = False) -> dict:    # 首先获取时间背景    if preprocess_time_context:        time_context = get_time_context(query)        if '规划' in time_context.lower():            query = f"我正在提前规划:{query}"        elif '立即采取行动' in time_context.lower():            query = f"我需要立即采取行动:{query}"    print(f"\n问题:\n{query}")    result = qa({"question": query})        print(f"\n答案:\n{result['answer']}")    if output_docs:        for doc in result['source_documents']:            print('\n')            print(json.dumps(vars(doc), indent=4))    return resultresult = ask_question("我住在运河旁边,看到水位上升,我该怎么办?", pdf_qa, output_docs=False, preprocess_time_context=True)

结果如下...

问题:我需要立即采取行动:我住在运河旁边,看到水位上升,我该怎么办?答案:如果你看到运河旁边的水位上升,应立即实施你的紧急计划。这包括撤离你的家,并将车辆移至较高处,因为仅两英尺的水就可以移动一辆车。你还应确保你的贵重物品和重要文件储存在基础洪水高程(BFE)以上,最好是在上层,并放在防水或耐水的容器中。如果时间允许,考虑将电器和公用事业设备(如热水器、洗衣机、烘干机和电力面板)移至较高楼层,以防止它们被洪水损坏或破坏。始终将你和家人的安全置于首位,而不是保护财产。

太好了,工作得很顺利,没有试图向我们销售任何保险,它给出了可以立即采取行动的建议。

让我们测试相反的情况...

result = ask_question("我该怎么做才能使我的房子防火?", pdf_qa, output_docs=False, preprocess_time_context=True)

问题:我正在提前规划:我该怎么做才能使我的房子防火?答案:你可以采取以下几个步骤使你的房子抵抗森林火灾:1. 使用具有非可燃覆盖物的A级屋顶进行安装或更换。屋顶是火灾中房屋最危险的部分,因为它的大小和朝向。2. 使用非可燃或耐火材料安装和更换外墙覆盖物。建议墙体组件的最低防火等级为一小时。3. 在你的家周围建立30英尺的可抵御空间,通过减少或清除易燃植被,并使用碎石、砖块或混凝土等非可燃材料。4. 定期清理并清除屋顶和排水沟中的杂物,以减少顶部火灾的可能性。5. 封闭你家的基础,以降低风吹灰尘进入你家的可能性。6. 通过购买和安装具有专用电源或水箱的外部洒水系统来计划供水。7. 通过安装多层窗户、钢化安全玻璃或防火百叶窗,保护大窗户免受辐射热的侵害。8. 安装高度可见的街道标志和物业地址,以帮助消防员和其他紧急救援人员迅速找到你的物业。9. 使用防火硅胶、砂浆或防火膨胀泡沫封堵外墙和屋顶的开口处的缝隙。10. 使用金属线网覆盖外部阁楼通风口和檐口通风口,网孔尺寸不大于1/8英寸,以防止飞灰进入。11. 在框架墙顶部和房屋基础之间的间隙中安装防火块,以使火焰缺氧,并防止其蔓延。请记住,这些建议可能在一起效果更好,并且需要根据你的物业进行调整。在对你的家进行任何改动之前,务必咨询专业人士,如你的保险代理、建筑师、工程师、承包商或其他设计和建筑方面的专家。

很好,它提供了森林火灾准备信息。

显然,对于任何可能在真正紧急情况下使用的高风险事物,都需要进行大量测试,但这说明了我们可以通过丰富用户提示来增强性能的一种方式。

确保答案仅来自提供的文档

对于可能影响安全的应用程序,确保所呈现的信息仅来自提供的文档非常重要。包含不正确信息的幻觉可能会产生非常严重的后果。

让我们试着问一些与灾害完全无关的问题...

result = ask_question("如何制作海绵蛋糕?", pdf_qa, output_docs=False)

结果是...

问题:如何制作海绵蛋糕?答案:很抱歉,但所提供的上下文中没有关于如何制作海绵蛋糕的信息。

虽然我有点遗憾没有找到如何制作美味蛋糕的方法,但是LangChain很好地处理了这种情况,并确定这个问题与所提供的PDF指南中的信息无关。

这很好,没有产生严重的幻觉!在灾难中,我最不想被告知要制作海绵蛋糕并驾驶太空船之类的东西。😊

会话历史

LangChain的一个很棒的功能是它可以无缝地处理会话历史。通过一行代码,模型可以继续之前的问题...

result = ask_question("即将有飓风来袭,我该怎么办?", pdf_qa, output_docs=False)问题:我需要立即采取行动:有飓风预报,我该怎么办?答案:如果有飓风预报,你应该采取以下立即行动:1. 检查你所在地区的洪水风险。你可以通过访问https://msc.fema.gov/portal/home并输入你的家庭地址来做到这一点。2. 了解飓风警报和飓风警告之间的区别。飓风警报意味着在指定区域内可能出现飓风条件,并在预计发生热带风暴级别风力之前提前48小时发布。飓风警告意味着在指定区域内预计将出现飓风条件,并在预计发生热带风暴级别风力之前提前36小时发布。3. 围绕你的房屋采取措施以减少洪水事件的影响。这可能包括在最容易受到洪水威胁的地区放置沙袋,并将空调、发电机和断路器等机械设备抬高,以最小化飓风潮水的影响风险。4. 建立一个中央集合地点,这样如果停电,人们就知道在哪里与亲人汇合。5. 准备一个应急包,其中应包括水、急救包、手电筒、电池、手摇/太阳能收音机、非易腐食品、现金、扳手、洗手液、一张镀铝毯、耳塞和一本书和/或一副纸牌。6. 确保在发布飓风警报或飓风警报之前已经准备好物品和服务。这可能包括为亲人打包舒适物品,并确保需要定期进行心理健康治疗的亲属知道避难所的位置。7. 将重要文件存放在密封袋中并放在安全的地方。或者,您可以将它们存储在云驱动器上,存储在备用位置的闪存驱动器上,或存放在安全存放箱中。8. 为宠物准备一份应急包,包括食物、水、药物和喜爱的玩具。确保宠物有芯片植入或至少有身份标签。9. 熟悉您所在地区预定的沿海疏散路线。10. 在电话线路和蜂窝塔遭到损坏时,为通信方法做好准备。这可能包括短信或使用Twitter、Facebook、Instagram等社交媒体平台。

然后向它提问与“它”(飓风)有关的问题...

result = ask_question("即将到达,求救!", pdf_qa, output_docs=False, preprocess_time_context=True)问题:即将到达,求救!答案:以下是你应采取的一些立即行动确保安全:1. 如果你在洪水区域,请考虑撤离到更安全的地方。如果无法撤离,请在家中选择较高的地方。2. 通过关闭和封闭窗户来保护你的家。移除任何可能被风吹走的室外物品。3. 收集你的应急用品,包括你的应急包,其中应包括水、急救包、手电筒、电池、手摇/太阳能收音机、非易腐食品、现金、扳手、洗手液、一张镀铝毯、耳塞和一本书和/或一副纸牌。4. 如果你有宠物,请确保你也为它们准备了应急包,包括食物、水、药物和喜爱的玩具。确保它们有芯片植入或有身份标签。5. 确保你的车加满油,并准备好紧急情况下的撤离。6. 拔掉所有电器插头,以防止电力浪涌损坏。7. 通过收听收音机或查看可信网站,了解风暴的路径和强度。8. 与家人保持联系,并确保每个人都知道计划。如果可能,建立一个中央集合地点,以防分离。9. 将贵重物品和重要文件存放在安全、高的地方或防水容器中。10. 如果有时间,在最容易受到洪水威胁的地方放置沙袋。记住,你的安全是最重要的。物质可以替换,但生命无法替代。

很好,它可以保留历史记录并知道我所指的内容。在压力下,一个用户可能会提出后续问题,所以这个能力-只需2行代码!-非常重要。

翻译

为了使聊天机器人更加灵活,我们可以探索多语言支持。许多主要的LLM,如GPT-4,提供对顶级语言的本地支持,但性能可能因语言而异。

让我们从葡萄牙语开始…

from googletrans import Translatortranslator = Translator()q = translator.translate("How do I prepare my home for floods?", dest='pt')print("================ RAW =================")pdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="This snippet relates to ")result = ask_question(q.text, pdf_qa, output_docs=True, preprocess_time_context=True)q = translator.translate(result['answer'], dest='en')print("\n\n=============== TRANSLATED TO ENGLISH USING GOOGLE TRANSLATE =================\n")print(q.text)

================ RAW =================问题:我提前计划:如何为洪水做好家庭准备?答案:有几种方法可以为洪水做好家庭准备:1.拥有应急计划:为您的家庭制定应急计划并定期进行演练。当风暴来临时,疏散并将您的车辆移到更高的地方。2.购买洪水保险:大多数住宅保险不包括洪水损失。通过购买洪水保险保护您的投资,包括您的房屋和财产。3.准备或更新家庭财产清单:记录您的财产。这将给您带来安心,并在需要提出索赔时有助于保险流程。4.存放贵重物品:将贵重物品和重要文件存放在BFE(最好是在上层楼)之上。将它们放入防水或耐水容器中。5.将电器和公用事业提高到BFE之上:将水加热器、洗衣机、干衣机和电气面板等电器和公用事业放在较高的楼层。这可以防止它们被洪水损坏或毁坏。6.使用抗洪材料:抗洪绝缘材料、石膏板和瓷砖等地板材料将有助于减少损坏,并且更易于清洁和消毒。7.了解您的财产和社区:如果您搬到一个大湖或海洋附近,请与您的邻居交谈。了解他们遇到的任何问题或他们采取的减灾措施。8.提高您的房屋:尽管这是一项投资,但提高您的房屋可以预防洪水并减少洪水保险费。9.保护您的院子物品:不安全的物品可能被洪水冲走或损坏。它们也可能被带进您的家中,造成损坏。10.密封裂缝和缝隙:检查窗户和门周围的填缝,确保它没有破裂、破损或缺失。填补进入建筑物的管道和电线周围的任何孔洞或缝隙。

请记住,在对您的家进行任何更改之前,始终与专业人士咨询,例如您的保险代理人、建筑师、工程师、承包商或其他设计和施工专家。

哪一个是正确的信息。然而,使用斯瓦希里语...

q = translator.translate("How do I prepare my home for floods?", dest='sw')print("================原文=================")pdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="This snippet relates to ")result = ask_question(q.text, pdf_qa, output_docs=True, preprocess_time_context=True)q = translator.translate(result['answer'], dest='en')print("\n\n=============== 使用谷歌翻译翻译成英语 =================\n")print(q.text)

================原文================问题:Je, ninatayarishaje nyumba yangu kwa mafuriko?答案:Kuna hatua kadhaa unazoweza kuchukua ili kulinda nyumba yako dhidi ya mafuriko:1. Elekeza Maji Mbali na Majengo:Hakikisha eneo lako linaelekea mbali na majengo kwenye mali yako na kwamba maji yana mahali pa kumwagika. Safisha mifereji yako, tathmini masuala ya mifereji ya maji, au kukusanya maji katika mapipa ya mvua.2. Nanga Mizinga ya Mafuta:Nanga mizinga yoyote ya mafuta kwenye pedi ili kuzuia kuzunguka au kuogelea katika mafuriko. Mafuta yaliyomwagika yanaweza kuwa hatari ya moto. Hakikisha kuwa matundu ya uingizaji hewa na ufunguzi wa mstari wa kujaza yako juu ya BFE (Base Flood Elevation). Kumbuka:Hii inaweza kuhitaji ruhusa kutoka kwa mtoa huduma wako wa mafuta.3. Kinga Kuta dhidi ya Mafuriko:Ongeza sheathing inayostahimili maji kwenye kuta na uzibane ili kuzuia mafuriko ya kina kifupi kuharibu nyumba yako. Funika ufunguzi chini ya BFE na ziba ufunguzi wote wa nje karibu na pampu na vifaa.4. Thibitisha Nyumba Zilizotengenezwa:Ikiwa una nyumba iliyotengenezwa na unataka bima ya mafuriko kutoka kwa Programu ya Bima ya Mafuriko ya Kitaifa, nyumba yako lazima iwe imewekwa kwenye msingi wa kudumu ili magurudumu na axles zisitoe uzito wake na kuzuia kuelea, kuanguka, au harakati ya upande kwa upande.5. Kumbuka:Baadhi ya vidokezo hivi vinaweza kufanya kazi vizuri pamoja kuliko vingine. Hatua za kupunguza madhara zinahitaji kubinafsishwa kwa mali yako. Pia, sio chaguo zote hufanya kazi pamoja, kwa hivyo ongea na mtaalamu anayeweza kukusaidia kutambua chaguo zipi zinafanya kazi vizuri kwako.Daima shauriana na wataalamu kama wakala wako wa bima, wasanifu, wahandisi, wakandarasi, au wataalamu wengine katika kubuni na ujenzi kabla ya kufanya mabadiliko kwenye nyumba yako. Ofisi yako ya mipango na mipango ya eneo au idara ya ujenzi ni mahali pazuri pa kuanza kwa ushauri.Mwishowe, kuwa mwema kwa majirani zako! Zungumza na wamiliki wa mali jirani kabla ya kufanya mabadiliko, kwani vitendo fulani kwenye mali yako vinaweza kuathiri yao.=============== 使用谷歌翻译翻译成英语 =================有几个步骤可以采取来保护您的家免受洪水的影响:1. 将水远离建筑物:确保您的区域远离您物业上的建筑物,并且水有排水的地方。清理您的排水沟,评估排水问题,或者收集雨水。2. 固定油罐:将任何油罐固定在垫上,以防止其在洪水中滚动或漂浮。溢漏的油可能会造成火灾危险。确保通风孔和加油线开口位于BFE(洪水基准高度)之上。注意:这可能需要您的燃料供应商的许可。3. 保护墙壁免受洪水侵害:在墙壁上添加防水隔离层并密封以防止浅层洪水对您的家造成损害。覆盖BFE下的开口,并在泵和设备周围封堵所有外部开口。4. 验证制造的住宅:如果您拥有制造的住宅并希望从国家洪水保险计划获得洪水保险,您的住宅必须放置在永久基础上,以防止车轮和轴承失去重量并防止浮动、倒塌或并排移动。5. 注意:其中一些提示可能共同起作用更好。减灾措施需要根据您的财产进行定制。此外,并非所有选项都能共同使用,因此请与专业人士商讨,以帮助您确定哪些选项最适合您。在对您的家进行改造之前,请始终与专业人士(例如您的保险代理、建筑师、工程师、承包商或其他专业人员)咨询。您当地的规划和发展办公室或建筑部门是寻求建议的好地方。最后,善待您的邻居!在进行改变之前,与附近的房地产业主交流,因为您的财产上的某些行动可能会影响到他们。

结果看起来非常合理,但缺少重要信息。匹配的文本摘录缺少一些关键的洪水部分,我们还有与洪水无关的片段,当我们询问洪水时。基本上,使用从英语文档创建的嵌入与斯瓦希里语问题不太适用。虽然这并不是不合理的,但对于一种拉丁语葡萄牙语来说效果很好。

也许更强大的方法是首先检测语言并使用谷歌翻译将其翻译为英语,然后将响应转换回原来的语言。

让我们将这添加到我们的聊天界面中...

def get_time_context(question: str) -> str:    template = """以下问题是否与“计划”或“立即采取行动”有关:{question}    请用以下之一回答:“我正在计划:”、“我需要立即采取行动:”或“不确定”"""    prompt = PromptTemplate(template=template, input_variables=["question"])    llm = OpenAI()    llm_chain = LLMChain(prompt=prompt, llm=llm)    answer = llm_chain.run(question)    return answerdef ask_question(    query: str,    qa: object,    output_docs: bool = True,    preprocess_time_context: bool = False,    auto_translate: bool = False,) -> dict:    # 自动翻译    if auto_translate:        lang = translator.detect(query)        lang = lang.lang        print(f"检测到的语言:{lang}")        q = translator.translate(query, dest='en')        query = q.text    # 首先获取时间上下文    if preprocess_time_context:        time_context = get_time_context(query)        if '计划' in time_context.lower():            query = f"我正在计划:{query}"        elif '立即采取行动' in time_context.lower():            query = f"我需要立即采取行动:{query}"    print(f"\n问题:\n{query}")    result = qa({"question": query})    # 将结果翻译回源语言    if auto_translate:        q = translator.translate(result['answer'], dest=lang)        result['answer'] = q.text        print(f"\n回答:\n{result['answer']}")    if output_docs:        for doc in result['source_documents']:            print('\n')            print(json.dumps(vars(doc), indent=4))    return result# 翻译为斯瓦希里语q = translator.translate("如何为洪水做好家庭准备?", dest='sw')print("================ 原始内容 =================")result = ask_question(q.text, pdf_qa, output_docs=False, preprocess_time_context=True, auto_translate=True)q = translator.translate(result['answer'], dest='en')print("\n\n=============== 使用谷歌翻译翻译为英语 =================\n")print(q.text)

================ 原始内容 =================检测到的语言:sw问题:我正在计划:如何为洪水做好家庭准备?回答:有几个步骤可以帮助您为潜在的洪水做好家庭准备:1. 为您的家庭制定应急计划,并定期进行工作。当暴风雨来临时,离开并将您的车开到高处。2. 为您的房屋和财产购买洪水保险,即使您不住在高洪水风险区域。3. 记下您的物品清单。如果需要提出索赔,这将有助于保险处理过程。4. 在洪水基准高度(BFE)以上储存贵重物品和重要文件,最好放在楼上、防水或防潮容器中。5. 将水器、洗衣机、烘干机和电力面板等设备和服务提升到楼上,以防止它们被洪水水淹没而受损。6. 在您的住宅中使用抗洪材料。7. 确保您的院子远离财产上的建筑物,并且水有出水的地方。8. 锚定任何燃油储罐,以防止其翻滚或漂浮在洪水中。9. 在墙壁上添加防水外层材料,并将其密封,以防止深层洪水对您的房屋造成损坏。10. 如果您拥有一栋制造好的房屋,请确保它安放在永久基础上。11. 将您的房屋抬高到洪水基准高度以上。12. 通过锚定或附着到较大的结构物上,确保您的院子中的物品安全。13. 检查窗户和门的周围,确保它们没有破裂、破损或缺失。填补围绕进入建筑物的管道和电线的任何孔洞或裂缝。14. 将您的房屋、车库、棚屋或其他建筑物建设在河流和海滩路径远离的地方。如果可能,建设在较高的地面上。请记住,在对您的住宅进行更改之前,请咨询专业人士,如您的保险代理、建筑师、工程师、承包商或其他设计和建筑专业人士。

使用Google翻译将斯瓦希里语自动翻译成英语,然后将答案再翻译回斯瓦希里语,从我们的一系列PDF中获得所有所需信息,效果更好。对于像灾难响应这样的风险关键用例,当然需要进行大量与母语人士的测试,以确保安全,但它显示出成为多语言的潜力。

提出更广泛的问题

好的,让我们来试试最终版本,并提出更多与灾害相关的问题...

# 再次设置模型,否则我们的斯瓦希里语会话历史将被使用vecs_dir = './vector_dbs/all_docs'docs = all_docspdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="这段摘录与")questions = [    "如果发生森林火灾,我应该为宠物做什么?",    "我的屋顶要被吹走了!!!求救,我应该怎么办?!!!",    "我住在小溪旁边,我应该担心洪水吗?",    "如果我住在内陆地区,海平面会影响我吗?",    "有没有便宜的方式获得洪水保险?",    "我们正处于地震中,我们该怎么办!!???",    "应急包中应该有什么物品?",]for q in questions:    print("\n ===================== ")    ask_question(q, pdf_qa, output_docs=False, preprocess_time_context=True, auto_translate=True)

===================== 检测到的语言: en问题: 我需要立即采取行动: 如果发生森林火灾,我应该为宠物做什么?答案:如果发生森林火灾,您应该为宠物准备一个应急包,其中应包括食物、水、药物、医疗记录(放在密封袋中)和喜欢的玩具(如果有的话)。包括兽医的联系信息,并确保您的宠物有芯片植入或至少有适当的身份标签。如果需要撤离,如果可能的话,请带上您的宠物。如果无法带上您的宠物,请确保它们处于一个安全的地方,可以获得食物和水。 ===================== 检测到的语言: en问题: 我需要立即采取行动: 我的屋顶要被吹走了!!!求救,我应该怎么办?!!!答案:如果您的屋顶要被吹走,FEMA(美国联邦紧急事务管理局)的宣传册没有提供关于立即行动的具体说明。然而,一般建议在您的家中寻找一个安全区域,远离窗户和可能掉落的碎片,寻求立即庇护。在严重的风灾之后,您应该联系专业人士评估和修复损坏。还要联系您的保险公司报告损失。 ===================== 检测到的语言: en问题: 我住在小溪旁边,我应该担心洪水吗?答案:是的,如果您住在小溪旁边,您应该担心洪水。洪水可能发生在任何地方,不仅限于高风险地区。大雨或排水不畅可能会导致洪水,特别是在低洼地区。重要的是采取措施保护您的家园,例如提高您的家庭、固定院内物品和确保排水畅通。您还应考虑购买洪水保险,因为如果没有总统宣布灾难,联邦灾害援助可能有限或无法获得。 ===================== 检测到的语言: en问题: 如果我住在内陆地区,海平面会影响我吗?答案:海平面变化主要影响沿海地区,导致增加的洪水、侵蚀和风灾损害。然而,如果您住在内陆地区,您仍可能间接受到影响。海平面变化可能改变天气模式,可能导致某些地区的降雨增加或干旱。此外,如果您依赖沿海地区的资源,例如海鲜或旅游业,海平面变化可能会影响这些产业。然而,这段摘录没有提供有关海平面变化如何影响居住在内陆地区的人的具体信息。 ===================== 检测到的语言: en问题: 我在提前计划: 有没有便宜的方式获得洪水保险?答案:是的,您可以通过国家洪水保险计划购买洪水保险。大多数房主保险不包括洪水损失的赔偿,因此购买住宅和财产的洪水保险非常重要,即使您不住在高风险洪水区。有关购买洪水保险的更多信息,您可以访问FloodSmart.gov或与您的保险代理联系以获取保险。提前计划并在暴风雨或洪水事件发生前购买洪水保险是保护您的财产的一种经济有效的方式。 ===================== 检测到的语言: en问题: 我需要立即采取行动: 我们正处于地震中,我们该怎么办!!???答案:当地震发生时,您应该“蹲下、掩护和紧紧握住!”这意味着您应该蹲到地上,用手臂保护头部和颈部,如果附近有更安全的地方,爬到那里并紧紧抓住。如果您在床上,留在那里,并用枕头保护头部和颈部。如果您在行驶中的车辆中,尽可能迅速和安全地停下来,并待在车内。避免停在建筑物、树木、立交桥和公用事业电线附近。地震停止后,小心前行,避免经过地震可能已损坏的道路、桥梁或坡道。 ===================== 检测到的语言: en问题: 我在提前计划: 应急包中应该有什么物品?答案:应急包应包括以下物品: - 水(每人每天一加仑)和/或水净化片- 急救包- 手电筒- 电池- 手摇/太阳能收音机- 非易腐食品- 药物/处方眼镜- 现金(小额面值)- 扳手(用于关闭公用事业)- 洗手液- 铝膜毯- 耳塞- 一本书/一副纸牌如果您有婴儿,还应包括婴儿食品、尿布、奶粉等。如果您有宠物,考虑为它们准备一个包,包括食物、水、药物、医疗记录和一个喜欢的玩具。此外,考虑在您的包中包含便携式充电设备,这样您就可以从汽车中充电。如果亲人需要定期进行心理治疗,确保他/她的心理健康提供者知道避难所的位置。

我认为这些都是非常令人惊奇的,我随机检查了一些,它们似乎捕捉到了使用的PDF文档中的关键内容。

[ 基于以上,我的灾难工具包现在有了耳塞! ]

评估性能

在这个分析中,我们只是随机检查了我们的聊天界面对一小部分FEMA PDF文档返回关键信息的情况。这对于说明一些概念是很好的,但对于一个生产应用程序来说,我们需要比随机检查更好的方法。幸运的是,LangChain提供了一套评估器,其中特别有一个使用Streamlit应用程序自动生成问题-答案对,并使用这些对检索链进行评估的应用程序,允许开发人员尝试一些相关参数。我还没有尝试过这个,但使用LLMs自动生成评估数据的想法似乎是一种构建更系统化测试我们的FEMA灾害机器人的方法。

结论

使用FEMA网站上的34个PDF文档,我们轻松地使用LangChain和GPT-4构建了一个多语言对话界面,能够回答与灾害准备和安全协议相关的各种问题。然而,对于高风险安全关键的聊天机器人,使用这种常见的文档检索LangChain模式面临着与语义搜索相同的挑战。即使使用了更多自然语言细微差别的高级LLM嵌入,丢失重要内容仍然很容易。

对于我们的FEMA灾害机器人用例,这是由于以下原因:

  • 混合上下文文档 - 如果不包含文档元数据,响应将混合不同上下文的信息。仅在文档名称前加上前缀可以改善我们的方案的性能,还可以应用更复杂的元数据策略。此外,将零-shot LLM分类器添加到丰富用户问题的方法也是有帮助的。
  • LLMs中欠代表的语言 - 依赖LLM翻译可能导致对斯瓦希里语等较少代表的语言的性能不佳。在我们的用例中,添加自动Google翻译可以提高性能。

我们探索了粗糙的方法来解决上述问题,但对于生产聊天机器人,需要更先进的技术和通过测试和验证发现的其他缓解措施。

尽管如此,LLMs现在能做到的还是非常令人惊奇!

参考资料

您可以在这里找到包含所有代码的笔记本。