本文引用自个人AI应用开发学习资料笔记: https://1goto.ai 💯
目前市面上有非常多的AI应用开发的框架,而且随着LLM的发展,各种AI应用开发框架和工具还在爆炸式发展。其中在开源社区里使用比较多的一款框架,就是大名鼎鼎的langchain,它是一个大模型的编排系统,可以很方面的实现基于大模型的应用开发,包括像agent应用、chatbot、个人知识库、多模型专家系统等等,在它的开发框架上,你可以玩转各种大模型API,也可以在本地搭建自己的大模型,然后使用它来实现专有的场景和工作流。💪
然而由于是国外的开源项目,基本上官网的很多例子都是围绕着国外的大模型来进行的,而很多国外大模型对于国内的用户并不友好😂,所以很多小白希望了解如何使用国内的大模型,来实现自己的工作流场景。那么本文就从实操的角度出发,讲解如何使用国内的大模型来开发自己的智能应用,首先介绍阿里的通义千问。
为什么要先介绍通义千问呢?有以下几个原因:
1. 在万模争霸中,通义千问的综合能力排进了全世界前10(opencompass数据)。
2. 而在中文语言领域千问的能力排在第一,在Agent的指令理解上可以排到全世界前5。
3. 千问积极拥抱开源社区,开源工作做的比较好,对于langchain比较友好。
4. 中文支持、大厂的响应速度,之际云原生比较方便。
一、首先需要有千问的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
首先要开通DashScope
去开通
立即开通
获得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来进行了一个简单对话,运行起来应该像这样:
我们可以继续优化,让这个应用稍微复杂点:
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)
这里我们使用了一组提示词模板用来约束大模型的行为,这个模板里,我对大模型进行了设定,让它充当一个英文到中文的翻译,并且让它翻译“我喜欢编程”这句话,运行后应该是这样的结果:
千问模型支持更复杂的工具调用,也就是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函数工具是用来计算数字乘法的。所以当我们运行代码的时候,应该会得到一个调用结果:
我们可以看到运行结果,大模型根据问题,智慧的选择了这个自定义工具,并根据函数设计,将问题中的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函数工具,得到了结果并将其返回:
三、多模态模型使用
千问也推出了他们的多模态版本大模型,即可以对类似图片、音频等进行识别的大模型,而不仅仅是文字,我们以一个最简单的应用来示例,比如我们希望应用可以自动对图片内容进行识别,并将图片内容进行总结归纳告诉我们,假设我们希望识别的图片如下:
这是一张关于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为多模态模型,并对输入指令做了要求,即要求总结该图片,运行后得到结果:
总结
从上面的示例可以看到,将通义千问接入到langchain使用,还是非常简单的,而且整个速度也比较快,如果是生产环境也完全不是问题。如果希望学习更多langchain和Agent开发的知识,可以参考《AI Agent智能应用从0到1定制开发》这门在线课程。下一篇可以详细讲解下类似月之暗面的使用,或者如果你希望学习类似本地化LLM接入langchain的详细方式,也可以在我们的笔记本下方留言告诉我!😀