Langchain学习教案

部署运行你感兴趣的模型镜像

LangChain 阶段一教案

课程总体安排

课时分配

  1. 第一次课:环境搭建 + 核心概念 + 提示词模板 + LCEL基础(3小时)
  2. 第二次课:LCEL进阶 + 结构化输出 + 项目实战(3小时)

教学目标

知识目标:掌握 LangChain 核心概念,能使用 DeepSeek 构建基础 AI 应用能力目标:具备搭建提示词管道、处理结构化输出、调试链式应用的能力素养目标:培养工程化思维和模块化设计能力

第一次课:LangChain 基础与核心概念(3小时)

一、课程导入与环境搭建(30分钟)

1.1 LangChain 架构总览(10分钟)

设计图示

传统方式:

用户输入 → 直接调用API → 文本输出

LangChain 方式:

用户输入 → 提示词模板 → 大模型 → 输出解析 → 结构化数据

     ↓

   工具调用

     ↓ 

   记忆管理

     ↓

   智能体决策

核心价值

  1. 模块化:像搭积木一样构建 AI 应用
  2. 生产就绪:内置调试、监控、优化工具
  3. 生态丰富:支持多种模型、数据库、工具
1.2 环境搭建实战(20分钟)

完整步骤

步骤1:安装依赖

pip install langchain openai pydantic

步骤2:配置 DeepSeek API

# 1_environment_setup.py

import os

from langchain_openai import ChatOpenAI

# 方法1:环境变量(推荐)

# export DEEPSEEK_API_KEY="your-api-key"

# 方法2:代码设置(测试用)

os.environ['DEEPSEEK_API_KEY'] = 'your-api-key'

def setup_environment():

    """环境配置验证"""

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY"),

        temperature=0.7

    )

   

    # 测试连接

    response = model.invoke("请回复'环境配置成功'证明连接正常")

    print("🔧 环境测试:", response.content)

    return response

if __name__ == "__main__":

    setup_environment()

实验验证

python 1_environment_setup.py

# 预期输出:环境测试: 环境配置成功

二、提示词工程与模板设计(60分钟)

2.1 提示词模板基础(20分钟)

设计图示

静态提示词:

"请解释{概念}" → 填充 → "请解释人工智能"

动态模板:

系统角色 + 用户输入 → 格式化 → 完整提示词

实验代码

# 2_prompt_templates.py

from langchain.prompts import ChatPromptTemplate, PromptTemplate

from langchain_openai import ChatOpenAI

import os

def basic_prompt_demo():

    """基础提示词模板演示"""

   

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY")

    )

   

    # 1. 基础文本模板

    simple_template = PromptTemplate.from_template(

        "请用{style}风格解释{concept}"

    )

   

    # 2. 聊天模板(推荐)

    chat_template = ChatPromptTemplate.from_messages([

        ("system", "你是一个{role},请用{style}风格回答。"),

        ("human", "问题:{question}"),

        ("ai", "好的,我会以{style}风格回答。"),

        ("human", "{actual_question}")

    ])

   

    # 格式化提示词

    formatted = chat_template.invoke({

        "role": "资深技术专家",

        "style": "专业且简洁",

        "question": "等待你的问题...",

        "actual_question": "请解释云计算的三层服务模式"

    })

   

    print("=== 格式化后的提示词 ===")

    print(formatted.to_string())

   

    # 调用模型

    response = model.invoke(formatted)

    print("\n=== 模型回复 ===")

    print(response.content)

   

    return response

def multi_role_system():

    """多角色提示词系统"""

   

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY")

    )

   

    # 定义角色库

    roles = {

        "teacher": ChatPromptTemplate.from_messages([

            ("system", """你是一个耐心的教师,善于用比喻和例子解释复杂概念。

            针对{level}水平的学生,用他们能理解的方式讲解。"""),

            ("human", "请解释:{concept}")

        ]),

       

        "reviewer": ChatPromptTemplate.from_messages([

            ("system", """你是一个严格的代码审查专家。

            直接指出问题,给出具体改进方案。"""),

            ("human", "审查代码:{code}")

        ]),

       

        "storyteller": ChatPromptTemplate.from_messages([

            ("system", "你是一个生动的故事讲述者,用故事来阐述道理。"),

            ("human", "请用故事说明:{topic}")

        ])

    }

   

    def ask_role(role_name, **kwargs):

        """向指定角色提问"""

        if role_name not in roles:

            return "未知角色"

           

        prompt = roles[role_name].invoke(kwargs)

        response = model.invoke(prompt)

        return response.content

   

    # 测试多角色系统

    print("\n=== 教师角色 ===")

    print(ask_role("teacher", concept="人工智能", level="小学生"))

   

    print("\n=== 审查员角色 ===")

    sample_code = """

    def find_max(numbers):

        max_num = numbers[0]

        for i in range(1, len(numbers)):

            if numbers[i] > max_num:

                max_num = numbers[i]

        return max_num

    """

    print(ask_role("reviewer", code=sample_code))

   

    print("\n=== 故事讲述者 ===")

    print(ask_role("storyteller", topic="团队合作的重要性"))

if __name__ == "__main__":

    basic_prompt_demo()

    multi_role_system()

2.2 高级提示词技巧(40分钟)

实验代码

# 3_advanced_prompts.py

from langchain.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate

from langchain_openai import ChatOpenAI

import os

def few_shot_learning():

    """少样本学习演示"""

   

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY")

    )

   

    # 定义少样本示例

    examples = [

        {

            "input": "这个产品太棒了!",

            "output": "正面评价"

        },

        {

            "input": "服务很差,不会再来了。",

            "output": "负面评价"

        },

        {

            "input": "产品还行,但价格有点高。",

            "output": "中性评价"

        }

    ]

   

    # 创建少样本提示词模板

    example_prompt = ChatPromptTemplate.from_messages([

        ("human", "{input}"),

        ("ai", "{output}")

    ])

   

    few_shot_prompt = FewShotChatMessagePromptTemplate(

        example_prompt=example_prompt,

        examples=examples,

    )

   

    # 最终提示词

    final_prompt = ChatPromptTemplate.from_messages([

        ("system", "你是一个情感分析专家。根据示例判断用户输入的情感倾向。"),

        few_shot_prompt,

        ("human", "{user_input}")

    ])

   

    # 测试少样本学习

    test_inputs = [

        "我非常喜欢这个功能!",

        "质量太差了,很失望。",

        "还可以,没什么特别的感觉。"

    ]

   

    for user_input in test_inputs:

        prompt = final_prompt.invoke({"user_input": user_input})

        response = model.invoke(prompt)

        print(f"输入: {user_input}")

        print(f"情感分析: {response.content}")

        print("-" * 40)

def dynamic_context_system():

    """动态上下文系统"""

   

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY")

    )

   

    def create_contextual_assistant(context_type, user_data):

        """创建基于上下文的助手"""

       

        contexts = {

            "interview": {

                "role": "技术面试官",

                "style": "专业且具有挑战性",

                "goal": "评估技术能力和问题解决思维"

            },

            "tutor": {

                "role": "私人教师",

                "style": "耐心且鼓励性",

                "goal": "帮助学生理解和掌握知识"

            },

            "consultant": {

                "role": "业务顾问",

                "style": "专业且务实",

                "goal": "提供可行的解决方案"

            }

        }

       

        if context_type not in contexts:

            return "不支持的上下文类型"

           

        context = contexts[context_type]

       

        prompt = ChatPromptTemplate.from_messages([

            ("system", """你是{role},风格{style}。

            你的目标是:{goal}

           

            用户信息:{user_info}"""),

            ("human", "{question}")

        ])

       

        chain = prompt | model

       

        def ask_question(question):

            response = chain.invoke({

                "role": context["role"],

                "style": context["style"],

                "goal": context["goal"],

                "user_info": user_data,

                "question": question

            })

            return response.content

       

        return ask_question

   

    # 测试不同上下文

    print("=== 技术面试 ===")

    interviewer = create_contextual_assistant(

        "interview",

        "应聘高级Python开发工程师,5年经验"

    )

    print(interviewer("请解释Python的GIL全局解释器锁"))

   

    print("\n=== 私人教师 ===")

    tutor = create_contextual_assistant(

        "tutor",

        "编程初学者,刚开始学习Python" 

    )

    print(tutor("请用简单的方式解释变量和数据类型"))

if __name__ == "__main__":

    few_shot_learning()

    dynamic_context_system()

三、LCEL 链式编程基础(60分钟)

3.1 LCEL 核心概念(20分钟)

设计图示

传统方式:

prompt → model → output_parser (分步调用)

LCEL 方式:

prompt | model | output_parser (管道操作)

实验代码

# 4_lcel_fundamentals.py

from langchain.prompts import ChatPromptTemplate

from langchain_openai import ChatOpenAI

from langchain.schema.output_parser import StrOutputParser

import os

def basic_chain_operations():

    """基础链操作"""

   

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY")

    )

   

    # 创建多个链

    translator_chain = ChatPromptTemplate.from_template(

        "将以下文本翻译为{language}:{text}"

    ) | model | StrOutputParser()

   

    summarizer_chain = ChatPromptTemplate.from_template(

        "用一句话总结以下内容:{content}" 

    ) | model | StrOutputParser()

   

    explainer_chain = ChatPromptTemplate.from_messages([

        ("system", "你是一个{expert_type},请用通俗语言解释复杂概念。"),

        ("human", "请解释:{concept}")

    ]) | model | StrOutputParser()

   

    # 测试链

    print("=== 翻译链 ===")

    translation = translator_chain.invoke({

        "language": "英语",

        "text": "今天天气真好,适合出去玩"

    })

    print(translation)

   

    print("\n=== 总结链 ===")

    summary = summarizer_chain.invoke({

        "content": "人工智能是计算机科学的一个分支,旨在创造能够执行通常需要人类智能的任务的机器。这些任务包括学习、推理、问题解决、感知和语言理解。"

    })

    print(summary)

   

    print("\n=== 解释链 ===")

    explanation = explainer_chain.invoke({

        "expert_type": "技术专家",

        "concept": "区块链技术"

    })

    print(explanation)

def conditional_chains():

    """条件链演示"""

   

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY")

    )

   

    # 分类链

    classifier_chain = ChatPromptTemplate.from_template("""

    判断以下问题属于哪个类别(编程/数学/生活/其他):

   

    问题:{question}

   

    只需回复类别名称:

    """) | model | StrOutputParser()

   

    # 专业回答链

    def create_expert_chain(category):

        """根据类别创建专业回答链"""

        experts = {

            "编程": "资深程序员",

            "数学": "数学教授",

            "生活": "生活顾问",

            "其他": "百科全书"

        }

       

        expert_role = experts.get(category, "助手")

       

        chain = ChatPromptTemplate.from_messages([

            ("system", f"你是{expert_role},请专业地回答{category}类问题。"),

            ("human", "{question}")

        ]) | model | StrOutputParser()

       

        return chain

   

    def smart_qa_system(question):

        """智能问答系统"""

        print(f"❓ 问题: {question}")

       

        # 1. 分类

        category = classifier_chain.invoke({"question": question})

        print(f"🏷️ 分类: {category}")

       

        # 2. 专业回答

        expert_chain = create_expert_chain(category)

        answer = expert_chain.invoke({"question": question})

        print(f"💡 回答: {answer}")

       

        return answer

   

    # 测试智能问答

    test_questions = [

        "Python的装饰器有什么作用?",

        "如何计算圆的面积?",

        "怎样提高睡眠质量?",

        "火星上有没有生命?"

    ]

   

    for question in test_questions:

        smart_qa_system(question)

        print("-" * 50)

if __name__ == "__main__":

    basic_chain_operations()

    conditional_chains()

3.2 链的组合与调试(40分钟)

实验代码

# 5_chain_composition.py

from langchain.prompts import ChatPromptTemplate

from langchain_openai import ChatOpenAI

from langchain.schema.output_parser import StrOutputParser

import os

def multi_step_workflow():

    """多步骤工作流"""

   

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY")

    )

   

    # 步骤1:分析问题

    analyzer_chain = ChatPromptTemplate.from_template("""

    分析以下技术问题的核心难点:

   

    问题:{problem}

   

    核心难点分析:

    """) | model | StrOutputParser()

   

    # 步骤2:生成解决方案

    solution_chain = ChatPromptTemplate.from_template("""

    针对以下难点:

    {analysis}

   

    为问题提供解决方案:

    问题:{problem}

   

    解决方案:

    """) | model | StrOutputParser()

   

    # 步骤3:评估方案

    evaluator_chain = ChatPromptTemplate.from_template("""

    评估以下技术方案的优缺点:

   

    问题:{problem}

    方案:{solution}

   

    优缺点分析:

    """) | model | StrOutputParser()

   

    def problem_solving_workflow(problem):

        """问题解决工作流"""

        print(f"🔧 处理问题: {problem}")

       

        print("\n📊 步骤1: 问题分析...")

        analysis = analyzer_chain.invoke({"problem": problem})

        print(f"分析结果: {analysis}")

       

        print("\n💡 步骤2: 生成方案...")

        solution = solution_chain.invoke({

            "analysis": analysis,

            "problem": problem

        })

        print(f"解决方案: {solution}")

       

        print("\n⚖️ 步骤3: 方案评估...")

        evaluation = evaluator_chain.invoke({

            "problem": problem,

            "solution": solution

        })

        print(f"评估结果: {evaluation}")

       

        return {

            "analysis": analysis,

            "solution": solution,

            "evaluation": evaluation

        }

   

    # 测试工作流

    technical_problems = [

        "如何优化Python代码的执行速度?",

        "数据库查询缓慢如何排查和优化?",

        "如何设计一个高可用的微服务架构?"

    ]

   

    for problem in technical_problems:

        result = problem_solving_workflow(problem)

        print("=" * 60)

def debugging_chains():

    """链的调试技巧"""

   

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY")

    )

   

    # 调试装饰器

    def debug_step(step_name):

        """创建调试步骤"""

        def debug_wrapper(input_data):

            print(f"🔍 [{step_name}] 输入: {type(input_data)}")

            if hasattr(input_data, 'content'):

                print(f"   内容: {input_data.content[:100]}...")

            elif isinstance(input_data, str):

                print(f"   内容: {input_data[:100]}...")

            else:

                print(f"   数据: {input_data}")

            return input_data

        return debug_wrapper

   

    # 构建可调试的链

    prompt = ChatPromptTemplate.from_template("""

    处理以下任务:

   

    任务:{task}

   

    请提供详细的步骤说明:

    """)

   

    # 带调试的链

    debug_chain = (

        prompt

        | debug_step("1.提示词格式化")

        | model

        | debug_step("2.模型输出")

        | StrOutputParser()

        | debug_step("3.最终结果")

    )

   

    # 测试调试链

    result = debug_chain.invoke({

        "task": "如何学习一门新的编程语言"

    })

   

    print(f"\n🎯 最终结果: {result}")

def batch_processing():

    """批量处理演示"""

   

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY")

    )

   

    # 创建批处理链

    processor_chain = ChatPromptTemplate.from_template("""

    处理以下文本:

   

    文本:{text}

   

    请进行以下处理:

    1. 提取关键信息

    2. 总结主要内容 

    3. 评估文本质量(1-10分)

   

    处理结果:

    """) | model | StrOutputParser()

   

    def batch_process_texts(texts):

        """批量处理文本"""

        results = []

       

        for i, text in enumerate(texts, 1):

            print(f"处理第 {i}/{len(texts)} 个文本...")

           

            try:

                result = processor_chain.invoke({"text": text})

                results.append(result)

                print(f"✅ 完成: {result[:50]}...")

            except Exception as e:

                print(f"❌ 错误: {e}")

                results.append(None)

               

            print("-" * 30)

       

        return results

   

    # 测试批量处理

    sample_texts = [

        "人工智能是当前科技发展的热点领域,深度学习技术在图像识别、自然语言处理等方面取得了突破性进展。",

        "区块链技术通过去中心化的方式确保数据安全,比特币是区块链技术的第一个成功应用。",

        "云计算提供了按需获取计算资源的能力,大大降低了企业的IT成本。"

    ]

   

    print("🚀 开始批量处理...")

    batch_results = batch_process_texts(sample_texts)

   

    print("\n📊 批量处理完成!")

    for i, result in enumerate(batch_results, 1):

        print(f"结果 {i}: {result}")

if __name__ == "__main__":

    multi_step_workflow()

    debugging_chains()

    batch_processing()

四、第一次课综合实战(30分钟)

实验代码

# 6_integrated_practice.py

from langchain.prompts import ChatPromptTemplate

from langchain_openai import ChatOpenAI

from langchain.schema.output_parser import StrOutputParser

import os

def smart_teaching_assistant():

    """智能教学助手综合实战"""

   

    model = ChatOpenAI(

        model="deepseek-chat",

        openai_api_base="https://api.deepseek.com/v1",

        openai_api_key=os.getenv("DEEPSEEK_API_KEY")

    )

   

    # 1. 知识点解释链

    concept_explainer = ChatPromptTemplate.from_messages([

        ("system", """你是一个{expert_type},擅长用{explanation_style}的方式解释概念。

        针对{audience}受众,调整解释的深度和方式。"""),

        ("human", "请解释:{concept}")

    ]) | model | StrOutputParser()

   

    # 2. 示例生成链

    example_generator = ChatPromptTemplate.from_template("""

    为以下概念提供{example_count}个{example_type}例子:

   

    概念:{concept}

   

    例子:

    """) | model | StrOutputParser()

   

    # 3. 练习创建链

    exercise_creator = ChatPromptTemplate.from_template("""

    为以下概念创建{exercise_count}个{difficulty}难度的练习题:

   

    概念:{concept}

   

    练习题:

    """) | model | StrOutputParser()

   

    def teach_concept(concept, expert_type="教师", audience="初学者",

                     explanation_style="生动有趣", example_count=3,

                     example_type="生活化", exercise_count=2, difficulty="基础"):

        """完整的概念教学流程"""

       

        print(f"🎓 教学主题: {concept}")

        print("=" * 50)

       

        # 解释概念

        print("\n📖 概念解释:")

        explanation = concept_explainer.invoke({

            "expert_type": expert_type,

            "explanation_style": explanation_style,

            "audience": audience,

            "concept": concept

        })

        print(explanation)

       

        # 生成例子

        print(f"\n🎯 {example_count}个{example_type}例子:")

        examples = example_generator.invoke({

            "concept": concept,

            "example_count": example_count,

            "example_type": example_type

        })

        print(examples)

       

        # 创建练习

        print(f"\n📝 {exercise_count}个{difficulty}练习题:")

        exercises = exercise_creator.invoke({

            "concept": concept,

            "exercise_count": exercise_count,

            "difficulty": difficulty

        })

        print(exercises)

       

        return {

            "explanation": explanation,

            "examples": examples,

            "exercises": exercises

        }

   

    # 交互式教学系统

    def interactive_teaching():

        """交互式教学系统"""

       

        print("🤖 智能教学助手")

        print("=" * 30)

       

        while True:

            print("\n请选择教学模式:")

            print("1. 快速学习(默认配置)")

            print("2. 自定义学习")

            print("3. 退出系统")

           

            choice = input("请选择 (1-3): ").strip() or "1"

           

            if choice == "1":

                concept = input("请输入要学习的概念: ").strip()

                if concept:

                    teach_concept(concept)

                   

            elif choice == "2":

                concept = input("学习概念: ").strip()

                expert_type = input("专家类型 (默认: 教师): ").strip() or "教师"

                audience = input("受众水平 (默认: 初学者): ").strip() or "初学者"

                explanation_style = input("解释风格 (默认: 生动有趣): ").strip() or "生动有趣"

                example_count = int(input("例子数量 (默认: 3): ").strip() or "3")

                example_type = input("例子类型 (默认: 生活化): ").strip() or "生活化"

                exercise_count = int(input("练习题数量 (默认: 2): ").strip() or "2")

                difficulty = input("难度 (默认: 基础): ").strip() or "基础"

               

                if concept:

                    teach_concept(

                        concept, expert_type, audience, explanation_style,

                        example_count, example_type, exercise_count, difficulty

                    )

                   

            elif choice == "3":

                print("谢谢使用,再见!")

                break

            else:

                print("无效选择,请重新输入")

   

    return interactive_teaching

if __name__ == "__main__":

    assistant = smart_teaching_assistant()

    assistant()

您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值