教程:https://www.bilibili.com/video/BV1yjz5BLEoY

代码:https://github.com/shangxiang0907/HeiMa-AI-LLM-RAG-Agent-Dev

云开发平台:https://hzh.sealos.run

RAG开发-06、LangChain调用大语言模型

LangChain支持的模型:大语言模型、聊天模型、文本嵌入模型

在这里插入图片描述

阿里云大模型的访问

介绍

在这里插入图片描述

→提示词:帮我根据图中内容,创建代码11(把原来代码目录附上,文件一多,Cursor就容易丢失上下文了)

在这里插入图片描述

←AI回复

在这里插入图片描述
在这里插入图片描述

11_LangChain_Tongyi_Basic_Usage.py

"""
使用 LangChain 访问阿里云通义大模型(Tongyi)示例

本示例对应课件中的代码片段:

from langchain_community.llms.tongyi import Tongyi
llm = Tongyi(model="qwen-max")
res = llm.invoke("帮我讲个笑话吧")
print(res)

在此基础上,我们做了以下增强:
- 使用 .env / 环境变量中读取 API Key
- 演示多轮调用与不同提示词
- 对返回结果增加简单的格式化输出
"""

import os
from typing import List

from dotenv import load_dotenv
from langchain_community.llms.tongyi import Tongyi


def init_llm() -> Tongyi:
    """
    初始化 Tongyi LLM 模型实例。

    优先从以下环境变量中读取密钥(依次回退):
    - DASHSCOPE_API_KEY(阿里云官方推荐)
    - API_KEY(与本项目其他示例保持兼容)
    """
    load_dotenv()

    # 兼容两种环境变量命名方式
    api_key = os.getenv("DASHSCOPE_API_KEY") or os.getenv("API_KEY")
    if not api_key:
        raise ValueError(
            "未找到 DASHSCOPE_API_KEY 或 API_KEY 环境变量,请先在 .env 或系统环境中配置后再运行。"
        )

    # LangChain 的 Tongyi 封装会自动从环境变量中读取 key,
    # 这里设置一份到 DASHSCOPE_API_KEY,确保兼容性。
    os.environ["DASHSCOPE_API_KEY"] = api_key

    # 课件中的示例使用 qwen-max,这里保持一致
    llm = Tongyi(model="qwen-max")
    return llm


def single_call_demo(llm: Tongyi) -> None:
    """
    对应课件中的最小示例:调用一次模型,生成一个笑话。
    """
    print("=" * 80)
    print("【示例1】最小调用示例:让模型讲一个笑话")
    print("-" * 80)

    prompt = "帮我讲个轻松幽默、适合职场分享的中文笑话。"
    res = llm.invoke(prompt)

    print("提示词:", prompt)
    print("\n模型回复:")
    print(res)
    print()


def multi_call_demo(llm: Tongyi) -> None:
    """
    展示使用同一个 LLM 实例进行多次调用。
    """
    print("=" * 80)
    print("【示例2】多次调用同一模型,完成不同任务")
    print("-" * 80)

    prompts: List[str] = [
        "用 2 句话解释一下什么是大语言模型(LLM),面向零基础读者。",
        "把下面这句话润色成更正式的技术分享开场白:今天我们主要讲大模型在实际项目里的使用。",
        "请给出 3 条使用通义千问进行应用开发时的最佳实践要点,以列表形式回答。",
    ]

    for i, prompt in enumerate(prompts, start=1):
        print(f"\n--- 子任务 {i} ---")
        print("提示词:", prompt)
        res = llm.invoke(prompt)
        print("模型回复:")
        print(res)

    print()


def main() -> None:
    """
    主函数:演示如何使用 LangChain 调用阿里云通义大模型 Tongyi。
    """
    print("=" * 80)
    print("使用 LangChain 访问阿里云通义大模型(Tongyi)示例")
    print("=" * 80)

    llm = init_llm()

    # 对应 PPT 中的最小示例
    single_call_demo(llm)

    # 扩展示例:多次调用
    multi_call_demo(llm)

    print("=" * 80)
    print("演示结束")
    print("=" * 80)


if __name__ == "__main__":
    main()


运行代码

python3 AI_LLM_RAG_Agent_Dev/11_LangChain_Tongyi_Basic_Usage.py 

结果:

(project) devbox@heima-agent-devbox-python312:~/project$ python3 AI_LLM_RAG_Agent_Dev/11_LangChain_Tongyi_Basic_Usage.py 
================================================================================
使用 LangChain 访问阿里云通义大模型(Tongyi)示例
================================================================================
================================================================================
【示例1】最小调用示例:让模型讲一个笑话
--------------------------------------------------------------------------------
提示词: 帮我讲个轻松幽默、适合职场分享的中文笑话。

模型回复:
当然可以,这里有一个轻松幽默的小笑话,很适合在职场分享:

有一天,公司里来了个新同事,大家都很好奇他的背景。于是有人问:“你以前是做什么工作的?”
新同事回答说:“我之前是在动物园工作的。”

大家一听更感兴趣了,又问道:“哦,在动物园工作啊?那你具体负责什么呢?”

新同事笑着说:“我的工作很简单,就是每天早上站在门口,对每位进来的游客说‘欢迎光临’。”

众人听了都笑了起来,觉得这工作确实挺特别的。这时,有位同事开玩笑地说:“那这份工作跟我们这里也差不多嘛,不过我们这里是‘欢迎加班’!”

这个笑话通过一种轻松的方式反映了职场中的一些小幽默,同时也巧妙地将两个看似不相关的场景联系到了一起,希望能够给大家带来欢乐的同时也能让大家会心一笑。

================================================================================
【示例2】多次调用同一模型,完成不同任务
--------------------------------------------------------------------------------

--- 子任务 1 ---
提示词: 用 2 句话解释一下什么是大语言模型(LLM),面向零基础读者。
模型回复:
大语言模型是一种能够理解和生成人类语言的人工智能程序,它通过学习大量的文本数据来掌握语言的使用方式。就像一个非常聪明的学生,读了很多书之后,不仅能理解书中的内容,还能用学到的知识写出新的文章。

--- 子任务 2 ---
提示词: 把下面这句话润色成更正式的技术分享开场白:今天我们主要讲大模型在实际项目里的使用。
模型回复:
今天我们主要探讨大规模模型在实际项目中的应用与实践。

--- 子任务 3 ---
提示词: 请给出 3 条使用通义千问进行应用开发时的最佳实践要点,以列表形式回答。
模型回复:
1. **明确需求与场景定义**:在开始应用开发之前,首先需要明确你的应用目标是什么,希望解决什么问题或满足哪些具体需求。同时,也要清楚地定义应用场景,比如是用于客户服务、内容生成还是数据分析等。这有助于更准确地利用通义千问的能力来设计和实现解决方案。

2. **合理规划API调用**:为了确保应用性能并控制成本,在使用通义千问API时应当注意合理规划API请求。例如,可以通过缓存常用响应结果减少不必要的API调用来节省资源;根据实际业务需求调整请求频率,避免因过度请求导致服务受限或费用过高;对于复杂的任务,考虑将大问题拆分成多个小问题逐步解决,这样不仅可以让回答更加精准,也能提高用户体验。

3. **持续优化与反馈循环**:建立一个有效的用户反馈机制非常重要,通过收集用户的意见和建议不断改进产品。同时,定期审查应用程序的表现,包括但不限于响应时间、错误率以及用户满意度等方面,并据此做出相应的调整。此外,随着技术的发展,也应关注通义千问的新功能更新或版本升级信息,适时引入新的特性以提升应用的功能性和效率。

================================================================================
演示结束
================================================================================

Ollama本地大语言模型的访问(略)

在这里插入图片描述

总结

在这里插入图片描述

RAG开发-07、LangChain模型的流式输出

介绍

在这里插入图片描述

→提示词:根据图中内容,帮我新建代码12,介绍langchain流式输出

←AI回复

在这里插入图片描述

12_LangChain_Tongyi_Stream_Output.py

"""
使用 LangChain 实现通义大模型(Tongyi)的流式输出示例

本示例对应课件中的代码片段:

from langchain_community.llms.tongyi import Tongyi
model = Tongyi(model="qwen-max")
res = model.stream(input="你是谁呀能做什么?")
for chunk in res:
    print(chunk, end="", flush=True)

核心概念:
- invoke 方法:一次性返回完整结果
- stream 方法:逐段返回结果,实现流式输出

在此基础上,我们做了以下增强:
- 使用 .env / 环境变量中读取 API Key
- 对比 invoke 和 stream 两种方法的输出方式
- 演示流式输出的实时效果
"""

import os
import time

from dotenv import load_dotenv
from langchain_community.llms.tongyi import Tongyi


def init_llm() -> Tongyi:
    """
    初始化 Tongyi LLM 模型实例。

    优先从以下环境变量中读取密钥(依次回退):
    - DASHSCOPE_API_KEY(阿里云官方推荐)
    - API_KEY(与本项目其他示例保持兼容)

    注意:不使用 qwen3-max,因为 qwen3-max 是聊天模型,qwen-max 是大语言模型
    """
    # load_dotenv() 会从项目根目录的 .env 文件中读取环境变量,
    # 并将它们加载到当前进程的环境变量中(os.environ),
    # 这样后续就可以通过 os.getenv() 来访问这些变量了。
    # 如果项目根目录没有 .env 文件,则不会报错,只是不会加载任何变量。
    load_dotenv()

    # 兼容两种环境变量命名方式
    api_key = os.getenv("DASHSCOPE_API_KEY") or os.getenv("API_KEY")
    if not api_key:
        raise ValueError(
            "未找到 DASHSCOPE_API_KEY 或 API_KEY 环境变量,请先在 .env 或系统环境中配置后再运行。"
        )

    # LangChain 的 Tongyi 封装会自动从环境变量中读取 key,
    # 这里设置一份到 DASHSCOPE_API_KEY,确保兼容性。
    os.environ["DASHSCOPE_API_KEY"] = api_key

    # 课件中的示例使用 qwen-max,这里保持一致
    llm = Tongyi(model="qwen-max")
    return llm


def invoke_demo(llm: Tongyi) -> None:
    """
    演示使用 invoke 方法:一次性返回完整结果。
    """
    print("=" * 80)
    print("【示例1】使用 invoke 方法:一次性返回完整结果")
    print("-" * 80)

    prompt = "你是谁呀能做什么?"
    print(f"提示词:{prompt}")
    print("\n模型回复(一次性返回):")

    start_time = time.time()
    res = llm.invoke(prompt)
    elapsed_time = time.time() - start_time

    print(res)
    print(f"\n总耗时:{elapsed_time:.2f} 秒")
    print()


def stream_demo(llm: Tongyi) -> None:
    """
    演示使用 stream 方法:逐段返回结果,实现流式输出。
    """
    print("=" * 80)
    print("【示例2】使用 stream 方法:逐段返回结果,流式输出")
    print("-" * 80)

    prompt = "你是谁呀能做什么?"
    print(f"提示词:{prompt}")
    print("\n模型回复(流式输出):")

    start_time = time.time()
    res = llm.stream(input=prompt)

    # 流式打印每个 chunk
    full_response = []
    chunk_count = 0
    for chunk in res:
        chunk_count += 1
        full_response.append(chunk)
        # end="" 表示不换行,flush=True 表示立即刷新输出缓冲区
        print(chunk, end="", flush=True)

    elapsed_time = time.time() - start_time

    print(f"\n\n总耗时:{elapsed_time:.2f} 秒")
    print(f"共接收到 {chunk_count} 个数据块")
    print(f"完整回复长度:{len(''.join(full_response))} 字符")
    print()


def stream_comparison_demo(llm: Tongyi) -> None:
    """
    对比演示:展示流式输出和一次性输出的区别。
    """
    print("=" * 80)
    print("【示例3】对比演示:流式输出 vs 一次性输出")
    print("-" * 80)

    prompt = "请用中文详细介绍一下人工智能的发展历史,大约200字。"
    print(f"提示词:{prompt}\n")

    # 流式输出
    print("--- 流式输出(stream)---")
    print("开始时间:", time.strftime("%H:%M:%S", time.localtime()))
    print("输出内容:", end="", flush=True)

    start_time = time.time()
    res_stream = llm.stream(input=prompt)
    for chunk in res_stream:
        print(chunk, end="", flush=True)
    stream_time = time.time() - start_time

    print(f"\n流式输出耗时:{stream_time:.2f} 秒\n")

    # 一次性输出
    print("--- 一次性输出(invoke)---")
    print("开始时间:", time.strftime("%H:%M:%S", time.localtime()))
    print("输出内容:", end="", flush=True)

    start_time = time.time()
    res_invoke = llm.invoke(prompt)
    invoke_time = time.time() - start_time

    print(res_invoke)
    print(f"\n一次性输出耗时:{invoke_time:.2f} 秒")
    print()


def main() -> None:
    """
    主函数:演示如何使用 LangChain 实现通义大模型的流式输出。
    """
    print("=" * 80)
    print("LangChain 通义大模型流式输出示例")
    print("=" * 80)
    print()

    llm = init_llm()

    # 示例1:invoke 方法演示
    invoke_demo(llm)

    # 示例2:stream 方法演示
    stream_demo(llm)

    # 示例3:对比演示
    stream_comparison_demo(llm)

    print("=" * 80)
    print("演示结束")
    print("=" * 80)


if __name__ == "__main__":
    main()

运行代码

python AI_LLM_RAG_Agent_Dev/12_LangChain_Tongyi_Stream_Output.py

结果:

================================================================================
LangChain 通义大模型流式输出示例
================================================================================

================================================================================
【示例1】使用 invoke 方法:一次性返回完整结果
--------------------------------------------------------------------------------
提示词:你是谁呀能做什么?

模型回复(一次性返回):
您好!我是Qwen,是阿里云开发的一款超大规模语言模型。我被设计用来帮助用户生成各种类型的文本,如文章、故事、诗歌、故事等,并能够根据不同的场景和需求进行变换和扩展。此外,我还能够回答问题、提供信息查询、参与对话交流等,旨在为用户提供一个智能且自然的交互体验。无论是学习、工作还是娱乐方面的问题,我都会尽力为您提供帮助。有什么我可以帮到您的吗?

总耗时:8.28 秒

================================================================================
【示例2】使用 stream 方法:逐段返回结果,流式输出
--------------------------------------------------------------------------------
提示词:你是谁呀能做什么?

模型回复(流式输出):
您好,我是Qwen,是阿里云开发的一款超大规模语言模型。我能够生成各种类型的文本,如文章、故事、诗歌、故事等,并能够根据不同的场景和需求进行变换和扩展。此外,我还能够回答各种问题,提供信息查询服务,进行对话聊天等。如果您有任何需要帮助的地方,欢迎随时向我提问!

总耗时:5.85 秒
共接收到 20 个数据块
完整回复长度:130 字符

================================================================================
【示例3】对比演示:流式输出 vs 一次性输出
--------------------------------------------------------------------------------
提示词:请用中文详细介绍一下人工智能的发展历史,大约200字。

--- 流式输出(stream)---
开始时间: 11:10:19
输出内容:人工智能(AI)的发展历史可以追溯到20世纪50年代。1956年,达特茅斯会议上首次提出了“人工智能”这一术语,标志着该领域的正式诞生。早期的研究集中在逻辑推理和问题解决上,如1957年的通用问题求解器GPS。进入60-70年代,随着专家系统的兴起,AI开始应用于特定领域的问题解决。80年代见证了连接主义的复兴,即通过模仿人脑结构来构建神经网络模型。90年代至今,得益于计算能力的大幅提升及大数据时代的到来,机器学习特别是深度学习技术取得了突破性进展,推动了语音识别、图像处理等领域应用的快速发展。如今,AI正向着更加智能化、自适应的方向演进。
流式输出耗时:6.81 秒

--- 一次性输出(invoke)---
开始时间: 11:10:26
输出内容:人工智能(AI)的发展历史可以追溯到20世纪50年代。1956年,在达特茅斯会议上首次提出了“人工智能”这一术语,标志着该领域的正式诞生。早期研究主要集中在逻辑推理、问题解决等基础理论方面,并且在国际象棋等特定领域取得了初步成果。进入80年代后,随着专家系统的兴起,AI开始被应用于商业场景中。90年代以来,机器学习逐渐成为主流方向之一,特别是深度学习技术的突破性进展,极大地推动了语音识别、图像处理等领域的发展。近年来,AI已经渗透到了医疗健康、自动驾驶等多个行业,展现出广阔的应用前景。

一次性输出耗时:8.56 秒

================================================================================
演示结束
================================================================================

总结:LangChain有两种方法去调用模型,invoke一次性返回结果,stream逐段流式输出

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐