通义千问大语言模型

    ¥ 1,000.00 ¥ 1,000.00 1000.0 CNY

    ¥ 1.00

    此组合不存在。

    添加到购物车



    图文展示仅供参考,最终到货品牌以实际收货品牌为准

    模型介绍

    更新时间:2024-05-10 10:32:22

    通义千问是由阿里云自主研发的大语言模型,用于理解和分析用户输入的自然语言,在不同领域和任务为用户提供服务和帮助。您可以通过提供尽可能清晰详细的指令,来获取符合您预期的结果。

    模型体验

    您可以在模型体验中心试用通义千问模型,具体操作,请参见模型体验中心

    应用场景

    通义千问凭借其强大的语言处理能力,为用户带来高效、智能的语言服务体验,其能力包括但不限于文字创作、翻译服务和对话模拟等,具体应用场景如下:

    • 文字创作:撰写故事、公文、邮件、剧本和诗歌等。

    • 文本处理:润色文本和提取文本摘要等。

    • 编程辅助:编写和优化代码等。

    • 翻译服务:提供各类语言的翻译服务,如英语、日语、法语或西班牙语等。

    • 对话模拟:扮演不同角色进行交互式对话。

    • 数据可视化:图表制作和数据呈现等。

    模型概览

    模型名称

    模型简介

    模型输入/输出限制

    模型名称

    模型简介

    模型输入/输出限制

    qwen-turbo

    通义千问超大规模语言模型,支持中文、英文等不同语言输入。

    模型支持8k tokens上下文,为了保证正常的使用和输出,API限定用户输入为6k tokens

    qwen-plus

    通义千问超大规模语言模型增强版,支持中文、英文等不同语言输入。

    模型支持32k tokens上下文,为了保证正常的使用和输出,API限定用户输入为30k tokens

    qwen-max

    通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入。随着模型的升级,qwen-max将滚动更新升级。如果希望使用固定版本,请使用历史快照版本。当前qwen-max模型与qwen-max-0428快照版本等价,均为最新版本的qwen-max模型,也是当前通义千问2.5产品版本背后的API模型

    模型支持8k tokens上下文,为了保证正常的使用和输出,API限定用户输入为6k tokens

    qwen-max-0428

    通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入。该模型与当前的qwen-max版本对齐,为qwen-max的2024年4月28号的历史快照,预期维护到下个快照版本发布时间(待定)后一个月。

    qwen-max-0403

    通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入。该模型为qwen-max的2024年4月3号的历史快照稳定版本,预期维护到下个快照版本发布时间(待定)后一个月。

    qwen-max-0107

    通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入。该模型为qwen-max的2024年1月7号的历史快照稳定版本,仅推荐特定需求客户访问。

    qwen-max-longcontext

    通义千问千亿级别超大规模语言模型支持中文、英文等不同语言输入。

    模型支持30k tokens上下文,为了保证正常的使用和输出,API限定用户输入为28k tokens

    说明

    不同版本模型的计费规则不同,具体详情,请参见计量计费

    快速开始

    更新时间:2024-05-10 11:28:39

    本文提供简单的示例代码,帮助您快速上手并调用通义千问模型服务。

    前提条件

    • DashScope SDK提供了Python和Java两个版本,请确保您已安装最新版SDK:安装DashScope SDK。您也可以通过HTTP接口调用,详情请见:HTTP调用接口

    示例代码

    您可以通过两种方式来调用模型:通过messages调用或通过prompt调用。如果您有多轮对话的需求,我们更推荐您通过messages调用,多轮对话的调用方式请见:多轮对话

    方式一:通过messages调用(推荐)

    您可以运行以下代码,通过messages方式向通义千问大模型提问。

    Python
    Java
     
    from http import HTTPStatus
    import dashscope
    
    
    def call_with_messages():
        messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
                    {'role': 'user', 'content': '请介绍一下通义千问'}]
    
        response = dashscope.Generation.call(
            dashscope.Generation.Models.qwen_turbo,
            messages=messages,
            result_format='message',  # 将返回结果格式设置为 message
        )
        if response.status_code == HTTPStatus.OK:
            print(response)
        else:
            print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                response.request_id, response.status_code,
                response.code, response.message
            ))
    
    
    if __name__ == '__main__':
        call_with_messages()
    

    调用成功后将输出以下结果。

    Python
    Java
     
    {
        "status_code": 200,
        "request_id": "a75a1b22-e512-957d-891b-37db858ae738",
        "code": "",
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": "通义千问是阿里云自主研发的超大规模语言模型,能够回答问题、创作文字,还能表达观点、撰写代码。作为一个大型预训练语言模型,我能够根据您提出的指令产出相关的回复,并尽可能提供准确和有用的信息。我会不断学习和进步,不断提升自己的能力,为用户提供更好的服务。如果您有任何问题或需要帮助,请随时告诉我。"
                    }
                }
            ]
        },
        "usage": {
            "input_tokens": 25,
            "output_tokens": 77,
            "total_tokens": 102
        }
    }
    说明

    Python和Java在处理错误码code以及错误消息有差异,python直接在结果中展示错误码(code)和消息(message),Java在出错时会抛出异常,在异常中有code和message信息。

    方式二:通过prompt调用

    您可以通过prompt方式来调用通义千问大模型。通过prompt方式调用时,输入与输出的数据格式比messages方式简单,更适合单轮问答等简单场景;在更复杂的场景中推荐您通过messages方式调用。

    Python
    Java
     
    from http import HTTPStatus
    import dashscope
    
    
    def call_with_prompt():
        response = dashscope.Generation.call(
            model=dashscope.Generation.Models.qwen_turbo,
            prompt='请介绍一下通义千问'
        )
        # 如果调用成功,则打印模型的输出
        if response.status_code == HTTPStatus.OK:
            print(response)
        # 如果调用失败,则打印出错误码与失败信息
        else:
            print(response.code)  
            print(response.message) 
    
    if __name__ == '__main__':
        call_with_prompt()
    

    调用成功后将输出以下结果。

    Python
    Java
     
    {
        "status_code": 200,
        "request_id": "b9b5767a-7b94-9df1-93bd-f3cf97e2acaa",
        "code": "",
        "message": "",
        "output": {
            "text": "你好,我是阿里云自主研发的超大规模语言模型“通义千问”。作为一个AI助手,我的目标是帮助用户获得准确、有用的信息,解决他们的问题和困惑。我能够回答各种主题的问题,提供知识性解释,进行创造性的思考,并与用户进行对话。我会不断学习和进步,不断提升自己的能力,为用户提供更好的服务。如果您有任何问题,请随时向我提问。",
            "finish_reason": "stop",
            "choices": null
        },
        "usage": {
            "input_tokens": 25,
            "output_tokens": 84,
            "total_tokens": 109
        }
    }

    相关文档

    更多通义千问模型API的详细调用,请参见API详情

    API详情

    更新时间:2024-05-14 11:11:28

    通义千问模型具有强大的自然语言处理能力,您可以使用DashScope SDK或HTTP接口调用通义千问模型,将通义千问模型集成到您的业务中。

    模型概览

    您可以通过SDK或HTTP调用的通义千问系列模型如下表所示:

    模型名称

    模型简介

    模型输入/输出限制

    qwen-turbo

    通义千问超大规模语言模型,支持中文、英文等不同语言输入。

    模型支持8k tokens上下文,为了保证正常的使用和输出,API限定用户输入为6k tokens

    qwen-plus

    通义千问超大规模语言模型增强版,支持中文、英文等不同语言输入。

    模型支持32k tokens上下文,为了保证正常的使用和输出,API限定用户输入为30k tokens

    qwen-max

    通义千问千亿级别超大规模语言模型支持中文、英文等不同语言输入。随着模型的升级,qwen-max将滚动更新升级,如果希望使用固定版本,请使用下面的历史快照版本。当前qwen-max模型与qwen-max-0428快照版本等价,均为最新版本的qwen-max模型,也是当前通义千问2.5产品版本背后的API模型

    模型支持8k tokens上下文,为了保证正常的使用和输出,API限定用户输入为6k tokens

    qwen-max-0428

    通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入。该模型与当前的qwen-max版本对齐,为qwen-max的2024年4月28号的历史快照,预期维护到下个快照版本发布时间(待定)后一个月。

    qwen-max-0403

    通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入。该模型为qwen-max的2024年4月3号的历史快照固定版本,预期维护到下个快照版本发布时间(待定)后一个月。

    qwen-max-0107

    通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入。该模型为qwen-max的2024年1月7号的历史快照固定版本,仅推荐特定需求客户访问。

    qwen-max-1201

    通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入。

    说明

    该模型为qwen-max的2023年12月1号的历史快照固定版本,该版本的维护时间已经到期,将在4月22日下线,请及时迁移到更新版本模型。(4月8日开始模型限流也会逐步调低直至下线)

    qwen-max-longcontext

    通义千问千亿级别超大规模语言模型支持中文、英文等不同语言输入。

    模型支持30k tokens上下文,为了保证正常的使用和输出,API限定用户输入为28k tokens

    说明

    不同模型的计费规则不一致,您可以按需选择模型。关于token计量与计费规则的详情,请您参考计量计费

    重要

    不同版本的模型每分钟可被调用次数与tokens数不同,在您调用前建议查看基础限流了解您所使用模型的限流条件。

    SDK使用

    您可以通过SDK实现单轮对话、多轮对话、流式输出、function call等多种功能。

    前提条件

    • DashScope SDK提供了Python和Java两个版本,请确保您已安装最新版SDK:安装DashScope SDK

    说明

    当您使用DashScope Java SDK时,为了效率您应该尽可能复用Generation以及其他请求对象,但对象(如Generation)不是线程安全的,您应该采取一定的措施,如及时关闭进程、管理同步机制等,来确保对象安全。

    单轮对话

    您可以将通义千问应用在内容创作、翻译服务、文本摘要等多种场景。您可以运行以下示例代码,体验通义千问模型的单轮对话能力。

    Python
    Java
     
    import random
    from http import HTTPStatus
    from dashscope import Generation  # 建议dashscope SDK 的版本 >= 1.14.0
    
    
    def call_with_messages():
        messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
                    {'role': 'user', 'content': '如何做西红柿炒鸡蛋?'}]
        response = Generation.call(model="qwen-turbo",
                                   messages=messages,
                                   # 设置随机数种子seed,如果没有设置,则随机数种子默认为1234
                                   seed=random.randint(1, 10000),
                                   # 将输出设置为"message"格式
                                   result_format='message')
        if response.status_code == HTTPStatus.OK:
            print(response)
        else:
            print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                response.request_id, response.status_code,
                response.code, response.message
            ))
    
    
    if __name__ == '__main__':
        call_with_messages()
    

    运行结果的示例如下所示:

     
    {
        "status_code": 200,
        "request_id": "5d768057-2820-91ba-8c99-31cd520e7628",
        "code": "",
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": "材料:\n西红柿2个,鸡蛋3个,油适量,盐适量,糖适量,葱花适量。\n\n步骤:\n\n1. 鸡蛋打入碗中,加入少许盐,用筷子搅拌均匀,放置一会儿让蛋白和蛋黄充分融合。\n\n2. 西红柿洗净,切成小块。如果喜欢口感更沙一些,可以切得稍微大一些;如果喜欢口感细腻,可以切得小一些。\n\n3. 热锅凉油,油热后倒入打好的鸡蛋液,用铲子快速搅拌,炒至鸡蛋凝固并变成金黄色,盛出备用。\n\n4. 锅中再加一点油,放入切好的西红柿,用中小火慢慢翻煮,让西红柿出汁,这样炒出来的西红柿才会更甜。\n\n5. 西红柿出汁后,加入适量的糖,继续翻煮,直到西红柿变得软烂。\n\n6. 将炒好的鸡蛋倒回锅中,与西红柿一起翻煮均匀,让鸡蛋充分吸收西红柿的汁水。\n\n7. 最后,根据个人口味加入适量的盐调味,撒上葱花进行提香,翻炒均匀即可出锅。\n\n8. 如果喜欢汤汁多一些,可以适当加点水,调整一下浓稠度。\n\n西红柿炒鸡蛋就做好了,简单易做,营养美味,是一道家常菜的经典之作。"
                    }
                }
            ]
        },
        "usage": {
            "input_tokens": 25,
            "output_tokens": 289,
            "total_tokens": 314
        }
    }

    多轮对话

    相比于单轮对话,多轮对话可以参考历史聊天信息,更符合日常交流的场景。但由于调用时会引入历史聊天信息,使用的token量会增多。您可以运行以下示例代码,体验通义千问模型的多轮对话能力。

    Python
    Java
     
    from http import HTTPStatus
    from dashscope import Generation
    
    
    def multi_round():
        messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
                    {'role': 'user', 'content': '如何做西红柿炖牛腩?'}]
        response = Generation.call(model="qwen-turbo",
                                   messages=messages,
                                   # 将输出设置为"message"格式
                                   result_format='message')
        if response.status_code == HTTPStatus.OK:
            print(response)
            # 将assistant的回复添加到messages列表中
            messages.append({'role': response.output.choices[0]['message']['role'],
                             'content': response.output.choices[0]['message']['content']})
        else:
            print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                response.request_id, response.status_code,
                response.code, response.message
            ))
            # 如果响应失败,将最后一条user message从messages列表里删除,确保user/assistant消息交替出现
            messages = messages[:-1]
        # 将新一轮的user问题添加到messages列表中
        messages.append({'role': 'user', 'content': '不放糖可以吗?'})
        # 进行第二轮模型的响应
        response = Generation.call(model="qwen-turbo",
                                   messages=messages,
                                   result_format='message',  # 将输出设置为"message"格式
                                   )
        if response.status_code == HTTPStatus.OK:
            print(response)
        else:
            print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                response.request_id, response.status_code,
                response.code, response.message
            ))
    
    
    if __name__ == '__main__':
        multi_round()
    

    运行结果的示例如下所示:

     
    {
        "status_code": 200,
        "request_id": "10b7f68b-f4a3-9798-8f1b-c2177eadf4b2",
        "code": "",
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": "材料:\n牛腩500克,西红柿3个,洋葱1个,大蒜4瓣,生姜2片,八角2颗,香叶2片,干辣椒2个,生抽、老抽、料酒、糖、盐适量,清水适量\n\n步骤:\n\n1. 牛腩切块,用清水浸泡半小时,去除血水和杂质。然后冲洗干净备用。\n\n2. 西红柿洗净,切成滚刀块。洋葱切块,大蒜和生姜切片。\n\n3. 热锅凉油,下入八角、香叶、干辣椒炒出香味。\n\n4. 加入洋葱块,翻炒至微黄。\n\n5. 倒入牛腩块,大火翻炒几分钟,使其表面微焦,这样可以锁住肉的鲜味。\n\n6. 加入大蒜和生姜片,继续翻炒均匀。\n\n7. 倒入料酒,煮一会儿去腥。\n\n8. 加入生抽、老抽上色,再加适量糖,翻炒均匀。\n\n9. 倒入足够的清水,水量要没过牛腩,大火烧开后撇去浮沫。\n\n10. 转小火,加入西红柿块,盖上锅盖慢慢炖煮,期间可适当调整火力,保持汤汁微微沸腾。\n\n11. 炖煮约1-1.5小时,直到牛腩变得软烂,汤汁浓稠。\n\n12. 最后根据个人口味加盐调味,收汁即可。\n\n13. 出锅前可撒些葱花或者香菜提香。\n\n这道西红柿炖牛腩就做好了,香气四溢,肉质酥烂,非常美味。"
                    }
                }
            ]
        },
        "usage": {
            "input_tokens": 26,
            "output_tokens": 361,
            "total_tokens": 387
        }
    }
    {
        "status_code": 200,
        "request_id": "a00b67bd-f477-93ea-a648-862179d7d1fe",
        "code": "",
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": "当然可以,糖主要是为了中和牛肉的腥味并增加一些甜味。如果你不喜欢或不添加糖,也可以,只是口感可能会稍微偏重于牛肉本身的原味,而且可能没有那么甜润。你可以根据自己的口味来调整,如果牛腩本身比较嫩,或者你喜欢酸甜口,可以少放或者不放糖,如果牛腩较老,可能会需要一些糖来提升风味。"
                    }
                }
            ]
        },
        "usage": {
            "input_tokens": 403,
            "output_tokens": 88,
            "total_tokens": 491
        }
    }

    您也可以运行以下代码,体验实时交互的功能。

    Python
    Java
     
    from dashscope import Generation
    
    def get_response(messages):
        response = Generation.call(model="qwen-turbo",
                                   messages=messages,
                                   # 将输出设置为"message"格式
                                   result_format='message')
        return response
    
    
    messages = [{'role': 'system', 'content': 'You are a helpful assistant.'}]
    
    # 您可以自定义设置对话轮数,当前为3
    for i in range(3):
        user_input = input("请输入:")
        messages.append({'role': 'user', 'content': user_input})
        assistant_output = get_response(messages).output.choices[0]['message']['content']
        messages.append({'role': 'assistant', 'content': assistant_output})
        print(f'用户输入:{user_input}')
        print(f'模型输出:{assistant_output}')
        print('\n')
    

    在您输入问题后,点击Enter键令模型生成回复。使用过程示例如下图所示:

    2024-04-08_18-58-36 (1).gif

    流式输出

    大模型并不是一次性生成最终结果,而是逐步地生成中间结果,最终结果由中间结果拼接而成。非流式输出方式等待模型生成结束后再将生成的中间结果拼接后返回,而流式输出可以实时地将中间结果返回,您可以在模型进行输出的同时进行阅读,减少等待模型回复的时间。使用流式输出需要您进行一些配置,DashScope Python SDK中需要设置stream为True,DashScope Java SDK中需要使用streamCall接口调用。

    Python
    Java
     
    from http import HTTPStatus
    from dashscope import Generation
    
    
    def call_with_stream():
        messages = [
            {'role': 'user', 'content': '如何做西红柿炖牛腩?'}]
        responses = Generation.call(model="qwen-turbo",
                                    messages=messages,
                                    result_format='message',  # 设置输出为'message'格式
                                    stream=True,  # 设置输出方式为流式输出
                                    incremental_output=True  # 增量式流式输出
                                    )
        for response in responses:
            if response.status_code == HTTPStatus.OK:
                print(response.output.choices[0]['message']['content'], end='')
            else:
                print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                    response.request_id, response.status_code,
                    response.code, response.message
                ))
    
    
    if __name__ == '__main__':
        call_with_stream()
    

    流式输出效果如下图所示:2024-04-08_19-12-00 (1).gif

    Asyncio接口

    如果您使用Dashscope Python SDK,可以使用asyncio调用实现并发,提高程序的效率。示例代码如下:

    说明

    您的Dashscope Python SDK版本需要不低于 1.19.0。

    Python
     
    import asyncio
    from http import HTTPStatus
    import platform
    
    from dashscope import Generation
    from dashscope.aigc.generation import AioGeneration
    
    
    async def async_dashscope_sample():
        response = await AioGeneration.call("qwen-turbo",
                                            prompt='今天天气好吗?')
    
        if response.status_code == HTTPStatus.OK:
            print('Result is: %s' % response.output)
        else:
            print('Failed request_id: %s, status_code: %s, code: %s, message:%s' %
                  (response.request_id, response.status_code, response.code,
                   response.message))
    
    
    async def async_dashscope_stream_sample():
        responses = await AioGeneration.call(model="qwen-turbo",
                                             prompt='今天天气好吗?',
                                             stream=True)
        # responses is async iterator, must iterator with async for.
        async for response in responses:
            print(response)
    
    
    async def main():
        response = await async_dashscope_sample()
        print(response)
        await async_dashscope_stream_sample()
    if __name__ == '__main__':
        # for windows raise RuntimeError: Event loop is closed
        if platform.system() == 'Windows':
            asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        asyncio.run(main(), debug=False)
    

    Function call

    大模型在面对实时性问题、私域知识型问题或数学计算等问题时可能效果不佳。您可以使用function call功能,通过调用外部工具来提升模型的输出效果。您可以在调用大模型时,通过tools参数传入工具的名称、描述、入参等信息。大模型在收到提示词以及工具信息后,会判断是否需要使用工具:

    • 如果不需要使用工具,大模型不会返回tool_calls参数,您的程序可以直接返回大模型的回答。

    • 如果需要使用工具,大模型会返回一个包含tool_calls字段的信息,您的程序可以根据此信息判断需要调用工具。您的程序需要解析tool_calls信息中包含的工具函数名和入参,并将入参输入到工具函数来得到工具调用的结果。您的程序需要将工具信息按照以下格式配置:

       
      {
          "name": "$工具名",
          "role": "tool",
          "content": "$工具输出"
      }

      将工具信息添加到历史对话信息中,再次向大模型提问,获得最终回答。

    Function call的工作流程示意图如下所示:

    image
    说明

    Function call信息暂时不支持增量输出,增量输出请参考输入参数配置中incremental_output参数。

    Function call的使用涉及到参数解析功能,因此对大模型的响应质量要求较高,推荐您优先使用qwen-max模型。示例代码如下所示:

    Python
    Java
     
    from dashscope import Generation
    from datetime import datetime
    import random
    import json
    
    
    # 定义工具列表,模型在选择使用哪个工具时会参考工具的name和description
    tools = [
        # 工具1 获取当前时刻的时间
        {
            "type": "function",
            "function": {
                "name": "get_current_time",
                "description": "当你想知道现在的时间时非常有用。",
                "parameters": {}  # 因为获取当前时间无需输入参数,因此parameters为空字典
            }
        },  
        # 工具2 获取指定城市的天气
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "当你想查询指定城市的天气时非常有用。",
                "parameters": {  # 查询天气时需要提供位置,因此参数设置为location
                            "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "城市或县区,比如北京市、杭州市、余杭区等。"
                        }
                    }
                },
                "required": [
                    "location"
                ]
            }
        }
    ]
    
    # 模拟天气查询工具。返回结果示例:“北京今天是晴天。”
    def get_current_weather(location):
        return f"{location}今天是晴天。 "
    
    # 查询当前时间的工具。返回结果示例:“当前时间:2024-04-15 17:15:18。“
    def get_current_time():
        # 获取当前日期和时间
        current_datetime = datetime.now()
        # 格式化当前日期和时间
        formatted_time = current_datetime.strftime('%Y-%m-%d %H:%M:%S')
        # 返回格式化后的当前时间
        return f"当前时间:{formatted_time}。"
    
    # 封装模型响应函数
    def get_response(messages):
        response = Generation.call(
            model='qwen-max',
            messages=messages,
            tools=tools,
            seed=random.randint(1, 10000),  # 设置随机数种子seed,如果没有设置,则随机数种子默认为1234
            result_format='message'  # 将输出设置为message形式
        )
        return response
    
    def call_with_messages():
        print('\n')
        messages = [
                {
                    "content": input('请输入:'),  # 提问示例:"现在几点了?" "一个小时后几点" "北京天气如何?"
                    "role": "user"
                }
        ]
        
        # 模型的第一轮调用
        first_response = get_response(messages)
        assistant_output = first_response.output.choices[0].message
        print(f"\n大模型第一轮输出信息:{first_response}\n")
        messages.append(assistant_output)
        if 'tool_calls' not in assistant_output:  # 如果模型判断无需调用工具,则将assistant的回复直接打印出来,无需进行模型的第二轮调用
            print(f"最终答案:{assistant_output.content}")
            return
        # 如果模型选择的工具是get_current_weather
        elif assistant_output.tool_calls[0]['function']['name'] == 'get_current_weather':
            tool_info = {"name": "get_current_weather", "role":"tool"}
            location = json.loads(assistant_output.tool_calls[0]['function']['arguments'])['properties']['location']
            tool_info['content'] = get_current_weather(location)
        # 如果模型选择的工具是get_current_time
        elif assistant_output.tool_calls[0]['function']['name'] == 'get_current_time':
            tool_info = {"name": "get_current_time", "role":"tool"}
            tool_info['content'] = get_current_time()
        print(f"工具输出信息:{tool_info['content']}\n")
        messages.append(tool_info)
    
        # 模型的第二轮调用,对工具的输出进行总结
        second_response = get_response(messages)
        print(f"大模型第二轮输出信息:{second_response}\n")
        print(f"最终答案:{second_response.output.choices[0].message['content']}")
    
    if __name__ == '__main__':
        call_with_messages()
        

    通过运行以上代码,您可以输入问题,得到在工具辅助条件下模型的输出结果。使用过程示例如下图所示:2024-04-29_11-22-10 (1).gif

    以下是发起function call流程(模型的第一轮调用)时模型的返回信息。当输入“杭州天气”时,模型会返回tool_calls参数;当输入“你好”时,模型判断无需调用工具,模型不会返回tool_calls参数。

    输入:杭州天气
    输入:你好
     
    {
        "status_code": 200,
        "request_id": "bd803417-56a7-9597-9d3f-a998a35b0477",
        "code": "",
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": [
                {
                    "finish_reason": "tool_calls",
                    "message": {
                        "role": "assistant",
                        "content": "",
                        "tool_calls": [
                            {
                                "function": {
                                    "name": "get_current_weather",
                                    "arguments": "{\"properties\": {\"location\": \"杭州市\"}, \"type\": \"object\"}"
                                },
                                "id": "",
                                "type": "function"
                            }
                        ]
                    }
                }
            ]
        },
        "usage": {
            "input_tokens": 222,
            "output_tokens": 27,
            "total_tokens": 249
        }
    }

    您可以根据您的需求,参照代码中tools的定义来扩充您的工具库。

    输入参数配置

    模型的生成结果由输入参数的配置决定,如用户指令、模型名称、是否流式输出、温度参数等。您可以查看下表来了解响应函数输入参数的配置方式。

    数据类型列中各字段的含义如下所示:

    • string表示字符串类型;

    • array在Python中表示列表,在Java中表示ArrayList;

    • integer表示整数型;

    • float表示浮点型;

    • boolean表示布尔型;

    • object表示哈希表。

    参数

    数据类型

    默认值

    说明

    model(必选)

    string

    指定用于对话的通义千问模型名,目前可选择qwen-turboqwen-plusqwen-maxqwen-max-0403qwen-max-0107qwen-max-1201qwen-max-longcontext

    说明

    qwen-max-0403qwen-max-0107qwen-max-1201qwen-max-longcontext在当前SDK版本中未定义,您可以指定model为模型名称字符串进行调用。

    例如:

    Python:model='qwen-max-longcontext'

    Java:.model("qwen-max-0403")

    messages

    array

    • messages:用户与模型的对话历史。array中的每个元素形式为{"role":角色, "content": 内容},角色当前可选值:systemuserassistanttool

      • system:表示系统级消息,用于指导模型按照预设的规范、角色或情境进行回应。是否使用system角色是可选的,如果使用则必须位于messages的最开始部分。

      • userassistant:表示用户和模型的消息。它们应交替出现在对话中,模拟实际对话流程。

      • tool:表示工具的消息。在使用function call功能时,如果要传入工具的结果,需将元素的形式设为{"content":"工具返回的结果", "name":"工具的函数名", "role":"tool"}。其中name是工具函数的名称,需要和上轮response中的tool_calls[i]['function']['name']参数保持一致;content是工具函数的输出。参考代码给出了示例。

    • prompt:用户输入的指令,用于指导模型生成回复。

    说明

    messages和prompt任选一个参数使用即可。由于和prompt组合使用的对话历史参数history即将废弃,仅依赖prompt指令会限制模型进行有记忆的对话能力。

    messages参数允许模型参考历史对话,从而更准确地解析用户的意图,确保对话的流程性和连续性,因此在多轮对话场景下推荐您优先使用messages参数。

    prompt

    string

    无(与messages不可同时为空)

    seed (可选)

    integer

    1234

    生成时使用的随机数种子,用于控制模型生成内容的随机性。seed支持无符号64位整数,默认值为1234。

    max_tokens(可选)

    integer

    1500或2000

    指定模型可生成的最大token个数。

    • qwen-turbo最大值和默认值为1500 tokens。

    • qwen-maxqwen-max-1201qwen-max-longcontextqwen-plus模型,最大值和默认值均为2000 tokens。

    top_p (可选)

    float

    0.8

    生成过程中的核采样方法概率阈值,例如,取值为0.8时,仅保留概率加起来大于等于0.8的最可能token的最小集合作为候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的确定性越高。

    top_k (可选)

    integer

    None

    生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。默认不传递该参数,取值为None或当top_k大于100时,表示不启用top_k策略,此时,仅有top_p策略生效。

    repetition_penalty (可选)

    float

    1.1

    用于控制模型生成时的重复度。提高repetition_penalty时可以降低模型生成的重复度,1.0表示不做惩罚。没有严格的取值范围。

    temperature(可选)

    float

    0.85

    用于控制模型回复的随机性和多样性。具体来说,temperature值控制了生成文本时对每个候选词的概率分布进行平滑的程度。较高的temperature值会降低概率分布的峰值,使得更多的低概率词被选择,生成结果更加多样化;而较低的temperature值则会增强概率分布的峰值,使得高概率词更容易被选择,生成结果更加确定。

    取值范围: [0, 2),不建议取值为0,无意义。

    stop (可选)

    string or array

    None

    stop参数用于实现内容生成过程的精确控制,在模型生成的内容即将包含指定的字符串或token_id时自动停止。stop可以为string类型或array类型。

    • string类型

      当模型将要生成指定的stop词语时停止。

      例如将stop指定为"你好",则模型将要生成“你好”时停止。

    • array类型

      array中的元素可以为token_id或者字符串,或者元素为token_id的array。当模型将要生成的token或其对应的token_id在stop中时,模型生成将会停止。以下为stop为array时的示例(tokenizer对应模型为qwen-turbo):

      1.元素为token_id:

      token_id为108386和104307分别对应token为“你好”和“天气”,设定stop为[108386,104307],则模型将要生成“你好”或者“天气”时停止。

      2.元素为字符串:

      设定stop为["你好","天气"],则模型将要生成“你好”或者“天气”时停止。

      3.元素为array:

      token_id为108386和103924分别对应token为“你好”和“啊”,token_id为35946和101243分别对应token为“我”和“很好”。设定stop为[[108386, 103924],[35946, 101243]],则模型将要生成“你好啊”或者“我很好”时停止。

      说明

      stop为array类型时,不可以将token_id和字符串同时作为元素输入,比如不可以指定stop为["你好",104307]。

    stream (可选)

    boolean

    False

    用于控制是否使用流式输出。当以stream模式输出结果时,接口返回结果为generator,需要通过迭代获取结果,默认每次输出为当前生成的整个序列,最后一次输出为最终全部生成结果,可以通过设置参数incremental_output为False改变输出模式为非增量输出。

    enable_search (可选)

    boolean

    False

    用于控制模型在生成文本时是否使用互联网搜索结果进行参考。取值如下:

    • True:启用互联网搜索,模型会将搜索结果作为文本生成过程中的参考信息,但模型会基于其内部逻辑判断是否使用互联网搜索结果。

    • False(默认):关闭互联网搜索。

    result_format (可选)

    string

    text

    用于指定返回结果的格式,默认为text,也可选择message。当设置为message时,输出格式请参考返回结果。推荐您优先使用message格式。

    incremental_output (可选)

    boolean

    False

    控制在流式输出模式下是否开启增量输出,即后续输出内容是否包含已输出的内容。设置为True时,将开启增量输出模式,后面输出不会包含已经输出的内容,您需要自行拼接整体输出;设置为False则会包含已输出的内容。您可以参考流式输出代码。

    默认False:

    I

    I like

    I like apple

    True:

    I

    like

    apple

    该参数只能在stream为True时使用。

    说明

    incremental_output暂时无法和tools参数同时使用。

    tools

    array

    None

    用于指定可供模型调用的工具库,一次function call流程模型会从中选择其中一个工具。tools中每一个tool的结构如下:

    • type,类型为string,表示tools的类型,当前仅支持function。

    • function,类型为object,键值包括name,description和parameters:

      • name:类型为string,表示工具函数的名称,必须是字母、数字,可以包含下划线和短划线,最大长度为64。

      • description:类型为string,表示工具函数的描述,供模型选择何时以及如何调用工具函数。

      • parameters:类型为object,表示工具的参数描述,需要是一个合法的JSON Schema。JSON Schema的描述可以见链接参考代码中给出了参数描述的示例。如果parameters参数为空,表示function没有入参。

    使用tools时需要同时指定result_format为message。在function call流程中,无论是发起function call的轮次,还是向模型提交工具函数的执行结果,均需设置tools参数。当前支持的模型包括qwen-turbo、qwen-plus、qwen-max和qwen-max-longcontext。

    说明

    tools暂时无法和incremental_output参数同时使用。

    返回结果

    • result_format设置为"message"时的结果示例:

       
      {
          "status_code": 200,
          "request_id": "05dc83af-7185-9e14-9b0b-4466de159d6a",
          "code": "",
          "message": "",
          "output": {
              "text": null,
              "finish_reason": null,
              "choices": [
                  {
                      "finish_reason": "stop",
                      "message": {
                          "role": "assistant",
                          "content": "首先,准备两个鸡蛋,一个西红柿,适量的盐、糖、料酒和生抽。将鸡蛋打入碗中,搅拌均匀,西红柿切块。锅中加油,油热后加入鸡蛋液,炒至金黄色,盛出备用。锅中加油,油热后加入西红柿块,翻炒均匀,加入适量的盐、糖、料酒和生抽,炒至西红柿软烂,加入炒好的鸡蛋,翻炒均匀即可。"
                      }
                  }
              ]
          },
          "usage": {
              "input_tokens": 12,
              "output_tokens": 98,
              "total_tokens": 110
          }
      }
    • 发起function call时的结果示例:

       
      {
          "status_code": 200,
          "request_id": "a2b49cd7-ce21-98ff-87ac-b00cc590dc5e",
          "code": "",
          "message": "",
          "output": {
              "text": null,
              "finish_reason": null,
              "choices": [
                  {
                      "finish_reason": "tool_calls",
                      "message": {
                          "role": "assistant",
                          "content": "",
                          "tool_calls":[
                              {
                                  'function': {
                                      'name': 'get_current_weather',
                                      'arguments': '{"properties": {"location": "北京市"}}'
                                      },
                                  'id': '',
                                  'type': 'function'}]
                      }
                  }
              ]
          },
          "usage": {
              "input_tokens": 12,
              "output_tokens": 98,
              "total_tokens": 110
          }
      }
    • 返回参数说明

      返回参数

      数据类型

      说明

      备注

      status_code

      integer

      200(HTTPStatus.OK)表示请求成功,否则表示请求失败,可以通过code获取错误码,通过message字段获取错误详细信息。

      说明

      只有Python会输出该参数,使用Java调用失败会抛出异常,异常信息为code和message的内容。

      request_id

      string

      系统生成的标志本次调用的id。

      code

      string

      表示错误码,调用成功时为空值。仅适用于Python。

      message

      string

      表示调用失败的详细信息,调用成功时为空值。仅适用于Python。

      output

      object

      表示调用结果信息。

      output.text

      string

      模型生成的回复。

      在使用prompt传入指令时不为空

      output.finish_reason

      string

      有四种情况:

      • 正在生成时为null;

      • 因触发输入参数中的stop条件而结束为stop;

      • 因生成长度过长而结束为length;

      • 因发生工具调用为tool_calls。

      output.choices

      array

      当result_format为message时输出choices。

      当result_format为message时输出choices。

      output.choices[i].finish_reason

      string

      有三种情况:

      • 正在生成时为null;

      • 因触发输入参数中的stop条件而结束为stop;

      • 因生成长度过长而结束为length。

      output.choices[i].message

      object

      模型输出的消息。

      output.choices[i].message.role

      string

      模型的角色,固定为assistant。

      output.choices[i].message.content

      string

      模型生成的文本。

      output.choices[i].message.tool_calls

      object

      如果模型需要调用工具,则会生成tool_calls参数,应用于function call场景。

      包含三个参数:type、function和id。返回结果中给出了function_call的示例。type、function参数详情如下:

      • type,类型为string,当前只能设置为function。

      • function,类型为object,包含name和arguments两个参数:

        • name,类型为string,表示需要调用的工具的名称,如果是function call场景则表示要调用的工具函数名称。

        • arguments,类型为string,表示模型生成的要传入工具的参数。可以通过Python中的json.loads方法解析为字典。

      usage

      object

      计量信息,表示本次请求所消耗的token数据。

      usage.input_tokens

      integer

      用户输入文本转换成token后的长度。

      您可以参考本地tokenizer统计token数据进行token的估计。

      usage.output_tokens

      integer

      模型生成回复转换为token后的长度。

      usage.total_tokens

      integer

      usage.input_tokens与usage.output_tokens的总和

    HTTP调用接口

    您可以通过HTTP调用接口来使用通义千问模型,免去安装DashScope SDK的步骤。您可以通过HTTP调用接口实现单轮对话、多轮对话、流式输出、function call等多种功能。

    前提条件

    • 已开通服务并获得API-KEY:开通DashScope并创建API-KEY

    • 我们推荐您将API-KEY配置到环境变量中以降低API-KEY的泄漏风险,详情可参考通过环境变量配置API-KEY。您也可以在代码中配置API-KEY,但是泄漏风险会提高

    • 如果您使用Windows系统,示例中的Shell脚本可以通过Windows Subsystem for Linux (WSL)或Git Bash等方式运行。

    提交接口调用

     
    POST https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation

    单轮对话

    您可以将通义千问应用在内容创作、翻译服务、文本摘要等多种场景。您可以运行以下示例代码,体验通义千问模型的单轮对话能力。

    Shell
    Python
    Java
     
    read -p "请输入: " user_content
    curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
    --header "Authorization: Bearer $DASHSCOPE_API_KEY" \
    --header 'Content-Type: application/json' \
    --data '{
        "model": "qwen-turbo",
        "input":{
            "messages":[      
                {
                    "role": "system",
                    "content": "You are a helpful assistant."
                },
                {
                    "role": "user",
                    "content": "'"$user_content"'"
                }
            ]
        },
        "parameters": {
            "result_format": "message"
        }
    }'

    输入“介绍一下通义千问”,得到的示例结果如下:

     
    {
        "output": {
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": "通义千问,是阿里云自主研发的超大规模语言模型,能够回答问题、创作文字,还能表达观点、撰写代码。我是阿里云推出的一种超大规模语言模型,我是一个能够回答问题、创作文字,还能表达观点、撰写代码的AI助手。如果您有任何问题或需要帮助,请随时告诉我,我会尽力提供支持。"
                    }
                }
            ]
        },
        "usage": {
            "total_tokens": 97,
            "output_tokens": 73,
            "input_tokens": 24
        },
        "request_id": "0105f672-d7b4-9172-9d03-51c669ec830a"
    }

    多轮对话

    相比于单轮对话,多轮对话可以参考历史聊天信息,更符合日常交流的场景。但由于调用时会引入历史聊天信息,使用的token量会增多。您可以运行以下示例代码,体验通义千问模型的多轮对话能力。如果您使用Java语言,请在pom.xml文件中添加org.json依赖。

    Python
    Java
    Shell
     
    import requests
    import os
    
    api_key = os.getenv("DASHSCOPE_API_KEY")
    url = 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation'
    headers = {'Content-Type': 'application/json',
               'Authorization':f'Bearer {api_key}'}
    
    messages = [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        }
    ]
    
    # 封装模型的响应函数
    def get_response(last_messages):
        body = {
            'model': 'qwen-turbo',
            "input": {
                "messages": last_messages
            },
            "parameters": {
                "result_format": "message"
            }
        }
        response = requests.post(url, headers=headers, json=body)
        return response.json()
    
    # 您可以在此修改对话轮数,当前为3轮对话
    for i in range(3):
        UserInput = input('请输入:')
        messages.append({
            "role": "user",
            "content": UserInput
        })
        response = get_response(messages)
        assistant_output = response['output']['choices'][0]['message']
        print("用户输入:", UserInput)
        print(f"模型输出:{assistant_output['content']}\n")
        messages.append(assistant_output)

    当您运行Python或Java程序时,输入问题后点击Enter键获取模型生成的回复,使用过程示例如下图所示:

    2024-04-08_18-58-36 (1).gif

    流式输出

    大模型并不是一次性生成最终结果,而是逐步地生成中间结果,最终结果由中间结果拼接而成。非流式输出方式等待模型生成结束后再将生成的中间结果拼接后返回,而流式输出可以实时地将中间结果返回,您可以在模型进行输出的同时进行阅读,减少等待模型回复的时间。使用流式输出需要您进行一些配置,在请求头headers中配置"X-DashScope-SSE"为"enable",或配置"Accept"为"text/event-stream",即可得到流式输出的效果。

    Python
    Java
    Shell
     
    import requests
    import os
    import re
    
    url = 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation'
    headers = {'Content-Type': 'application/json',
               'Authorization':'Bearer '+ os.getenv("DASHSCOPE_API_KEY"),
               'X-DashScope-SSE': 'enable'
               }
    
    body = {
        "model": "qwen-turbo",
        "input": {
            "messages": [
                {
                    "role": "system",
                    "content": "You are a helpful assistant."
                },
                {
                    "role": "user",
                    "content": input("请输入:\n")
                }
            ]
        },
        "parameters": {
            "incremental_output":True,
            "result_format": "message"
        }
    }
    
    response = requests.post(url, headers=headers, json=body,stream=True)
    # 使用正则表达式提取模型输出的content
    pattern = re.compile(r'"content":"(.*?)","role"')
    
    http_response = []
    
    print("模型生成回复:")
    for chunk in response.iter_content(chunk_size=None):
        chunk = chunk.decode('utf-8')
        http_response.append(chunk)
        match = pattern.search(chunk)
        if match:
            print(match.group(1),end='',flush=True)
    
    print("\nhttp返回结果:")
    for i in range(len(http_response)):
        print(http_response[i])

    当您运行Python或Java程序时,输入问题后点击Enter键以获取模型生成的流式输出,并打印出HTTP返回的结果,HTTP返回结果示例如下所示。

     
    id:1
    event:result
    :HTTP_STATUS/200
    data:{"output":{"finish_reason":"null","text":"你好"},"usage":{"total_tokens":21,"input_tokens":20,"output_tokens":1},"request_id":"fad8f7ee-5bf5-900f-a482-f8a683f704d6"}
    
    id:2
    event:result
    :HTTP_STATUS/200
    data:{"output":{"finish_reason":"null","text":"!"},"usage":{"total_tokens":22,"input_tokens":20,"output_tokens":2},"request_id":"fad8f7ee-5bf5-900f-a482-f8a683f704d6"}
    
    ... ... ... ...
    ... ... ... ...
    
    id:5
    event:result
    :HTTP_STATUS/200
    data:{"output":{"finish_reason":"stop","text":""},"usage":{"total_tokens":27,"input_tokens":20,"output_tokens":7},"request_id":"fad8f7ee-5bf5-900f-a482-f8a683f704d6"}
    

    Function call

    大模型在面对实时性问题、私域知识型问题或数学计算等问题时可能效果不佳。您可以使用function call功能,通过调用外部工具来提升模型的输出效果。您可以在调用大模型时,通过tools参数传入工具的名称、描述、入参等信息。大模型在收到提示词以及工具信息后,会判断是否需要使用工具:

    • 如果不需要使用工具,大模型不会返回tool_calls参数,您的程序可以直接返回大模型的回答。

    • 如果需要使用工具,大模型会返回一个包含tool_calls字段的信息,您的程序可以根据此信息判断需要调用工具。您的程序需要解析tool_calls信息中包含的工具函数名和入参,并将入参输入到工具函数来得到工具调用的结果。您的程序需要将工具信息按照以下格式配置:

       
      {
          "name": "$工具名",
          "role": "tool",
          "content": "$工具输出"
      }

      将工具信息添加到历史对话信息中,再次向大模型提问,获得最终回答。

    Function call的工作流程示意图如下所示:

    image
    说明

    Function call信息暂时不支持增量输出,增量输出请参考输入参数配置中incremental_output参数。

    Function call的使用涉及到参数解析功能,因此对大模型的响应质量要求较高,推荐您优先使用qwen-max模型。示例代码如下所示:

    Python
    Java
     
    import requests
    import os
    from datetime import datetime
    import json
    
    # 定义工具列表,模型在选择使用哪个工具时会参考工具的name和description
    tools = [
        # 工具1 获取当前时刻的时间
        {
            "type": "function",
            "function": {
                "name": "get_current_time",
                "description": "当你想知道现在的时间时非常有用。",
                "parameters": {}  # 因为获取当前时间无需输入参数,因此parameters为空字典
            }
        },  
        # 工具2 获取指定城市的天气
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "当你想查询指定城市的天气时非常有用。",
                "parameters": {  # 查询天气时需要提供位置,因此参数设置为location
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "城市或县区,比如北京市、杭州市、余杭区等。"
                        }
                    }
                },
                "required": [
                    "location"
                ]
            }
        }
    ]
    
    # 模拟天气查询工具。返回结果示例:“北京今天是晴天。”
    def get_current_weather(location):
        return f"{location}今天是晴天。 "
    
    # 查询当前时间的工具。返回结果示例:“当前时间:2024-04-15 17:15:18。“
    def get_current_time():
        # 获取当前日期和时间
        current_datetime = datetime.now()
        # 格式化当前日期和时间
        formatted_time = current_datetime.strftime('%Y-%m-%d %H:%M:%S')
        # 返回格式化后的当前时间
        return f"当前时间:{formatted_time}。"
    
    def get_response(messages):
        api_key = os.getenv("DASHSCOPE_API_KEY")
        url = 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation'
        headers = {'Content-Type': 'application/json',
                'Authorization':f'Bearer {api_key}'}
        body = {
            'model': 'qwen-max',
            "input": {
                "messages": messages
            },
            "parameters": {
                "result_format": "message",
                "tools": tools
            }
        }
    
        response = requests.post(url, headers=headers, json=body)
        return response.json()
    
    messages = [
        {
            "role": "user",
            "content": "今天天气怎么样?"
        }
    ]
    
    def call_with_messages():
        messages = [
                {
                    "content": input('请输入:'),  # 提问示例:"现在几点了?" "一个小时后几点" "北京天气如何?"
                    "role": "user"
                }
        ]
        
        # 模型的第一轮调用
        first_response = get_response(messages)
        print(f"\n第一轮调用结果:{first_response}")
        assistant_output = first_response['output']['choices'][0]['message']
        messages.append(assistant_output)
        if 'tool_calls' not in assistant_output:  # 如果模型判断无需调用工具,则将assistant的回复直接打印出来,无需进行模型的第二轮调用
            print(f"最终答案:{assistant_output.content}")
            return
        # 如果模型选择的工具是get_current_weather
        elif assistant_output['tool_calls'][0]['function']['name'] == 'get_current_weather':
            tool_info = {"name": "get_current_weather", "role":"tool"}
            location = json.loads(assistant_output['tool_calls'][0]['function']['arguments'])['properties']['location']
            tool_info['content'] = get_current_weather(location)
        # 如果模型选择的工具是get_current_time
        elif assistant_output['tool_calls'][0]['function']['name'] == 'get_current_time':
            tool_info = {"name": "get_current_time", "role":"tool"}
            tool_info['content'] = get_current_time()
        print(f"工具输出信息:{tool_info['content']}")
        messages.append(tool_info)
    
        # 模型的第二轮调用,对工具的输出进行总结
        second_response = get_response(messages)
        print(f"第二轮调用结果:{second_response}")
        print(f"最终答案:{second_response['output']['choices'][0]['message']['content']}")
    
    if __name__ == '__main__':
        call_with_messages()
    

    入参描述

    您可以参考下表参考输入参数的配置。其中数据类型列的字段含义如下所示:

    • string表示字符串类型;

    • array表示数组;

    • integer表示整数型;

    • float表示浮点型;

    • boolean表示布尔型;

    • object表示哈希表。

    传参方式

    字段

    数据类型

    必选

    描述

    示例值

    Header

    Content-Type

    string

    请求类型:application/json

    "Content-Type":"application/json"

    Accept

    string

    选择text/event-stream则会开启SSE响应,默认无设置。

    "Accept":"text/event-stream"

    Authorization

    string

    API-KEY,例如:Bearer d1**2a

    "Authorization":"Bearer d1**2a"

    X-DashScope-SSE

    string

    设置为enable或者设置Accept: text/event-stream即可启用SSE响应。

    "X-DashScope-SSE":"enable"

    Body

    model

    string

    指定用于对话的通义千问模型名,目前可选择qwen-turboqwen-plusqwen-maxqwen-max-0403qwen-max-0107qwen-max-1201qwen-max-longcontext

    "model":"qwen-turbo"

    input

    object

    输入模型的信息。

    input.prompt

    说明

    字段中的点号(.)表示后者为前者的属性。在API测试工具中,并不能直接将Key设置为input.prompt。传入方式为"input":{"prompt":"xxx"}。

    string

    用户当前输入的期望模型执行指令,支持中英文。与input.messages指定其中一个即可。

    "input":{"prompt":"你好"}

    input.history

    array

    即将废弃,请使用messages字段用户与模型的对话历史,array中的每个元素形式为{"user":"用户输入","bot":"模型输出"}的一轮对话,多轮对话按时间正序排列。

    "input":{"history":[{"user":"今天天气好吗?",

    "bot":"今天天气不错,要出去玩玩嘛?"},

    {"user":"那你有什么地方推荐?",

    "bot":"我建议你去公园,春天来了,花朵开了,很美丽。"}]}

    input.messages

    array

    表示用户与模型的对话历史。array中的每个元素形式为{"role":角色, "content": 内容},如果role为tool,元素形式为:

     
    {"role":"tool","content":内容,"name":工具函数名}

    角色可选值:systemuserassistanttool

    "input":{

    "messages":[

    {

    "role": "system",

    "content": "You are a helpful assistant."

    },

    {

    "role": "user",

    "content": "你好,附近哪里有博物馆?"

    }]

    }

    input.messages.role

    string

    messages存在的时候不能省略。

    input.messages.content

    string

    input.messages.name

    string

    input.messages.role为tool时不能省略

    role为tool表示当前message为function_call的调用结果,name是工具函数名,需要和上轮response中的tool_calls[i].function.name参数保持一致,content为工具函数的输出。参考代码的多轮调用给出了示例。

    parameters

    object

    用于控制模型生成的参数

    parameters.result_format

    string

    用于指定返回结果的格式,默认为text,也可设置为message。当设置为message时,输出格式请参考返回结果。推荐优先使用message格式。

    "parameters":{"result_format":"message"}

    parameters.seed

    integer

    生成时使用的随机数种子,用户控制模型生成内容的随机性。seed支持无符号64位整数,默认值为1234。在使用seed时,模型将尽可能生成相同或相似的结果,但目前不保证每次生成的结果完全相同。

    "parameters":{"seed":666}

    parameters.max_tokens

    integer

    用于限制模型生成token的数量,表示生成token个数的上限。其中qwen-turbo最大值和默认值为1500,qwen-max、qwen-max-1201 、qwen-max-longcontext 和 qwen-plus最大值和默认值均为2000。

    "parameters":{"max_tokens":1500}

    parameters.top_p

    float

    生成时,核采样方法的概率阈值。例如,取值为0.8时,仅保留累计概率之和大于等于0.8的概率分布中的token,作为随机采样的候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的随机性越低。默认值为0.8。注意,取值不要大于等于1

    "parameters":{"top_p":0.7}

    parameters.top_k

    integer

    生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。注意:如果top_k参数为空或者top_k的值大于100,表示不启用top_k策略,此时仅有top_p策略生效,默认是空。

    "parameters":{"top_k":50}

    parameters.repetition_penalty

    float

    用于控制模型生成时的重复度。提高repetition_penalty时可以降低模型生成的重复度。1.0表示不做惩罚,默认为1.1。没有严格的取值范围。

    "parameters":{"repetition_penalty":1.0}

    parameters.temperature

    float

    用于控制随机性和多样性的程度。具体来说,temperature值控制了生成文本时对每个候选词的概率分布进行平滑的程度。较高的temperature值会降低概率分布的峰值,使得更多的低概率词被选择,生成结果更加多样化;而较低的temperature值则会增强概率分布的峰值,使得高概率词更容易被选择,生成结果更加确定。

    取值范围:[0, 2),系统默认值0.85。不建议取值为0,无意义。

    "parameters":{"repetition_penalty":0.85}

    parameters.stop

    string/array

    stop参数用于实现内容生成过程的精确控制,在模型生成的内容即将包含指定的字符串或token_id时自动停止,生成的内容不包含指定的内容。stop可以为string类型或array类型。

    • string类型

      当模型将要生成指定的stop词语时停止。

      例如将stop指定为"你好",则模型将要生成“你好”时停止。

    • array类型

      array中的元素可以为token_id或者字符串,或者元素为token_id的array。当模型将要生成的token或其对应的token_id在stop中时,模型生成将会停止。

      例如将stop指定为["你好","天气"]或者[108386,104307],则模型将要生成“你好”或者“天气”时停止。如果将stop指定为[[108386, 103924],[35946, 101243]],则模型将要生成“你好啊”或者“我很好”时停止。

      说明

      stop为array类型时,不可以将token_id和字符串同时作为元素输入,比如不可以指定stop为["你好",104307]。

    "parameters":{"stop":["你好","天气"]}

    parameters.enable_search

    boolean

    模型内置了互联网搜索服务,该参数控制模型在生成文本时是否参考使用互联网搜索结果。取值如下:

    • true:启用互联网搜索,模型会将搜索结果作为文本生成过程中的参考信息,但模型会基于其内部逻辑“自行判断”是否使用互联网搜索结果。

    • false(默认):关闭互联网搜索。

    "parameters":{"enable_search":false}

    parameters.incremental_output

    boolean

    控制在流式输出模式下是否开启增量输出,即后续输出内容是否包含已输出的内容。设置为True时,将开启增量输出模式,后面输出不会包含已经输出的内容,您需要自行拼接整体输出;设置为False则会包含已输出的内容。

    默认False:

    I

    I like

    I like apple

    True:

    I

    like

    apple

    该参数只能在开启SSE响应时使用。

    说明

    incremental_output暂时无法和tools参数同时使用。

    "parameters":{"incremental_output":false}

    parameters.tools

    array

    用于指定可供模型调用的工具列表。当输入多个工具时,模型会选择其中一个生成结果。tools中每一个tool的结构如下:

    • type,类型为string,表示tools的类型,当前仅支持function。

    • function,类型为object,键值包括name,description和parameters:

      • name:类型为string,表示工具函数的名称,必须是字母、数字,可以包含下划线和短划线,最大长度为64。

      • description:类型为string,表示工具函数的描述,供模型选择何时以及如何调用工具函数。

      • parameters:类型为object,表示工具的参数描述,需要是一个合法的JSON Schema。JSON Schema的描述可以见链接参考代码中给出了一个参数描述的示例。如果parameters参数为空,表示function没有入参。

    使用tools时需要同时指定result_format为message。在function call流程中,无论是发起function call的轮次,还是向模型提交工具函数的执行结果,均需设置tools参数。当前支持的模型包括qwen-turbo、qwen-plus、qwen-max和qwen-max-longcontext。

    说明

    tools暂时无法和incremental_output参数同时使用。

     
    "parameters":{"tools":[
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "Get the current weather in a given location",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "The city and state, e.g. San Francisco, CA"
                        },
                        "unit": {
                            "type": "string",
                            "enum": [
                                "celsius",
                                "fahrenheit"
                            ]
                        }
                    },
                    "required": [
                        "location"
                    ]
                }
            }
        }
    ]}

    出参描述

    字段

    数据类型

    描述

    示例值

    字段

    数据类型

    描述

    示例值

    output.text

    string

    模型输出的内容。当result_format设置为text时返回该字段。

    我建议你去颐和园

    output.finish_reason

    string

    有三种情况:正在生成时为null,生成结束时如果由于停止token导致则为stop,生成结束时如果因为生成长度过长导致则为length。当result_format设置为text时返回该字段。

    stop

    output.choices

    array

    当result_format设置为message时返回该字段。

    • 普通示例

     
    {
        "choices": [
            {
                "finish_reason": "null",
                "message": {
                    "role": "assistant",
                    "content": "周围的咖啡馆在..."
                }
            }
        ]
    }
    • function call示例

     
    {
        "choices": [
            {
                "finish_reason": "tool_calls",
                "message": {
                    "role": "assistant",
                    "content": "",
                    "tool_calls": [
                        {
                            "function": {
                                "name": "get_current_weather",
                                "arguments": "{\"location\": \"Boston\", \"unit\": \"fahrenheit\"}"
                            },
                            "type": "function"
                        }
                    ]
                }
            }
        ]
    }

    output.choices[x].finish_reason

    string

    停止原因,null:生成过程中

    stop:stop token导致结束

    length:生成长度导致结束

    output.choices[x].message

    object

    message每个元素形式为{"role":角色, "content": 内容}。角色可选值:systemuserassistant。content为模型输出的内容。

    output.choices[x].message.role

    string

    output.choices[x].message.content

    string

    output.choices[x].message.tool_calls

    object

    如果模型需要调用工具,则会生成tool_calls参数,应用于function_call场景。其中包含type和function两个参数,返回结果中给出了function_call的示例。参数详情如下::

    • type,类型为string,当前只可能为function

    • function,类型为dict,包含name和arguments两个参数:

      • name,类型为string,表示需要调用的工具的名称,如果是function_call场景则表示要调用的function名称

      • arguments,类型为string,表示模型生成的工具入参,在Python中可以使用json.loads方法转化为字典类型。

    usage

    object

    本次调用使用的token信息。

    usage.output_tokens

    integer

    模型输出内容的 token 个数。

    380

    usage.input_tokens

    integer

    本次请求输入内容的 token 个数。在enable_search设置为true时,输入的 token 数目由于需要添加搜索相关内容,因此会比您在请求中的输入 token 个数多。

    633

    usage.total_tokens

    integer

    usage.output_tokens与usage.input_tokens的总和。

    1013

    request_id

    string

    本次请求的系统唯一码。

    7574ee8f-38a3-4b1e-9280-11c33ab46e51

    异常响应示例

    在访问请求出错的情况下,输出的结果中会通过 code 和 message 指明错误原因。

     
    {
        "code":"InvalidApiKey",
        "message":"Invalid API-key provided.",
        "request_id":"fb53c4ec-1c12-4fc4-a580-cdb7c3261fc1"
    }

    状态码说明

    DashScope灵积模型服务通用状态码详情,请参见返回状态码说明

    计量计费

    更新时间:2024-05-12 10:46:38

    在您调用通义千问的API时会产生一定的费用,模型调用也有限流条件。本文介绍了计费单元、计费单价、您可免费使用的额度以及模型的限流条件。

    通义千问

    计费单元

    模型服务

    计费单元

    通义千问

    token

    说明

    Token是模型用来表示自然语言文本的基本单位,可以直观地理解为“字”或“词”。对于中文文本来说,千问模型的1个token平均对应1.5-1.8个汉字;对于英文文本来说,1个token通常对应一个单词或词根。

    通义千问模型服务根据模型输入和输出的总token数量进行计量计费,其中多轮对话中的所有messages作为输入都会进行计量计费。每一次模型调用产生的实际token数量可以从 response 中获取。

    字符串与token之间的互相转换

    不同的大模型切分token的方法可能不同。您可以使用SDK在本地查看经过通义千问模型切分后的token数据。

    Python
    Java
     
    # 运行前请 pip install tiktoken
    from dashscope import get_tokenizer  # dashscope版本 >= 1.14.0
    
    # 获取tokenizer对象,目前只支持通义千问系列模型
    tokenizer = get_tokenizer('qwen-turbo')
    
    input_str = '通义千问具有强大的能力。'
    
    # 将字符串切分成token并转换为token id
    tokens = tokenizer.encode(input_str)
    print(f"经过切分后的token id为:{tokens}。")
    # 经过切分后的token id为: [31935, 64559, 99320, 56007, 100629, 104795, 99788, 1773]
    print(f"经过切分后共有{len(tokens)}个token")
    # 经过切分后共有8个token
    
    # 将token id转化为字符串并打印出来
    for i in range(len(tokens)):
        print(f"token id为{tokens[i]}对应的字符串为:{tokenizer.decode(tokens[i])}")
    

    python 输出为

    Bash
     
    经过切分后的token id为:[31935, 64559, 99320, 56007, 100629, 104795, 99788, 1773]。
    经过切分后共有8个token
    token id为31935对应的字符串为:通
    token id为64559对应的字符串为:义
    token id为99320对应的字符串为:千
    token id为56007对应的字符串为:问
    token id为100629对应的字符串为:具有
    token id为104795对应的字符串为:强大的
    token id为99788对应的字符串为:能力
    token id为1773对应的字符串为:。

    本地运行的tokenizer可以用来估计文本的token量,但是得到的结果不保证与模型服务端完全一致,仅供参考。如果您对通义千问的tokenizer细节感兴趣,请参考: tokenizer参考

    输入token的计算逻辑

    输入token的计量数目中,除了包含用户的原始输入所对应的token,还会包括将原始输入根据chatml格式进行格式化所需要引入的special token。

    重要

    随着模型能力的迭代,这部分计算逻辑可能会进行演变和调整

    基础调用

    在用户未试图调用插件时,token计数将包含system、user和历史轮的assistant,以及对输入进行格式化组装需要的special token。例如,在用户输入为:

     
    [
      {
        "role": "user",
        "content": "hi"
      }
    ]

    则token计数基于如下prompt进行,对应9个token:

     
    <|im_start|>user\nhi<|im_end|>\n<|im_start|>assistant\n

    再例如用户输入为:

     
    [
      {
        "role": "system",
        "content": "you are a bot."
      },
      {
        "role": "user",
        "content": "hi"
      },
      {
        "role": "assistant",
        "content": "Hello! How can I assist you today?"
      },
      {
        "role": "user",
        "content": "who are you"
      }
    ]

    则token计数基于如下prompt进行,对应41个token

     
    <|im_start|>system\nyou are a bot.<|im_end|>\n<|im_start|>user\nhi<|im_end|>\n<|im_start|>assistant\nHello! How can I assist you today?<|im_end|>\n<|im_start|>user\nwho are you<|im_end|>\n<|im_start|>assistant\n

    高级调用

    当用户的请求涉及插件调用时,会额外引入prompt来引导模型做出正确的回应。此时token的计量会有额外的增加。常见的情况有:

    1. 搜索增强。当搜索增强参数(enable_search)被配置时,触发搜索本身会需要额外的prompt和插件调用,同时搜索的结果在输入到模型时,也会被计入输入token计数;

    2. 插件调用。当插件被调用时,会有额外的触发插件调用所需要的指令,这些都会被计入token数目;

    3. function call。当使用function call功能时,会有额外的引导指令,这些也都会被计入token数目。

    计费单价

    模型服务

    模型名

    计费单价

    通义千问

    qwen-turbo

    0.008元/1,000 tokens

    qwen-plus

    0.02元/1,000 tokens

    qwen-max-0428

    0.12元/1,000 tokens

    qwen-max

    qwen-max-0403

    qwen-max-0107

    qwen-max-longcontext

    说明
    • qwen-turbo原来为qwen-v1qwen-v1计费与qwen-turbo保持一致。qwen-v1模型已弃用,请使用qwen-turbo

    • qwen-plus原来为qwen-plus-v1qwen-plus-v1计费与qwen-plus保持一致。qwen-plus-v1模型已弃用,请使用qwen-plus

    免费额度

    模型服务

    模型名

    免费额度

    通义千问

    qwen-turbo

    开通DashScope即获赠总计2,000,000 tokens限时免费使用额度,有效期180天。

    qwen-plus

    开通DashScope即获赠总计1,000,000 tokens限时免费使用额度,有效期180天。

    qwen-max

    开通DashScope即获赠总计1,000,000 tokens限时免费使用额度,有效期30天。

    qwen-max-0428

    qwen-max-0403

    qwen-max-0107

    qwen-max-longcontext

    基础限流

    为了保证用户调用模型的公平性,通义千问对于普通用户设置了基础限流。限流是基于模型维度的,并且和调用用户的阿里云主账号相关联,按照该账号下所有API-KEY调用该模型的总和计算限流。如果超出调用限制,用户的API请求将会因为限流控制而失败,用户需要等待一段时间待满足限流条件后方能再次调用。

    重要

    通常情况下,基础限流可以满足大部分客户的应用场景,如果您有超过基础限流配额的访问需求,请使用下面表单中的方式额外提交申请。

    模型服务

    模型名

    基础限流

    超出基础限流申请方式

    模型服务

    模型名

    基础限流

    超出基础限流申请方式

    通义千问

    qwen-turbo

    以下条件任何一个超出都会触发限流:

    • 调用频次 ≤ 500 QPM,每分钟不超过500次API调用;

    • Token消耗 ≤ 500,000 TPM,每分钟消耗的token数目不超过500,000。

    qwen-turbo超出基础限流配额点此申请

    qwen-plus

    以下条件任何一个超出都会触发限流:

    • 调用频次 ≤ 200 QPM,每分钟不超过200次API调用;

    • Token消耗 ≤ 200,000 TPM,每分钟消耗的token数目不超过200,000。

    qwen-plus超出基础限流配额点此申请

    qwen-max

    以下条件任何一个超出都会触发限流(限时免费开放中,限流策略可能随时变化):

    • 调用频次 ≤ 60 QPM,每分钟不超过60次API调用;

    • Token消耗 ≤ 100,000 TPM,每分钟消耗的token数目不超过100,000。

    qwen-max超出基础限流配额点此申请

    qwen-max-0428

    qwen-max-0403

    暂无

    qwen-max-0107

    以下条件任何一个超出都会触发限流(限时免费开放中,限流策略可能随时变化):

    • 调用频次 ≤ 10 QPM,每分钟不超过10次API调用;

    • Token消耗 ≤ 20,000 TPM,每分钟消耗的token数目不超过20,000。

    暂无

    qwen-max-longcontext

    以下条件任何一个超出都会触发限流(限时免费开放中,限流策略可能随时变化):

    • 调用频次 ≤ 5 QPM,每分钟不超过5次API调用;

    • Token消耗 ≤ 1,500,000 TPM,每分钟消耗的token数目不超过1,500,000。

    暂无

    查看账单

    有关DashScope灵积模型服务的账单时效信息请参阅计量计费规则

    有关账单详情请前往阿里云用户中心查询。

    通义千问DL

    qwen-dl是通义千问模型家族中,提供具备强大长文本处理能力的模型系列,当前首先推出qwen-dl-max,并通过与OpenAI兼容的模式提供API服务。本文提供简单的示例代码,帮助您快速上手并调用qwen-dl-max模型服务。

    前提条件

    重要

    安装方式:pip install --upgrade 'openai>=1.0'

    检查版本:python -c 'import openai; print("version =",openai.__version__)'

    使用方式

    说明

    qwen-dl系列模型通过system role的接口提供文档信息。于此同时,标准的通过system role来指定模型行为的能力依然支持,必要的时候两者可并存。

    1. 通过system role的内容来提供文档信息。当前支持两种方式来提供文档信息:

    • 在提前上传文件获取文件id(fileid)后,可以直接提供fileid。其中上传文件的接口和操作方法,可参见文件接口文档。支持在对话中,使用一个或多个fileid。

    • 直接输入需要处理的文本格式的文档内容(file content)。

    1. 其他对话内容格式的填写遵循标准的messages格式。

    示例代码

    方式一:以文档id(fileid)方式输入文档(推荐)

    您可以在使用Dashscope的文件上传服务后,使用获取到的文档id来进行文档对话,当前示例为流式调用的方式。

    Python
     
    from pathlib import Path
    from openai import OpenAI
    
    client = OpenAI(
        api_key="$your-dashscope-api-key",  # 替换成真实DashScope的API_KEY
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 填写DashScope服务endpoint
    )
    
    # data.pdf 是一个示例文件
    file = client.files.create(file=Path("data.pdf"), purpose="file-extract")
    
    # 首次对话会等待文档解析完成,首次rt可能较长
    completion = client.chat.completions.create(
        model="qwen-dl-max",
        messages=[
            {
                'role': 'system',
                'content': 'You are a helpful assistant.'
            },
            {
                'role': 'system',
                'content': f'fileid://{file.id}'
            },
            {
                'role': 'user',
                'content': '这篇文章讲了什么?'
            }
        ],
        stream=True
    )
    for chunk in completion:
        if chunk.choices[0].delta.content is not None:
            print(chunk.choices[0].dict())
    

    方式二:以文本方式直接输入文档内容

    您也可以直接将文档内容放在承载file的system字段中进行上传(注:当前仅支持TXT类型的文本,Markdown等富文本格式暂不支持),当前示例为流式调用的方式。

    Python
     
    from openai import OpenAI
    
    client = OpenAI(
        api_key="$your-dashscope-api-key",  # 替换成真实DashScope的API_KEY
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 填写DashScope服务endpoint
    )
    
    completion = client.chat.completions.create(
        model="qwen-dl-max",
        messages=[
            {
                'role': 'system',
                'content': 'You are a helpful assistant.'
            },
            {
                'role': 'system',
                'content': '大型语言模型(llm)已经彻底改变了人工智能领域,使以前被认为是人类独有的自然语言处理任务成为可能...'
            },
            {
                'role': 'user',
                'content': '文章讲了什么?'
            }
        ],
        stream=True
    )
    for chunk in completion:
        if chunk.choices[0].delta.content is not None:
            print(chunk.choices[0].dict())
    

    调用成功后将输出以下结果。

    Python
     
    {'delta': {'content': '文章', 'function_call': None, 'role': 'assistant', 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '主要', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '探讨', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '了一种名为LIMA', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '的语言模型的训练方法及其对齐', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '能力的评估。LIMA是一个拥有', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '650亿参数的大型语言', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '模型,它仅通过在10', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '00个精心挑选的提示和', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '响应上进行标准监督微调来', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '完成训练,过程中并未采用强化学习', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '或人类偏好建模。研究结果显示', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': ',尽管训练数据有限,LIMA', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '仍能展现出强大的性能,能够从', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '少数示例中学习到特定的', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '响应格式,并泛化到未见过', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '的任务上。\n\n对比实验表明,在控制', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '条件下,相对于GPT-4、', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': 'Bard和DaVinci00', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '3等其他模型,人们更倾向于', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': 'LIMA生成的回复,分别有', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '43%、58%和', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '65%的情况下认为LIMA的表现', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '更好或至少相当。这表明大型', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '语言模型在预训练阶段已经学', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '到了大量的知识,而只需少量的', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '指令微调数据即可让模型产生', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '高质量的输出,强调了“少', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '即是多”(Less is More)', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '的理念在模型对齐上的有效性。', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '\n\n此外,文章还提及了关于模型', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '输出质量的测试,以及使用不同', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '数量的示例进行微调时', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '模型稳定性的观察,进一步证明了', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '即使是小规模的、经过筛选的数据', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '也能显著提升模型性能。同时,', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '文中还包含了一些示例输出,', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '如有关如何帮助聪明的孩子交友的', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '建议、模仿乔治·卡林风格', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '的单口相声段子,以及', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '如何制作北非风味的shak', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': 'shuka菜谱等,展示了模型', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '根据特定要求生成多样化内容的能力。', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'null', 'index': 0, 'logprobs': None}
    {'delta': {'content': '', 'function_call': None, 'role': None, 'tool_calls': None}, 'finish_reason': 'stop', 'index': 0, 'logprobs': None}

    相关文档

    更多qwen-dl-max API的详细调用,请参见API详情