公司项目验收过程中要求使用国
产的海量数据库,项目是由多个系统组成,有统一的用户中心作为基础底座并仿照字节、钉钉等开放平台自研了一套数据库变更订阅系统,用于实时捕获数据库数据变更
Chains 是LangChain的工作流水线,Chains提供了标准化的工作流管理、实现组件间的数据传递、支持复杂逻辑的编排执行,能将多个组件(如Prompt模板、模型、Tools、Memory等)链式地组合在一起,形成一套可执行的工作流程,组成了一个完整的应用程序。早期的LangChain提供了SequentialChain(顺序链:将多个执行步骤按顺序连接,前一个步骤的输出作为后一个步骤的输入)的方式进行组合,配置繁琐且不够灵活。几千块GPU日夜转动
LangChain表达式语言(LCEL)的诞生,正是为了解决这些问题。它提供了一种声明式的、基于管道的方法来组合链,使得构建复杂、生产级的任务链变得异常简单和直观。LCEL的核心在于其强大的组合性,可以像搭积木一样将各种组件连接起来。
如果将LCEL比喻为现代化的新方式,LangChain早期的组合方式之一顺序链就是相对比较老旧,接下来我们用同一个任务分别用顺序链和LCEL的方式实现,对比执行过程的差异。
核心概念。顾名思义,它是一个顺序链,将一个链的输出作为下一个链的输入,依次执行,形成一个线性工作流。
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SequentialChain
from langchain_core.output_parsers import StrOutputParser
from langchain_community.llms import Tongyi # 导入通义千问Tongyi模型
import dashscope
import os
# 从环境变量获取 dashscope 的 API Key
api_key = os.environ.get('DASHSCOPE_API_KEY')
dashscope.api_key = api_key
# 注意:这是旧式的写法,用于对比和理解。新项目强烈建议使用LCEL。
# 1. 创建模型实例
llm = Tongyi(model_name="qwen-turbo", dashscope_api_key=api_key, stream=True)
# 2. 创建第一个链:生成笑话
joke_template = """你是一个喜剧演员。请讲一个关于{topic}的笑话。"""
joke_prompt = PromptTemplate.from_template(joke_template)
# LLMChain 是旧式的单步骤链
joke_chain = LLMChain(
llm=llm,
prompt=joke_prompt,
output_key="joke" # 指定这个链的输出存储在一个叫 "joke" 的变量中
)
# 3. 创建第二个链:总结笑话
summary_template = """用一句话总结以下这个笑话:{joke}"""
summary_prompt = PromptTemplate.from_template(summary_template)
summary_chain = LLMChain(
llm=llm,
prompt=summary_prompt,
output_key="summary" # 指定这个链的输出存储在一个叫 "summary" 的变量中
)
# 4. 创建顺序链,将两个链组合起来
overall_chain = SequentialChain(
chains=[joke_chain, summary_chain], # 按顺序执行的链列表
input_variables=["topic"], # 整个SequentialChain的初始输入变量
output_variables=["joke", "summary"], # 整个SequentialChain的最终输出变量
verbose=True # 打印详细执行日志,便于调试
)
# 5. 执行这个顺序链
result = overall_chain.invoke({"topic": "程序员"})
print("生成的笑话:\n", result['joke'])
print("\n笑话总结:\n", result['summary'])关键点分析:
可以看到,配置过程相当声明式和繁琐,需要手动管理变量名。
特性 | SequentialChain (旧式) | LCEL (新式) |
|---|---|---|
语法 | 声明式,需要显式配置输入输出变量 | 声明式,使用管道操作符 ` |`,极其简洁 |
组合性 | 较好,但配置复杂 | 极佳,链本身也是 Runnable,可轻松嵌套 |
可读性 | 一般,需要仔细阅读配置才能理解数据流 | 极好,代码即文档,数据流一目了然 |
功能 | 基础 | 强大,原生支持流式传输(.stream())、批量处理(.batch())、异步(.ainvoke()) |
调试 | 依赖 verbose=True 打印日志 | 可与 LangSmith 无缝集成,提供强大的追踪和调试能力 |
学习曲线 | 需要理解特定的 Chain 类及其配置 | 更符合 Python 开发者的直觉,学习成本更低 |
视频(自己发布)

腾讯视频
导入word文档
11111111111111111111111111111111111











中等题:难度4
为什么会有不同的哈希表?
想象一下,你有100个格子,但要存1000个东西。哈希函数把不同的key算出了相同的位置,这就是"哈希冲突"。怎么办?
不同的哈希表就是用不同的方法来解决这个问题的。
主要的哈希表种类
链表法哈希表(最常见)
开放寻址法哈希表
布谷鸟哈希(Cuckoo Hashing)
以上为导入word文档
导入ppt
几千块GPU日夜转动(复制文字链)
甚至普通的Python函数(通过RunnableLambda)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。