继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【AI应用开发手记1】阿里通义千问如何接入langchain

2024-08-09 18:55:331437浏览

tomiezhang

1实战 · 3手记 · 1推荐
TA的实战

本文引用自个人AI应用开发学习资料笔记: https://1goto.ai  💯

目前市面上有非常多的AI应用开发的框架,而且随着LLM的发展,各种AI应用开发框架和工具还在爆炸式发展。其中在开源社区里使用比较多的一款框架,就是大名鼎鼎的langchain,它是一个大模型的编排系统,可以很方面的实现基于大模型的应用开发,包括像agent应用、chatbot、个人知识库、多模型专家系统等等,在它的开发框架上,你可以玩转各种大模型API,也可以在本地搭建自己的大模型,然后使用它来实现专有的场景和工作流。💪


https://img1.sycdn.imooc.com/66b5e8c80001f8e808570720.jpg


然而由于是国外的开源项目,基本上官网的很多例子都是围绕着国外的大模型来进行的,而很多国外大模型对于国内的用户并不友好😂,所以很多小白希望了解如何使用国内的大模型,来实现自己的工作流场景。那么本文就从实操的角度出发,讲解如何使用国内的大模型来开发自己的智能应用,首先介绍阿里的通义千问。


为什么要先介绍通义千问呢?有以下几个原因:
1. 在万模争霸中,通义千问的综合能力排进了全世界前10(opencompass数据)。

2. 而在中文语言领域千问的能力排在第一,在Agent的指令理解上可以排到全世界前5。

3. 千问积极拥抱开源社区,开源工作做的比较好,对于langchain比较友好。

4. 中文支持、大厂的响应速度,之际云原生比较方便。


https://img1.sycdn.imooc.com/66b5eba700013c3513840724.jpg


一、首先需要有千问的API或部署好的开源千问API


这里我们不涉及大模型部署,很多同学总是希望在自己本地折腾大模型,其实一开始学习AI应用开发,我并不赞同这么做,因为看似你部署在本地不花token的钱,但是对电脑性能要求很高,而且本地部署大模型就够开一门课了,有很多细节要注意,而且并不能满足生产环境,所以我比较倾向于直接使用在线的API,毕竟现在token的成本越来越低了。

千问的API获取,还是比较简单的,可以根据官方指示一步步来:

https://help.aliyun.com/zh/dashscope/developer-reference/acquisition-and-configuration-of-api-key?spm=a2c4g.2399481.0.0

https://img1.sycdn.imooc.com/66b5ed200001d77032760874.jpg


首先要开通DashScope

https://img1.sycdn.imooc.com/66b5ed450001578f27781654.jpg

去开通

https://img1.sycdn.imooc.com/66b5ed5c0001651328781414.jpg

立即开通

https://img1.sycdn.imooc.com/66b5edb5000138ca27781578.jpg

获得API-KEY


整体还是很流畅的,需要注意这里的KEY消耗会从你的阿里云账户里消耗,所以如果要大规模使用,记得要在账户里充点钱!


二、开始使用


保管好你的API-KEY,下面就可以来愉快的使用了!,我们以langchain的python版本为例,首先需要在本地安装相关的依赖包:

# Install the package
%pip install --upgrade --quiet  dashscope

然后需要在本地终端里配置你的API-KEY到DASHSCOPE_API_KEY变量,接下来就可以调用了,下面是一个简单的调用示例:

from getpass import getpass
DASHSCOPE_API_KEY = getpass()
import os
os.environ["DASHSCOPE_API_KEY"] = DASHSCOPE_API_KEY

from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage

chatLLM = ChatTongyi(
    streaming=True,
)
res = chatLLM.stream([HumanMessage(content="hi")], streaming=True)
for r in res:
    print("chat resp:", r)

这里只是简单的调用了模型,并使用message来进行了一个简单对话,运行起来应该像这样:

https://img1.sycdn.imooc.com/66b5ef4c0001781915560359.jpg

我们可以继续优化,让这个应用稍微复杂点:

from getpass import getpass

DASHSCOPE_API_KEY = getpass()
import os

os.environ["DASHSCOPE_API_KEY"] = "sk61"

from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage

chatLLM = ChatTongyi(streaming=True, )

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(
        content=
        "You are a helpful assistant that translates English to Chinese."),
    HumanMessage(
        content=
        "Translate this sentence from English to Chinese. I love programming."
    ),
]
res = chatLLM(messages)
print(res)

这里我们使用了一组提示词模板用来约束大模型的行为,这个模板里,我对大模型进行了设定,让它充当一个英文到中文的翻译,并且让它翻译“我喜欢编程”这句话,运行后应该是这样的结果:

https://img1.sycdn.imooc.com/66b5efda0001ee7215290618.jpg

千问模型支持更复杂的工具调用,也就是openai的function call,可以让大模型在处理问题的时候,借用一些外部工具,从而更好的回答问题:

from getpass import getpass

DASHSCOPE_API_KEY = getpass()
import os

os.environ["DASHSCOPE_API_KEY"] = "sk-"

from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.tools import tool


@tool
def multiply(first_int: int, second_int: int) -> int:
    """Multiply two integers together."""
    return first_int * second_int


llm = ChatTongyi(model="qwen-turbo")

llm_with_tools = llm.bind_tools([multiply])

msg = llm_with_tools.invoke("5乘以32的结果是多少?").tool_calls

print(msg)

在这里,我们定义了一个外部的函数,并将它指定为一个工具,需要注意这个函数的注释不可以删除,它的作用是告诉大模型,这个工具是做什么用的,在上面的例子里,multiply函数工具是用来计算数字乘法的。所以当我们运行代码的时候,应该会得到一个调用结果:

https://img1.sycdn.imooc.com/66b5f0b60001048d15370558.jpg

我们可以看到运行结果,大模型根据问题,智慧的选择了这个自定义工具,并根据函数设计,将问题中的5和32作为参数传入工具运行。


那么langchain中我们可以将工具的运行结果返回给大模型:

from langchain_core.messages import HumanMessage, ToolMessage

messages = [HumanMessage(query)]
ai_msg = llm_with_tools.invoke(messages)
messages.append(ai_msg)
for tool_call in ai_msg.tool_calls:
    selected_tool = {"add": add, "multiply": multiply}[tool_call["name"].lower()]
    tool_output = selected_tool.invoke(tool_call["args"])
    messages.append(ToolMessage(tool_output, tool_call_id=tool_call["id"]))
messages

我们可以看到,在大模型的针对人类的问题“5乘以32的结果是多少?”中,通过调用mutiply函数工具,得到了结果并将其返回:

https://img1.sycdn.imooc.com/66b5f18300010cb013130608.jpg


三、多模态模型使用

千问也推出了他们的多模态版本大模型,即可以对类似图片、音频等进行识别的大模型,而不仅仅是文字,我们以一个最简单的应用来示例,比如我们希望应用可以自动对图片内容进行识别,并将图片内容进行总结归纳告诉我们,假设我们希望识别的图片如下:

https://img1.sycdn.imooc.com/66b5f22b00016e7d19990793.jpg

这是一张关于AI Agent范式的描述图片。利用千问多模态大模型+langchain我们可以很简单的实现该功能:

from langchain_community.chat_models import ChatTongyi
from langchain_core.messages import HumanMessage

chatLLM = ChatTongyi(model_name="qwen-vl-max")
image_message = {
    "image": "https://lilianweng.github.io/posts/2023-06-23-agent/agent-overview.png",
}
text_message = {
    "text": "summarize this picture",
}
message = HumanMessage(content=[text_message, image_message])
chatLLM.invoke([message])

这里我们只是定义了调用的model_name为多模态模型,并对输入指令做了要求,即要求总结该图片,运行后得到结果:

https://img1.sycdn.imooc.com/66b5f2cd0001781915560359.jpg


总结

从上面的示例可以看到,将通义千问接入到langchain使用,还是非常简单的,而且整个速度也比较快,如果是生产环境也完全不是问题。如果希望学习更多langchain和Agent开发的知识,可以参考《AI Agent智能应用从0到1定制开发》这门在线课程。下一篇可以详细讲解下类似月之暗面的使用,或者如果你希望学习类似本地化LLM接入langchain的详细方式,也可以在我们的笔记本下方留言告诉我!😀









打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP