LangChain是大型语言模型(LLM)的应用框架,LangChain可以直接与OpenAI的text-davinci-003、gpt-3.5-turbo模型以及HuggingFace的各种开源语言模如Google的flan-t5等模型集成。通过使用LangChain可以开发出更为强大和高效的LLM的各种应用。

信息抽取

我们给LLM提供一篇文章,我们希望LLM能帮我们把文章的主要内容罗列出来,文字尽量精简,简明扼要,如果想达到这样的目的,通过调用LLM提供的API似乎也能实现,但是Prompt可能会比较复杂,要把prompt写清楚,让LLM能够理解您的意图,可能也不是一件容易的事情。此时如果我们使用Langchain的prompt模板可以轻松完成类似的工作。

首先安装必要的python包

pip -q install openai langchain
from langchain.prompts import PromptTemplatefrom langchain.llms import OpenAIChatfrom langchain.chains import LLMChainimport os#你申请的openai的api keyos.environ['OPENAI_API_KEY'] = 'xxxxxxxx'

这里我们有一段关于阿尔茨海默病的文本描述,我们希望llmn能够从中提炼出有价值的信息,为此我们需要定义一个prompt模板,将文本信息作为一个变量存储在模板中,这样我们每次只要更换不同的文本信息就可以就可以实现让llm从中提取关键信息的功能,而不必每次都要告诉llm它应该做什么事情。

text="阿尔茨海默病(Alzheimer's disease, AD),俗称老年痴呆症,是一种全身性神经退行性疾病,它是由大脑神经退行性变性引起的,\主要表现为记忆力减退、思维能力减退、行为变化等。阿尔茨海默病的原因尚不十分清楚,但是研究表明,阿尔茨海默病可能与遗传因素、环境因素、\营养不良、压力过大、不良生活习惯等有关。根据世界卫生组织的统计数据,全球有超过4700万人患有阿尔茨海默病,其中美国有超过600万人患有阿尔茨海默病,\欧洲有超过1000万人患有阿尔茨海默病,亚洲有超过2500万人患有阿尔茨海默病,其中中国有超过1000万人患有阿尔茨海默病。阿尔茨海默病的发病率与年龄有关,\随着年龄的增长而增加,65岁以上的人群为主要受害群体,占比高达80%,其中45-65岁的人群占比为15%,20-45岁的人群占比为5%。65岁以上的人群发病率约为10%,\75岁以上的人群发病率约为20%,85岁以上的人群发病率约为30%。根据统计,男性患病率高于女性,男性患病比例为1.4:1,即男性患病率比女性高出40%。\根据统计,阿尔茨海默病在不同的人种中分布情况也有所不同。白人患病率最高,占总患病率的70%,黑人患病率次之,占总患病率的20%,\其他少数民族患病率最低,占总患病率的10%。阿尔茨海默病在不同的饮食习惯中分布情况也有所不同。维生素B12缺乏的人群患病率更高,\而均衡膳食的人群患病率较低。阿尔茨海默病不仅会给患者带来记忆力减退、思维能力减退、行为变化等症状,还会给患者的家庭带来巨大的心理负担。\因此,患者应尽快就医,及时进行治疗。治疗阿尔茨海默病的方法有药物治疗、行为治疗、认知行为治疗等,具体治疗方案要根据患者的具体情况而定。"#加载openai的llmllm = OpenAIChat(model_name="gpt-3.5-turbo")#创建模板fact_extraction_prompt = PromptTemplate(input_variables=["text_input"],template="从下面的本文中提取关键事实。尽量使用文本中的统计数据来说明事实:\n\n {text_input}")#定义chainfact_extraction_chain = LLMChain(llm=llm, prompt=fact_extraction_prompt)facts = fact_extraction_chain.run(text)print(facts)

给出治疗方案

我们让llm从一大堆文本信息中抽取了关键信息,我们让llm根据这些关键信息给出治疗建议,下面我们需要再建一个prompt模板,把提取的关键信息作为变量存储在该模板中。

doctor_prompt = PromptTemplate(input_variables=["facts"],template="你是神经内科医生。根据以下阿尔茨海默病的事实统计列表,为您的病人写一个简短的预防阿尔茨海默病的建议。 不要遗漏关键信息:\n\n {facts}")定义chaindoctor_chain = LLMChain(llm=llm, prompt=doctor_prompt)doctor_suggest = doctor_chain.run(facts)print(doctor_suggest)

把不同的Chain整合在一起

前面我们定义了两个Chain,一个用来从文本中抽取关键信息,另一个根据抽取的关键信息给出治疗建议,这里我们还可以把这两个Chain整合在一起,让它可以自动完成这两个工作:

from langchain.chains import SimpleSequentialChain, SequentialChain#定义SimpleSequentialChainfull_chain = SimpleSequentialChain(chains=[fact_extraction_chain, doctor_chain],verbose=True)response = full_chain.run(text)

API Chain

我们知道像ChatGPT这样的大型语言模型是非常强大的,不过由于它们目前学到的都是2022年之前的知识,对于2022年之后发生的事情它们可能一无所知,所以仍然有一些简单的基础性问题它也无法回答,比如您问ChatGPT当前的时间,当前的天气情况等,它仍然无法给出正确答案,不过LangChain和LLm集成以后,可以通过访问第三方提供的API来获取我们需要的信息,并把这些信息喂给llm,这样llm就可以从中提炼出我们需要的内容和格式输出给我们。下面我们通过一个例子来说明如何让Langchain调用第三方机构的api,并返回结果给ChatGPT,最后ChatGPT按照正确的格式输出我们想要的内容。

这里,我们向ChatGPT询问上海当前的温度,一般情况下ChatGPT是无法给出正确的答案。

from langchain.llms import OpenAIChatfrom langchain.chains.api.prompt import API_RESPONSE_PROMPTfrom langchain.chains import APIChainfrom langchain.prompts.prompt import PromptTemplatefrom langchain.chains.api import open_meteo_docsllm = OpenAIChat(model_name="gpt-3.5-turbo")chain_new = APIChain.from_llm_and_api_docs(llm,open_meteo_docs.OPEN_METEO_DOCS,verbose=True)#我们向ChatGPT询问上海当前的温度chain_new.run('上海现在的温度是多少摄氏度?')

我们可以看到langchain的APIChain首先访问了第三方(open-meteo.com)的天气预报API,然后返回一大堆天气预报的信息,但是信息需要通过ChatGPT来解析后再返回给用户他们需要的内容:

API 调用地址:https://api.open-meteo.com/v1/forecast?latitude=31.2304&longitude=121.4737&hourly=temperature_2m&current_weather=true&temperature_unit=celsius

API 返回信息:

ChatGPT返回信息:

不过目前ChatGPT根据API调用结果返回的信息还是英文的。虽然实现了我们的要求,但还是有点瑕疵。

总结

今天我们学习了如何利用langchain的chain结合LLM来提取文本信息中的关键内容,然后通过另外一个chain根据这些关键信息给出治疗疾病的建议,最后我们把这两个chain整合为一个更为强大的Chain,它可以自动完成这两份工作。另外我们还介绍了langchain的API Chain,通过让api chain调用第三方提供的API, 我们可以让ChatGPT回答一些以前无法回答的问题。

参考资料

LangChain 官方文档