LangChain与Ollama携手:揭秘函数调用如何获取天气信息?

时间:2025-03-15 00:35 分类:AI人工智能

引言

在人工智能与自然语言处理的浪潮中,大语言模型如同一位无所不能的智能助手,为我们解决了一个又一个难题。LangChain,作为这一领域的佼佼者,为我们提供了强大的工具来构建基于语言模型的应用。而Ollama,则是一个轻松运行各种语言模型的平台。今天,我们将一起探索如何利用LangChain和Ollama,通过函数调用功能来获取特定城市的天气信息。

环境准备

在开始之前,确保你已经安装了必要的库:

pip install langchain Ollama pydantic

同时,启动Ollama服务并加载deepseek - r1:1.5b模型:

http://localhost:11434

代码实现

3.1 定义函数模型

首先,我们定义一个GetWeather类,继承自pydanticBaseModel,用于描述获取天气信息函数的参数和实现:

from pydantic import BaseModel, Field
import json

class GetWeather(BaseModel):
    city: str = Field(description="城市")

    def run(self):
        weather_info = {"city": self.city, "temperature": "25°C", "condition": "Sunny"}
        return json.dumps(weather_info)

这里的city是函数的参数,代表要查询天气的城市。run方法模拟了获取天气信息的过程,返回一个包含城市、温度和天气状况的JSON字符串。

3.2 封装函数调用类

接下来,我们创建一个LceFunctionCall类,用于封装函数调用的逻辑:

from langchain.chat_models import ChatOllama
from langchain.utils.openai_functions import convert_pydantic_to_openai_function
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

class LceFunctionCall(object):
    def __init__(self, model, base_url):
        self.__chat = ChatOllama(model=model, base_url=base_url, streaming=True)

    def invoke(self, city):
        prompt = ChatPromptTemplate.from_messages([
            SystemMessage(content="你是一个聪明的助手,能根据用户需求调用合适的函数"),
            HumanMessage(content="请调用 GetWeather 函数来获取{city}的天气信息")
        ])
        function_schema = convert_pydantic_to_openai_function(GetWeather)

        chain = (
            {"city": RunnablePassthrough()}
            | prompt
            | add_functions_to_model
            | StrOutputParser()
        )

        for chunk in chain.stream({"city": city}):
            if chunk:
                full_response = ""
                full_response += chunk
                print(chunk, end="", flush=True)

                try:
                    function_call = json.loads(full_response)
                    if "name" in function_call and function_call["name"] == "GetWeather":
                        params = function_call["parameters"]
                        weather = GetWeather(**params).run()
                        print(f"\n天气信息: {weather}")
                        full_response = ""
                except json.JSONDecodeError:
                    continue
3.3 主程序调用

最后,在主程序中创建LceFunctionCall类的实例,并调用invoke方法获取深圳的天气信息:

if __name__ == "__main__":
    lcel = LceFunctionCall(model="deepseek-r1:1.5b", base_url="http://localhost:11434")
    lcel.invoke(city="深圳")

代码解释

4.1 函数调用机制

通过LangChain的convert_pydantic_to_openai_function方法,我们将GetWeather类转换为模型可以理解的函数模式。在调用模型时,将函数模式作为参数传递给模型,模型会根据提示信息判断是否需要调用该函数。

4.2 流式输出处理

使用ChatOllama的流式输出功能,我们可以逐块获取模型的响应,提高用户体验。在处理流式输出时,我们需要将每一块内容拼接成完整的响应,并尝试解析为JSON格式。如果解析成功且包含函数调用信息,则调用相应的函数并输出结果。

注意事项

  • 模型支持:目前deepseek - r1:1.5b模型对函数调用的支持情况可能有限,你可能需要根据实际情况调整模型或提示信息。
  • 错误处理:在实际应用中,需要对函数调用和JSON解析过程中的错误进行更完善的处理,以确保程序的稳定性。

总结

通过本文的介绍,你学会了如何使用LangChain和Ollama实现函数调用,获取特定城市的天气信息。这种方法可以扩展到其他领域,如调用数据库查询、调用API接口等。希望本文能帮助你更好地利用LangChain和Ollama构建强大的语言模型应用。

赶快动手试试吧!

声明:

1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。

2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。

3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。

4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。

本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 0人参与,0条评论
查看更多

Copyright 2005-2024 yuanmayuan.com 源码园 版权所有 备案信息

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告