简介

通义千问(Qwen)是阿里巴巴推出的大型语言模型,具有优秀的中文理解和生成能力。通义千问在自然语言处理、多轮对话、逻辑推理等方面表现出色,支持丰富的应用场景。通过LangChain框架,我们可以轻松地将通义千问模型集成到我们的应用程序中,实现智能对话、内容生成等功能。

特点

  • 先进的中文理解能力:针对中文语境和知识进行深度优化

  • 丰富的知识储备:涵盖广泛的领域知识,支持多样化的问答场景

  • 强大的推理能力:在复杂问题解决和逻辑推理任务中表现优异

  • 多模态能力:高级版本支持文本-图像交互理解与生成

  • 工具使用能力:支持函数调用,能够使用外部工具解决问题

  • 长文本处理:能够处理较长的上下文输入,适合复杂任务

在LangChain中使用通义千问聊天模型

安装必要依赖

在使用通义千问聊天模型之前,需要安装相关依赖:

pip install langchain langchain-dashscope dashscope

配置API密钥

使用通义千问模型需要阿里云灵积平台API密钥,可以通过以下方式配置:

import os

# 方法1:设置环境变量
os.environ["DASHSCOPE_API_KEY"] = "your-api-key"

# 方法2:在初始化时直接传递
from langchain_dashscope import ChatDashscope
chat = ChatDashscope(dashscope_api_key="your-api-key")

模型选择

通义千问提供了多个版本的模型,可以根据需求选择:

# 通义千问2(默认)
chat_default = ChatDashscope()

# 通义千问2-32K(支持更长上下文)
chat_32k = ChatDashscope(model="qwen-plus")

# 通义千问2-max版本
chat_max = ChatDashscope(model="qwen-max")

# 通义千问2-turbo版本
chat_turbo = ChatDashscope(model="qwen-turbo")

基本使用

创建并发送简单消息

from langchain_dashscope import ChatDashscope
from langchain_core.messages import HumanMessage, SystemMessage

chat = ChatDashscope()

# 创建消息列表
messages = [
    SystemMessage(content="你是一位金融分析师,擅长解读经济数据和市场趋势。"),
    HumanMessage(content="请分析当前中国经济形势和未来发展趋势。")
]

# 获取回复
response = chat.invoke(messages)
print(response.content)

高级功能

1. 流式输出

通义千问支持流式输出,适用于需要实时显示生成内容的场景:

from langchain_dashscope import ChatDashscope
from langchain_core.messages import HumanMessage

chat = ChatDashscope(streaming=True)

# 使用stream方法
for chunk in chat.stream([HumanMessage(content="请写一篇关于杭州西湖的游记散文")]):
    print(chunk.content, end="", flush=True)

2. 参数控制

可以通过多种参数控制通义千问的输出:

from langchain_dashscope import ChatDashscope

# 控制随机性
deterministic_chat = ChatDashscope(temperature=0.1)  # 更确定性的输出
creative_chat = ChatDashscope(temperature=0.8)  # 更具创造性和多样性

# 控制采样策略
chat_top_p = ChatDashscope(top_p=0.7)  # 使用nucleus sampling控制多样性

# 控制生成长度
chat_max_length = ChatDashscope(max_length=500)  # 限制回复最大长度

3. 专业领域问答

通义千问在专业领域问答方面表现出色:

from langchain_dashscope import ChatDashscope
from langchain_core.messages import SystemMessage, HumanMessage

chat = ChatDashscope(temperature=0.2)  # 使用低温度提高专业回答准确性

# 法律咨询示例
messages = [
    SystemMessage(content="你是一位经验丰富的中国法律顾问,精通中国法律法规。"),
    HumanMessage(content="根据中国《消费者权益保护法》,网购商品的退货政策有哪些规定?")
]

response = chat.invoke(messages)
print(response.content)

4. 多轮对话与上下文理解

通义千问善于维持多轮对话的连贯性:

from langchain_dashscope import ChatDashscope
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage

chat = ChatDashscope()

# 创建多轮对话
messages = [
    SystemMessage(content="你是一位专业的旅游规划师,擅长制定详细的旅游计划。"),
    HumanMessage(content="我计划去云南旅游,有什么建议?"),
    AIMessage(content="云南是个旅游胜地,有丽江、大理、昆明、香格里拉等著名景点。您打算什么时候去云南?计划旅游多少天?有特别想体验的内容吗?"),
    HumanMessage(content="我打算十月份去,大概10天时间,想体验少数民族文化和自然风光。"),
    AIMessage(content="十月份去云南是个不错的选择,天气适宜。根据您的需求和时间,我推荐以下行程:昆明(2天)→大理(3天)→丽江(3天)→香格里拉(2天)。这样可以体验白族、纳西族、藏族等多个民族文化,同时欣赏洱海、玉龙雪山等自然风光。您有什么特殊的住宿或预算要求吗?"),
    HumanMessage(content="预算适中即可,能否详细介绍下大理的行程安排?")
]

response = chat.invoke(messages)
print(response.content)

5. 函数调用

通义千问支持函数调用功能:

from langchain_dashscope import ChatDashscope
from langchain_core.messages import HumanMessage

# 定义可用的函数
functions = [
    {
        "name": "search_hotel",
        "description": "搜索指定城市的酒店信息",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "城市名称,如北京、上海"},
                "check_in": {"type": "string", "description": "入住日期,格式为YYYY-MM-DD"},
                "check_out": {"type": "string", "description": "退房日期,格式为YYYY-MM-DD"},
                "star_rating": {"type": "integer", "description": "酒店星级,1-5,可选"}
            },
            "required": ["city", "check_in", "check_out"]
        }
    }
]

# 初始化支持函数调用的聊天模型
chat = ChatDashscope(model="qwen-max").bind(functions=functions, function_call="auto")

# 模型将决定是否调用函数
response = chat.invoke([HumanMessage(content="我想在下个月15号到17号在杭州住酒店,帮我查一下")])
print(response)

6. 创意内容生成

通义千问在创意内容生成方面表现优异:

from langchain_dashscope import ChatDashscope
from langchain_core.messages import SystemMessage, HumanMessage

chat = ChatDashscope(temperature=0.7)  # 使用较高温度增加创造性

# 创意写作示例
messages = [
    SystemMessage(content="你是一位富有创意的文案撰写专家。"),
    HumanMessage(content="请以'星辰大海'为主题,写一段富有诗意的科幻微小说,字数300字左右。")
]

response = chat.invoke(messages)
print(response.content)

7. 异步调用

对于需要处理大量请求的应用,可以使用异步API:

import asyncio
from langchain_dashscope import ChatDashscope
from langchain_core.messages import HumanMessage

async def generate_async():
    chat = ChatDashscope()
    response = await chat.ainvoke([HumanMessage(content="异步请求示例,请简要介绍人工智能的发展历程")])
    return response.content

# 运行异步函数
result = asyncio.run(generate_async())
print(result)

注意事项

  1. 账号申请:使用通义千问API需要在阿里云灵积平台申请账号并开通服务

  2. 费用控制:请注意监控API使用量和相关费用

  3. QPS限制:API有调用频率限制,大量请求时需要合理控制请求速率

  4. 内容合规:确保遵守相关法律法规和阿里云平台的内容政策

  5. 版本差异:不同版本的通义千问模型在能力和特性上有所差异,选择时需注意

常见问题排查

  • API密钥错误:确保API密钥正确设置且有效

  • 服务未开通:检查是否已在阿里云灵积平台开通相应服务

  • 配额限制:检查是否超出API调用配额

  • 参数设置:检查模型参数是否正确设置

通过本文档,您应该能够在LangChain框架中有效地使用阿里巴巴通义千问聊天模型,从基础应用到高级功能,为您的应用添加强大的自然语言处理能力。