大家好,本篇内容主要基于LangChain的官方基本教程(https://python.langchain.com/v0.2/docs/tutorials/llm\_chain/),展示了如何使用LangChain,通过OpenRouter调用免费大模型,来让AI完成一个简单的翻译任务。
先放整体代码如下
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="你的api key",
model="qwen/qwen-2-7b-instruct:free",
)
from langchain_core.messages import HumanMessage, SystemMessage
messages = [
SystemMessage(content="Translate the following from English into Chinese"),
HumanMessage(content="hi!"),
]
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
result = model.invoke(messages)
parser.invoke(result)
由于作者真萌新,且非程序员,有些编程术语、表述不够准确的请多见谅,能get到意思就行,欢迎大佬留言指正,帮助进步。
强推 Anaconda
首先,建议使用Anaconda Navigator来配置开发环境。
大白话地说,在编程过程中你会安装很多很多的包、库,各种教程会让你pip install 这个那个,就很容易乱。
而Anaconda Navigator作为一个有图形界面的工具,可以帮助我们学会为不同的项目创建相互隔离的开发环境,同时方便你对特定环境中已安装的包进行管理,最大程度地避免了乱七八糟的版本混乱,导致代码运行失败的问题(血泪教训)。
这是下载地址:
https://www.anaconda.com/download/success
这是基本教程:
https://docs.anaconda.com/navigator/getting-started/
Langchain的环境配置
装好Anaconda Navigator之后,注意严格按照教程,在你选定的开发环境中,通过终端安装LangChain的包。注意这时候就不是pip install了,而需要运行:
conda install langchain -c conda-forge
还需要安装langchain-openai,它是用来调用模型的。
conda install conda-forge::langchain-openai
btw,你可以在这个网站(https://anaconda.org/)中查找任何你想通过conda安装的包的具体指令。
环境配置好了之后,就可以正式进入编(复制)程(粘贴)环节。
该在哪写代码?
开始之前,先强烈建议使用jupyter notebook写代码(因为官方教程就是这么建议的),它可以实现让代码块一块一块地run,这样哪里出问题了一目了然,也非常方便调整代码块的前后顺序。
你可以直接在Anaconda Navigator的Home页找到它。
强推OpenRouter
接下来真正进入编程环节。首先,选定你想用的大模型(LLMs),除了OpenAI的模型外,LangChain目前还能直接支持Anthropic、Google、MistralAI等公司的主流模型。
但我真的非常建议使用OpenRouter来调用模型,一是方便,二是不需要魔法。(https://openrouter.ai/)
OpenRouter可以理解成一个LLMs的超市,它能提供几乎市面上所有LLMs的服务,包括各种免费的开源模型。
以下是在LangChain中通过OpenRouter调用指定模型的代码:
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="你的api key",
model="qwen/qwen-2-7b-instruct:free",
)
上述代码实现了通过OpenRouter来调用通义千问的开源模型的效果,具体model的值可以在OpenRouter上获取,搜free会出来一大堆。
注意,这里教程直接使用的是ChatModels(可以看到引入的模块的名字是ChatOpenAI),也就是说,现在我们要让大模型完成的是“对话”任务。
因为是对话任务,我们需要先开口。
from langchain_core.messages import HumanMessage, SystemMessage
messages = [ SystemMessage(content="Translate the following from English into Chinese"), HumanMessage(content="hi!"), ]
上述代码就是我们对模型说的话:
SystemMessage函数的效果就是提供一个类似于设定的prompt,你可以在这里设定模型的任务、身份、背景等等
HumanMessage函数提供的是我们人类对模型说的话,模型在获得这个信息之后,会根据SystemMessage的设定来采取行动。
这里可以看到,我们在SystemMessage中把任务指定为了“translate”(英翻中)。
model.invoke(messages)
这段代码的意思就是用我们前面选好的模型,通过invoke方法来对我们说的话进行处理。如果把这个处理完的对象print出来,其实是一个AIMessage,里面包含了模型对我们的回复,大概是这样的感觉:
AIMessage(content='你好!', response_metadata={'token_usage': {'completion_tokens': 3, 'prompt_tokens': 20, 'total_tokens': 23}, 'model_name': 'qwen/qwen-2-7b-instruct:free', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-fc5d744c88-966615-4845b-a555c7-425444562c5-0')
可以看出,模型其实已经完成它的翻译任务了,即“你好!”,但为了便于阅读,让对话更像对话 ,我们还需要对模型的回答再做一步处理,剔出我们不需要的信息。
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
result = model.invoke(messages)
parser.invoke(result)
上述代码引用了一个StrOutputParser函数,它可以把AIMessage中我们真正需要的字符信息(你好)提取出来。
至此,一个简单的AI翻译任务就完成了。
但有趣的地方还没有结束。
LangChain为什么叫Chain,就是因为它有一个很有趣的特性:你可以使用管道符|把定义好的各种组件chain起来,然后随便调用。
以上面的代码为例,我们可以做一个模型调用与输出的chain,这样可以固定模型与输出要求方面的设定,只需要关注你要传给模型什么message就行了。
chain = model | parser
chain.invoke(messages)
这样做有什么好处呢,目前我还没有深入研究,但是我理解,比如我们可以针对任务的不同步骤,选择不同,但最适合的model和parser要求,来做很多个chain,由此形成一个多模型参与的workflow,这个思路,貌似也就是目前AI Agents开发方面的基本原理。
