我们知道,LLM
是训练出来之后,它其实是没有办法告知我们最新的信息的。因为它的训练数据是固定的,所以它只能回答它学习到的内容。
比如,如果我们问,“今天广州天气怎么样?”,LLM 是没有办法回答的。
通过前面的文章,我们也知道了,我们也可以自己提供一些信息给
LLM,让它回答我们的问题,因为 LLM 它其实是有分析推理能力的。
所以有一种办法是,搜索一下互联网,找到相关的信息,然后将搜索到的信息提供给
LLM,让它回答我们的问题。
直接问 LLM 天气如何
如果我们直接问 LLM
今天天气如何,它们会告诉我们无法提供实时天气信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 from langchain_openai import ChatOpenAIllm = ChatOpenAI( model_name="gpt-3.5-turbo" , temperature=0 , max_tokens=200 , api_key="your key" , base_url="https://api.openai-hk.com/v1" , ) response = llm.invoke('今天广州天气如何?' ) print (response.content)
输出:
1 很抱歉,我无法提供实时天气信息。你可以通过询问天气应用程序或者网站来获取广州今天的天气情况。希望可以帮到你。看看下一句我能帮上忙吗?
这是因为,LLM
的训练数据都是训练模型的那时候的,所以它是没有办法提供实时信息的,它只知道过去的信息。
LLMRequestsChain
我们可以使用 LLMRequestsChain
这个类来实现这个功能。这个类是 Chain
的子类,它可以从互联网上获取信息,然后提供给 LLM。
这其实等于是,我们搜索到了内容,然后让 LLM
帮我们提炼出我们想要的信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 from langchain.chains.llm import LLMChainfrom langchain_community.chains.llm_requests import LLMRequestsChainfrom langchain_core.prompts import PromptTemplatefrom langchain_openai import ChatOpenAIllm = ChatOpenAI( model_name="gpt-3.5-turbo" , temperature=0 , max_tokens=200 , api_key="your key" , base_url="https://api.openai-hk.com/v1" , ) def query_baidu (question ): template = """ 在 >>> 和 <<< 之间是从百度搜索结果中提取的原始文本。 提取问题 '{query}' 的答案或者说 "not found" 如果信息不包含在内。 >>> {requests_result} <<< """ prompt = PromptTemplate( input_variables=["query" , "requests_result" ], template=template ) inputs = { 'query' : question, 'url' : "https://www.baidu.com/s?wd=" + question.replace(" " , "+" ), } llm_chain = LLMChain(llm=llm, prompt=prompt) request_chain = LLMRequestsChain(llm_chain=llm_chain, output_key="query_info" ) return request_chain.invoke(inputs) print (query_baidu("今天广州天气?" ))
输出:
1 2 3 4 5 { 'query': '今天广州天气?', 'url': 'https://www.baidu.com/s?wd=今天广州天气?', 'query_info': '广州今天天气为大雨,东北风1级,气温在27~35°C之间,紫外线指数为优。体感温度为35°C,湿度为72.0%,降水量为0.0毫米。注意防晒,穿短袖类衣物。日出时间为05:51,日落时间为19:15。整体来说,天气较为闷热,不适合洗车。' }
说明:
调用 invoke
的时候,inputs
中的
url
参数是必须的,这个参数会被
LLMRequestsChain
用来请求互联网上的信息。
template
中的 requests_result
是
LLMRequestsChain
处理后的结果,它底层会将这个结果作为参数传递给
llm_chain
。
也就是说,最终我们给 llm_chain
的输入包含了我们的问题,以及从互联网获取到的信息。
使用 Serper API
因为从互联网搜索信息的场景非常常见,因此也有人为我们准备了一些
API,让我们可以直接调用。
比如,我们可以使用 Serper API 来获取搜索结果:
1 2 3 4 5 6 7 8 9 10 11 import osos.environ['SERPER_API_KEY' ] = 'your key' from langchain_community.utilities import GoogleSerperAPIWrapperdef query_web (question ): search = GoogleSerperAPIWrapper() return search.run(question) print (query_web("今天广州天气?" ))
输出:
这里的 GoogleSerperAPIWrapper
是一个封装了 Serper API
的类,它可以直接调用 Serper API 来获取搜索结果。
相比我们自己使用 LLMRequestsChain
来获取信息,使用
Serper API 可以更加方便,因为它已经为我们封装好了。
总结
通过这篇文章,我们知道了,我们可以通过搜索引擎来获取信息,然后将这些信息提供给
LLM,让它帮我们提炼出我们想要的信息。
我们有两种方法可以从互联网获取信息:
使用
LLMRequestsChain
,这个类可以帮我们从互联网上获取信息,然后提供给
LLM。
使用 Serper API,这个 API 可以直接调用,获取搜索结果。