赞
踩
聊天模型是LangChain框架的核心组件之一,专门用于处理聊天消息,即其输入和输出都是聊天消息格式,而不是简单的文本。
在ChatModels中,输入的是一个消息列表,输出的是一个消息。所有消息都包含一个角色(role)和一个内容(content)属性,具体说明如下所示。
(1)角色(Role):角色描述了是谁在发送这条消息,LangChain为不同角色定义了不同的消息类。
(2)内容(Content):内容属性描述了消息的内容,可以是以下几种形式:
(3)额外参数(additional_kwargs):消息还可以有一个额外的参数属性,用于传递有关消息的其他信息。这主要用于特定于提供商的输入参数,而不是通用的。一个常见的额外参数例子是OpenAI的function_call。
在LangChain中,常用的消息类型(Message types)如下所示。
越来越多的聊天模型,比如OpenAI、Gemini等,都提供了函数调用API。函数调用是指使用聊天模型的API来描述函数及其参数,并让模型返回一个JSON对象,其中包含要调用的函数和该函数的输入。这在构建工具使用链和代理以及从模型中获取结构化输出时非常有用。
在LangChain中,提供了一系列实用工具来简化函数调用过程,具体说明如下所示。
假设有一个简单的乘法函数和一个聊天模型(假设为OpenAI的ChatOpenAI模型),下面的例子演示了使用LangChain进行函数调用的过程。
实例3-1:调用OpenAI执行乘法运算(源码路径:codes\3\mo01.py)
实例文件mo01.py的具体实现代码如下所示。
- from langchain_openai import ChatOpenAI
- from langchain_core.utils.function_calling import convert_to_openai_tool
-
- # 定义乘法函数
- def multiply(a: int, b: int) -> int:
- """Multiply two integers together."""
- return a * b
-
- # 创建聊天模型实例
- llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
-
- # 将函数转换为适用于OpenAI的JSON模式
- multiply_tool = convert_to_openai_tool(multiply)
-
- # 将函数绑定到聊天模型上
- llm_with_multiply_tool = llm.bind_tools([multiply_tool], tool_choice="multiply")
-
- # 调用聊天模型并调用绑定的函数
- response = llm_with_multiply_tool.invoke("calculate 5 times 10")
-
- # 打印响应
- print(response)
在上述代码中,首先定义了一个名为multiply的乘法函数,然后创建了一个ChatOpenAI聊天模型实例。接着,使用convert_to_openai_tool函数将乘法函数转换为OpenAI所需的JSON格式。最后,将转换后的函数绑定到聊天模型上,并通过调用聊天模型来触发函数调用。执行后会输出:
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_f3DApOzb60iYjTfOhVFhDRMI', 'function': {'arguments': '{"a":5,"b":10}', 'name': 'Multiply'}, 'type': 'function'}]})
Caching 是一种在计算机科学和软件工程中常用的技术,用于提高系统的性能和效率。在聊天模型(Chat Models)的上下文中,缓存层(caching layer)的作用是存储之前请求和响应的结果,以便在后续的相同请求时可以直接提供结果,而无需再次执行计算或调用外部服务。
在 LangChain 中,缓存层的作用主要有两个方面:
LangChain提供了两种主要的缓存方式,具体说明如下所示。
例如下面是一个使用 LangChain 进行缓存的例子,在这个例子中,将使用内存缓存来存储和检索用户与聊天机器人的交互。
实例3-1:使用缓存存储和检索用户与聊天机器人的交互(源码路径:codes\3\mo02.py)
实例文件mo02.py的具体实现代码如下所示。
- import getpass
- import os
- from langchain_openai import ChatOpenAI
- from langchain.globals import set_llm_cache
-
- # 假设您已经有了 TogetherAI 的 API 密钥
- os.environ["TOGETHER_API_KEY"] = getpass.getpass("请输入您的TogetherAI API密钥: ")
-
- # 初始化与 TogetherAI 的连接,使用 MistralAI 的模型
- llm = ChatOpenAI(
- base_url="https://api.together.xyz/v1",
- api_key=os.environ["TOGETHER_API_KEY"],
- model="mistralai/Mixtral-8x7B-Instruct-v0.1",
- )
-
- # 设置内存缓存
- set_llm_cache(InMemoryCache())
-
- # 定义一个函数,用于处理用户的查询并使用缓存
- def handle_user_query(query):
- # 尝试从缓存中获取响应
- response = llm.cache.get(query)
- if response is not None:
- print(f"从缓存中获取: {response}")
- return response
-
- # 如果缓存中没有,就向模型请求一个新的响应
- response = llm.predict(query)
- # 将新的响应存储到缓存中
- llm.cache.set(query, response)
- print(f"从模型获取: {response}")
- return response
-
- # 模拟用户查询
- user_queries = ["今天天气怎么样?", "今天天气怎么样?", "北京明天会下雨吗?"]
-
- for query in user_queries:
- response = handle_user_query(query)
- print(response)
上述代码的实现流程如下所示:
- 从模型获取: 今天天气很好,适合外出活动。
- 从缓存中获取: 今天天气很好,适合外出活动。
- 从模型获取: 北京明天可能会有小雨,请记得带伞。
在上述模拟输出中,用户首先询问了关于今天的天气情况,由于这是第一次查询,缓存中没有结果,所以调用了模型并得到了响应,同时将结果存储到了缓存中。接着,用户再次询问相同的问题。这次,因为已经将结果存储在了缓存中,所以直接从缓存中获取了响应,而没有再次调用模型。最后,用户提出了一个新的问题关于北京明天的天气情况。这个问题之前没有被问过,所以需要再次调用模型来获取新的响应,并将这个新的响应存储到缓存中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。