使用langchain中的LLM模型​​​​​​​

简介

构建在大语言模型基础上的应用通常有两种,第一种叫做text completion,也就是一问一答的模式,输入是text,输出也是text。这种模型下应用并不会记忆之前的问题内容,每一个问题都是最新的。通常用来做知识库。

还有一种是类似聊天机器人这种会话模式,也叫Chat models。这种模式下输入是一个Chat Messages的列表。从而可以保存上下文信息,让模型的回复更加真实。

实际上Chat models的底层还是LLMs,只不过在调用方式上有些变化。

简单使用LLMs

什么是LLMs呢?LLMs是Large Language Models的简称,也就是我们常说的大语言模型。

对于langchain来说,它本身并不提供大语言模型,它只是一个中间的粘合层,提供了统一的接口,方便我们对接底层的各种LLMs模型。

langchain除了可以对接OpenAI之外,还可以对接Cohere, Hugging Face等其他的大语言模型。

比如下面是openAI的使用:

from langchain.llms import OpenAI

llm = OpenAI(openai_api_key="...")

接下来就可以调用llm的方法来进行text completion了。

一般来说有两种方式。第一种方式就是直接输出:

llm("给我写首诗")

还有一种方式调用他的generate方法:

llm_result = llm.generate(["给我唱首歌", "给我写首诗"])

这种方式可以传入一个数组,用来生成比较复杂的结果。

langchain支持的LLM

现在大语言模型可谓是蓬勃发展,一不留神就可能出一个新的大语言模型。

就目前而言,基本的国外主流模型langchain都是支持的。

比如:openai,azure openai,AmazonAPI,Hugging Face Hub等等。数目繁多,功能齐全,你想要的他全都有,你没想到的他也有。

那么有小伙伴可能要问题了,langchain支不支持国产的大语言模型呢?

答案是肯定的,但并不是直接的。

如果你发现langchain并没有你想要的llm,那么你可以尝试进行自定义。

langchain为我们提供了一个类叫做LLM,我们只需要继承这个LLM即可:

class LLM(BaseLLM):

    @abstractmethod
    def _call(
        self,
        prompt: str,
        stop: Optional[List[str]] = None,
        run_manager: Optional[CallbackManagerForLLMRun] = None,
    ) -> str:
        """Run the LLM on the given prompt and input."""

其中,唯一一个必须要实现的方法就是_call,这个方法传入一个字符串和一些可选的stop word,然后返回LLM的输出即可。

另外还可以实现一个_identifying_params方法,用来输出自定义LLM的一些参数信息。

大家可以自行尝试和接入不同的LLM模型。

一些特殊的LLM

很多时候调用LLM是需要收费的,如果我们在开发的过程中也要不断的消耗token肯定是得不偿失。

所以langchain为了给我们省钱,提供了一个FakeLLM来使用。

顾名思义,FakeLLM就是可以手动来mock一些LLM的回答,方便测试。

from langchain.llms.fake import FakeListLLM

responses = ["窗前明月光\n低头鞋两双"]
llm = FakeListLLM(responses=responses)

print(llm("给我写首诗"))

上面的输出结果如下:

窗前明月光
低头鞋两双

langchain中还有一个和FakeLLM类似的叫做HumanInputLLM。

这个LLM可以打印出给用户的prompt,并且将用户的输入作为输出返回给用户,大家可以自行体验。

LLM的高级用法

除了正常的LLM调用之外,langchain还提供了一些LLM的高级用法。

异步调用

比如异步调用LLM。当然目前只支持OpenAI, PromptLayerOpenAI, ChatOpenAI 和 Anthropic这几个LLM。其他的对LLM的支持貌似正在开发中。

异步方法也很简单,主要是调用llm的agenerate方法,比如下面这样:

async def async_generate(llm):
    resp = await llm.agenerate(["Hello, how are you?"])
    print(resp.generations[0][0].text)

缓存功能

另外,对于一些重复的请求来说,langchain还提供了缓存功能,这样可以重复的请求就不需要再发送到LLM去了,给我们节约了时间和金钱,非常好用。

langchain提供的cache也有很多种,比如InMemoryCache,FullLLMCache,SQLAlchemyCache,SQLiteCache和RedisCache等等。

我们以InMemoryCache为例,看看是怎么使用的:

from langchain.cache import InMemoryCache
langchain.llm_cache = InMemoryCache()

# 第一次没有使用缓存
llm.predict("Tell me a joke")
# 第二次使用了缓存
llm.predict("Tell me a joke")

使用起来很简单,只需要添加一行llm_cache即可。

如果你使用其他的cache,除了构造函数不同之外,其他的都是类似的。

保存LLM配置

有时候我们配置好了LLM之外,还可以把LLM相关的参数以文本的形式存储起来。

保存llm到文件:

llm.save("llm.json")

加载llm:

llm = load_llm("llm.json")

流式处理

LLM的速度是一个硬伤,由于返回整个响应的速度太慢了,所以推出了流式响应。只要有response返回,就传输给用户。并不需要等待所有内容都获得之后再处理。这样对用户的体验是最好的。

目前langchain只支持OpenAI,ChatOpenAI和ChatAnthropic。

要实现这个流式处理, langchain提供了BaseCallbackHandler,我们只需要继承这个类,实现on_llm_new_token这个方法即可。

当然langchain已经给我们提供了一个实现好的类叫做:StreamingStdOutCallbackHandler。下面是他的实现:

    def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
        sys.stdout.write(token)
        sys.stdout.flush()

使用的时候,只需要在构建llm的是传入对应的callback即可:

from langchain.llms import OpenAI
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler


llm = OpenAI(streaming=True, callbacks=[StreamingStdOutCallbackHandler()], temperature=0)
resp = llm("给我写首诗")

统计token数目

这个统计token使用数目的功能目前只能在openai使用。

from langchain.llms import OpenAI
from langchain.callbacks import get_openai_callback

llm = OpenAI(model_name="text-davinci-002", n=2, best_of=2)

with get_openai_callback() as cb:
    result = llm("T给我写首诗")
    print(cb)

总结

LLM是大语言模型最基础的模式,chat模式的底层就是基于LLM实现。

<think>好的,用户想了解LangChain的BaseTool的用法和实现细节。首先,我需要回顾一下LangChain框架的基本概念,确保自己理解正确。LangChain是一个用于构建基于语言模型的应用程序的框架,它提供了各种工具和组件来简化开发过程。BaseTool应该是其中一个基础类,用于创建自定义工具。 接下来,我需要确认BaseTool的具体作用。根据以往的知识,BaseTool可能是一个抽象基类,用户可以通过继承它来定义自己的工具,比如搜索、计算或其他功能。需要检查BaseTool的属性和方法,比如是否必须实现`_run`方法,是否有异步支持,参数如何处理等。 然后,关于使用示例,用户可能需要一个具体的代码示例来说明如何创建和注册工具。比如,创建一个天气查询工具,可能需要定义输入参数,调用外部API,并返回结果。同时,需要说明如何将工具添加到Agent中,以便在链中使用。 实现细节方面,可能需要解释BaseTool的源码结构,比如它如何集成到LangChain的组件中,如何处理输入验证,错误处理,以及如何与AgentExecutor配合。此外,可能需要提到配置选项,比如是否返回中间步骤,是否并行处理等。 用户可能还会关心如何扩展BaseTool,比如添加自定义参数或覆盖现有方法。需要确保覆盖这些方面,并提供最佳实践,比如输入验证、错误处理和工具描述的清晰性。 最后,生成相关问题时,需要考虑用户可能进一步询问的内容,比如异步支持、参数验证、性能优化、工具组合使用等。这些问题应该有助于用户更深入地理解和应用BaseTool。</think>### LangChain BaseTool 使用与实现详解 #### 一、BaseTool 核心功能 LangChain的`BaseTool`是创建自定义工具的基础类,开发者通过继承该类可实现: 1. 定义工具名称和描述(用于Agent自动识别) 2. 参数格式验证(支持JSON Schema) 3. 同步/异步执行逻辑 4. 错误处理机制 #### 二、基础使用示例 ```python from langchain.tools import BaseTool from pydantic import BaseModel, Field class WeatherInput(BaseModel): location: str = Field(..., description="城市名称,如'北京'") class WeatherTool(BaseTool): name = "weather_query" description = "查询城市天气信息" args_schema = WeatherInput def _run(self, location: str): # 调用天气API的实现 return f"{location}当前气温25℃,晴" async def _arun(self): raise NotImplementedError("异步支持需单独实现") ``` #### 三、实现关键点 1. **参数验证**:通过`args_schema`定义输入参数结构,系统会自动验证输入格式[^1] 2. **方法重载**: - `_run()`:同步执行核心逻辑 - `_arun()`:异步实现(需配合AsyncAgent使用) 3. **错误处理**:建议在工具内部捕获异常并返回标准化错误信息 #### 四、工具注册与调用 ```python from langchain.agents import initialize_agent tools = [WeatherTool()] agent = initialize_agent(tools, llm, agent="zero-shot-react-description") result = agent.run("上海今天天气如何?") # 自动调用weather_query工具 ``` #### 五、高级配置项 1. `return_direct`: 是否直接返回工具结果(跳过Agent处理) 2. `handle_tool_error`: 自定义错误处理函数 3. `verbose`: 输出详细执行日志 #### 六、最佳实践建议 1. 工具描述应清晰准确(影响Agent选择逻辑) 2. 复杂工具建议实现异步版本 3. 输入参数建议添加示例说明 4. 工具执行时间应控制在30秒内(避免超时)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值