LangChain 阶段一教案
课程总体安排
课时分配
- 第一次课:环境搭建 + 核心概念 + 提示词模板 + LCEL基础(3小时)
- 第二次课:LCEL进阶 + 结构化输出 + 项目实战(3小时)
教学目标
知识目标:掌握 LangChain 核心概念,能使用 DeepSeek 构建基础 AI 应用能力目标:具备搭建提示词管道、处理结构化输出、调试链式应用的能力素养目标:培养工程化思维和模块化设计能力
第一次课:LangChain 基础与核心概念(3小时)
一、课程导入与环境搭建(30分钟)
1.1 LangChain 架构总览(10分钟)
设计图示:
|
传统方式: 用户输入 → 直接调用API → 文本输出 LangChain 方式: 用户输入 → 提示词模板 → 大模型 → 输出解析 → 结构化数据 ↓ 工具调用 ↓ 记忆管理 ↓ 智能体决策 |
核心价值:
- 模块化:像搭积木一样构建 AI 应用
- 生产就绪:内置调试、监控、优化工具
- 生态丰富:支持多种模型、数据库、工具
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() |
970

被折叠的 条评论
为什么被折叠?



