在上一篇中我们一起研究了LangChain+Deepseek,实现一个小的程序。算是入门了,当时我们用的是本地的Deepseek模型。但是呢如果要问他一些需要联网的内容可能暂时还实现不了,比如:我在天津,今天天气怎么样?这类型问题很明显是实时的,即使你的本地模型很厉害可能也预测不到。那么这篇文章我们就来一起来看看如何让我们的 LLM 实现实时查询我们的天气,让它告诉我们今天天气怎么样。

💡

兔子:哈喽马老师,昨天回去后一直在思考一个问题,比如我第二天要和男朋友逛街,我提前想通过LLM知道第二天天气怎么样?

我:兔子,你还别说,你的这个问题看似很无厘头,但是呢背后涉及到一些更为实用的技术点。

兔子:是什么技术点啊?哈哈?

我:这个涉及到了模型的联网搜索能力,也是一种非常实用的功能。

兔子:那么可以做到吗?

我:那我们一起试试吧,不试试怎么直到呢。

兔子:马老师,快点安排吧,我都迫不及待了~~

我:安排!!!

一、谈谈联网搜索的事儿

我们在生活中想要知道一些实时性的消息一般都是通过百度、或者google等搜索引擎查询然后基本上可以查到我们需要的消息。这些内容非常丰富,导致你不知道自己到底要什么,

马老师在这里举个例子:你想要搜索附近的美食,但是排在前3名的是附近的旅游,你不小心点击进去看到的和你要的结果不一样,这样你是不是怀疑,自己搜索的对不对?并且目前的一些大数据推荐算法很多都是通过你的习惯和内网访问记录给你做一些推荐。经常会牛头不对马尾。让你看到一些不想看到的内容

以上这是经常会遇到的,你们也有体会吧,哈哈。那么我们再看下面的例子。

很多时候在工作中,你遇到一个问题搜百度搜了一上午得不到你想要的答案,但是呢?你的同事过来一下子就搜索出来了,而且还是很准确。咦?还真是这么回事。

💡

兔子:马老师你说的太对了,兔子经常搜索不出来,但是别的同学就很快搜索出来想要的内容了,为啥?

我:这个呢主要事关键词,你的关键词可能出现问题了。

说到关键词呢,可能有一些做过SEO的同学比较了解,想要让你的内容排到搜索引擎前面,关键词是很重要的。你设置好关键词,那么这个关键词如果是经常使用的,那么就容易被搜索的用户搜索到。如果设置一些不常用的关键词那么会导致很多人搜半天都搜索不到。

比如:你要优化一个天津的网络外包公司的官网想让更多人搜索到他,那么你的关键词大概是:“天津网站开发、天津网络建设、做网站、天津最便宜的网站制作公司、等等”。为啥要设置成这些呢?因为这些词是大家常用的,你如果设置这些那么就容易被搜索到。这是一个容易被搜索到的例子,其中:设置哪些关键词就是属于关键词挖掘,谁挖掘的好谁的优化效果可能就更好。

比如:你要搜索关于马老师的文章,你如果搜索java马老师可能不太能搜索到,因为java马老师太多了,但是你要搜索“斜杠青年马老师”可能就可以搜索到。这类型属于精确搜索。由于精确搜索的存在,所以就出现了上面的一幕。你搜索半天搜索不出来,别人一搜索就出来了,这个基本上就是精确搜索。也就是提供更加具体的内容进行搜索。

image-20250614232210474

好上面说了那么多了,想必同学们也了解了关于搜索的一些事儿了。那么接下来马老师和大家一起来研究下如何借助我们的模型实现联网搜索。

二、LLM+联网搜素流程

首先马老师要和大家说一个事实,就是我们现在用的模型都不具备联网能力。为啥呢?我们可以这么想想:比如LLM就是人类的大脑(当然大模型底层其实和人的大脑没有太大的关系,所谓的神经网络也并不是网上很多人吹嘘的他建立在人的神经网络),那么你的大脑肯定只能保存你之前学习到的一些内容,并不知道未来的天气,因为这是不可以学习的。但是呢这个人如果是在编程技术行业从业了好多年的话,你问他java发送邮件的代码是什么,他想一下应该就给你写出来了,为啥呢?因为这个不是实时的,这是属于知识存储。也就是说你本身具备这些知识,知识给按照问题组合一起。

那么我们接下来看一个流程图,这是马老师给大家精心准备的。

image-20250614235225085

通过以上的流程图我们可以看到首先用户输入进来后,我们要先确定一下是否需要联网,需要的话就继续不需要的话就调用本地模型回答后就结束了。细心的同学看到了我们是通过一个叫做 “Agent” 来进行判断的。

什么是 Agent 呢,这篇文章我们先不多说,我们目前的主要目标是把联网搜索的底层给展开。

好的,上面我们说了一堆了,那么我们来看看具体代码我们怎么来实现。

三、天气查询小程序

1)API接口的调用

💡

兔子:接口是什么呢?它和面向对象中提到的接口一样吗?

我:兔子怎么说呢?有相似之处,形式比较类似:输入了数据都会进行输出,哈哈,听起来很无厘头。

兔子:确实是啊,什么输入输出?

我:接下来我们一起看看

这里所说到的接口,马老师主要是指 API接口,这个API接口呢说的很简单一点就是浏览器可以访问的网址(够直白了把),并且这个网址后面带有一个 “?msg=xxx”,其中 问号 主要是接口和参数的分隔符,msg 呢 是参数的key,xxx 呢 是参数的值。目前就介绍到这里,马老师相信既然你可以刷到这个文章说明对API接口还是有一点了解的。如果不了解可以留言,马老师可以考虑是否找个时间详细出一些API文章。

上面我们大白话的说了什么是API,那么我们怎么做这个API呢?其实这些API目前我们不需要自己做,我们可以找一些第三方的接口,很多时候花点小钱办大事。

在这里我们来看一个叫做 “星图云” 的第三方,这是一个专门做天气的服务商,他们有开发者中心。可以直接通过api接口获取他们的数据。(说明:没有广告嫌疑,只是觉得比较简单哈哈)。https://open.geovisearth.com/ 这是网址,我们可以打开后注册,具体怎么注册我就不说了。而且认证后会有免费额度。

文档地址:https://open.geovisearth.com/collect/weather?docId=230

我们通过api接口文档可以最终拼接一个路径:https://api.open.geovisearth.com/v2/cn/hourly/basic?token=9d0ba8994ec12528dae548d2eee8759d&location=WTX_CH101030100

其中token是密钥,这个打死不要泄露哈哈,另外location是地区编码,官方有提供。

image-20250615075013719

以上是一部分输出截图。

好了我们有了天气接口了,那么接下来就看看如何结合我们的LLM告诉用户天气情况了

2)与LLM结合实现“模型联网”

首先我们可以基于之前的代码做一个调整,为什么呢?是马老师懒得写了吗?哈哈。

2-1、安装requests模块
pip install requests

requests 是python的网络请求依赖,用它可以模拟我们的浏览器的请求,并且获取数据。

2-2、封装天气请求函数
import requests

def get_weather(city_code):
    # 接口URL,替换为你实际使用的天气服务地址
    url = "https://api.open.geovisearth.com/v2/cn/hourly/basic"
    
    # 请求参数,需替换为你自己的和风天气KEY和位置
    params = {
        "location": city_code,  # 例如天津的城市ID,可改为其他城市
        "token": "9d0ba8994ec12528dae548d2eee8759d",  # 替换为你申请的token
    }
    
    # 发起GET请求
    response = requests.get(url, params=params)
    
    # 响应状态
    data = response.json()  # 将返回结果转为JSON
    print("天气预报数据:"+str(data))

get_weather("WTX_CH101030100")

我们来看啊,首先我们通过 import requests 这行代码让我们的python支持网络请求。

然后我们通过def关键字定义了一个函数,这个函数有一个参数。

def get_weather(city_code):

在函数体内我们定义了 url 变量用来存储接口地址,并且我们定义了一个字典(也就是json对象) params 用来存储接口参数。

# 接口URL,替换为你实际使用的天气服务地址
url = "https://api.open.geovisearth.com/v2/cn/hourly/basic"

# 请求参数,需替换为你自己的和风天气KEY和位置
params = {
    "location": city_code,  # 例如天津的城市ID,可改为其他城市
    "token": "9d0ba8994ec12528dae548d2eee8759d",  # 替换为你申请的token
}

接下来我们使用 requests 的get方法模拟浏览器get请求,并且返回结果,最后我们通过返回结果的json()方法 来转换为json, 当然了我后面又写了一个print() 这个只是为了打印下接口的数据,实际上我们可以return,如:

return "天气预报数据:"+str(data)

好的我们现在已经完成了我们的函数了,那么接下来我们要在创建一个工具,用来判断是否需要联网

2-3、与LLM集成

首先我们先做一个工具来判断是否走联网,最简单的方式就是做一个关键词过滤器。当然了还有其他专门的工具用来判断是否走网络,但是目前我们先不讨论。因为我们这篇文章主要是来学习底层逻辑。等逻辑明白了再用工具也不迟。比如:LLMChain 可以判断但是我们目前不考虑。

好了来我们做一个这样的过滤器吧:

def needs_internet(question) -> bool:
    keywords = ["天气", "今天", "现在", "实时"]
    for keyword in keywords:
        if keyword in question:
            return True
    return False

这个工具是用来匹配用户输入的问题当中是否存在,天气、今天等,实时的一些关键词。

第一行:定义了函数名称,函数中有一个字符串参数,并且声明了返回类型。

第二行:定义了一个list,用来存储关键字匹配我们的字符串。

第三~五行:用来进行循环主要是循环判断我们的字符串中是否存在keyword关键字,也就是list中的某个元素,如果存在那么就是true,如果不存在就是false。

好的那我们知道了true和false了,那么接下来是不是就可以通过它来判断我们是走本地模型,还是走网络接口了?没错,一起来看看:

# 判断是否走网络
def needs_internet(question) -> bool:
    keywords = ["天气", "今天", "现在", "实时"]
    for keyword in keywords:
        if keyword in question:
            return True
    return False


# param_msg = "今天天津的天气怎么样"
param_msg = "python是什么"
# 判断
if needs_internet(param_msg):
    print("需要联网查询天气接口")
else:
    print("需要模型回答")

下面的 if 关键字就是判断到底走网络接口还是模型。如果字符串存在 keywords = [“天气”, “今天”, “现在”, “实时”] 其中的一个那么就会走接口。

3)完整代码

最后我们可以吧接口的数据给模型让他按照我们的要求进行输出。

from langchain_ollama import OllamaLLM
from langchain_core.prompts import PromptTemplate
import requests

# 获取天气接口数据
def get_weather(city_code):
    # 接口URL,替换为你实际使用的天气服务地址
    url = "https://api.open.geovisearth.com/v2/cn/hourly/basic"
    
    # 请求参数,需替换为你自己的和风天气KEY和位置
    params = {
        "location": city_code,  # 例如天津的城市ID,可改为其他城市
        "token": "xxxxxxxxxxxxxxxxxxx",  # 替换为你申请的token
    }
    
    # 发起GET请求
    response = requests.get(url, params=params)
    
    # 响应状态
    data = response.json()  # 将返回结果转为JSON
    # print("天气预报数据:"+str(data))
    return data

# 判断是否走网络
def needs_internet(question) -> bool:
    keywords = ["天气", "今天", "现在", "实时"]
    for keyword in keywords:
        if keyword in question:
            return True
    return False


# param_msg = "今天天津的天气怎么样"
param_msg = "python是什么"
# 判断
if needs_internet(param_msg):
    print("需要联网查询天气接口")
    msg = get_weather("WTX_CH101030100")
    print(msg)
else:
    # 初始化 deepseek 模型
    llm = OllamaLLM(model="deepseek-r1:1.5b")
    
    # 创建提示模板
    prompt = PromptTemplate.from_template("用中文简要回答:{question}")
    
    # 生成问题内容
    full_prompt = prompt.format(question=param_msg)
    
    # 运行模型生成回答
    response = llm.invoke(full_prompt)
    
    print("模型回答:", response)

我们来观察一下以上代码,if判断内这个是走的联网接口,else 里面呢走的是模型。

最后啊,我们可以通过手动处理联网查询得到的天气信息,并且还可以让我们的 LLM 帮我们润色润色。

💡

兔子:马老师我明白怎么回事了,原来关键点在于判断这块呀。

我:是的没错,我们相当于给LLM做了一些逻辑处理。

兔子:说到逻辑处理我想到了,这个和最近很火的 Agent智能体

我:哈哈没错,这其实理论上来说,我们的代码已经是一个简单 Agent 的雏形。(感知 → 判断 → 行动 → 输出结果)

我:但是按照LangChain标准来说他还不具备。因为没有使用 LangChain Agent 模块体系。

兔子:这样啊,明白了,那马老师以后会讲 Agent 吗?

我:当然会了,拭目以待吧!
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐