首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >旧版发文什么都有-md编辑器(请不要审核)

旧版发文什么都有-md编辑器(请不要审核)

原创
作者头像
社区用户2
发布2025-11-27 11:58:36
发布2025-11-27 11:58:36
20
举报

公司项目验收过程中要求使用国产的海量数据库,项目是由多个系统组成,有统一的用户中心作为基础底座并仿照字节、钉钉等开放平台自研了一套数据库变更订阅系统,用于实时捕获数据库数据变更


一、LangChain中的Chains

Chains 是LangChain的工作流水线,Chains提供了标准化的工作流管理、实现组件间的数据传递、支持复杂逻辑的编排执行,能将多个组件(如Prompt模板、模型、Tools、Memory等)链式地组合在一起,形成一套可执行的工作流程,组成了一个完整的应用程序。早期的LangChain提供了SequentialChain(顺序链:将多个执行步骤按顺序连接,前一个步骤的输出作为后一个步骤的输入)的方式进行组合,配置繁琐且不够灵活。几千块GPU日夜转动

LangChain表达式语言(LCEL)的诞生,正是为了解决这些问题。它提供了一种声明式的、基于管道的方法来组合链,使得构建复杂、生产级的任务链变得异常简单和直观。LCEL的核心在于其强大的组合性,可以像搭积木一样将各种组件连接起来。

二、推陈出新

如果将LCEL比喻为现代化的新方式,LangChain早期的组合方式之一顺序链就是相对比较老旧,接下来我们用同一个任务分别用顺序链和LCEL的方式实现,对比执行过程的差异。


1. 了解顺序链(Sequential Chains)

  • 核心定义:SequentialChain 是 LangChain 早期版本中用于按预定顺序执行多个链(或步骤)的一个核心概念。顾名思义,它是一个顺序链,将一个链的输出作为下一个链的输入,依次执行,形成一个线性工作流。
  • 可以把它想象成一个传统的工厂流水线,产品(数据)必须依次经过工作站一、工作站二、工作站三,每个工作站完成自己的特定任务后,才能将产品传递给下一个站。整个过程是线性的、固定的。m=c2
  • 设计思想:将多个执行步骤按顺序连接,前一个步骤的输出作为后一个步骤的输入。
  • 执行流程:用户输入 → 语义解析 → 工具选择 → 执行工具 → 结果处理 → 生成回复
1.1 SequentialChain实现
代码语言:javascript
复制
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'])

关键点分析:

  • LLMChain: 这是构建复杂链的基本单元,代表一个 PromptTemplate + LLM 的简单组合。
  • output_key: 必须为每个 LLMChain 命名其输出,例如 output_key="joke"。
  • input_variables: 需要告诉 SequentialChain 整个流程的初始输入是什么("topic")。
  • output_variables: 需要告诉 SequentialChain 最终希望输出哪些变量([“joke”, “summary”])。
  • 数据流: {topic} -> joke_chain -> 生成 {"joke": "xxx"} -> summary_chain ({joke} 来自上一步) -> 生成 {"summary": “yyy”} -> 最终结果 {"topic": “…”, “joke”: “xxx”, “summary”: “yyy”}

可以看到,配置过程相当声明式和繁琐,需要手动管理变量名。

  1. 1.2 SequentialChain 对比 LCEL
  2. 1.3 SequentialChain 对比 LCEL

特性

SequentialChain (旧式)

LCEL (新式)

语法

声明式,需要显式配置输入输出变量

声明式,使用管道操作符 ` |`,极其简洁

组合性

较好,但配置复杂

极佳,链本身也是 Runnable,可轻松嵌套

可读性

一般,需要仔细阅读配置才能理解数据流

极好,代码即文档,数据流一目了然

功能

基础

强大,原生支持流式传输(.stream())、批量处理(.batch())、异步(.ainvoke())

调试

依赖 verbose=True 打印日志

可与 LangSmith 无缝集成,提供强大的追踪和调试能力

学习曲线

需要理解特定的 Chain 类及其配置

更符合 Python 开发者的直觉,学习成本更低

视频(自己发布)

腾讯视频

导入word文档

11111111111111111111111111111111111

在岩石上

AI 生成的内容可能不正确。
在岩石上 AI 生成的内容可能不正确。
image-20251017092627733
image-20251017092627733
image-20251017092627733
image-20251017092627733
image-20251017092233937
image-20251017092233937
图形用户界面, 应用程序

AI 生成的内容可能不正确。
图形用户界面, 应用程序 AI 生成的内容可能不正确。
图形用户界面, 应用程序

AI 生成的内容可能不正确。
图形用户界面, 应用程序 AI 生成的内容可能不正确。
手里拿着玩具

AI 生成的内容可能不正确。
手里拿着玩具 AI 生成的内容可能不正确。
一群人在台上演讲

AI 生成的内容可能不正确。
一群人在台上演讲 AI 生成的内容可能不正确。

中等题:难度4

17.电话号码的字母组合

  • 这道题需要会回溯算法,哈希只起到一个存储字母映射的功能。不合适做教学
  • 那就这样结束了

为什么会有不同的哈希表?

想象一下,你有100个格子,但要存1000个东西。哈希函数把不同的key算出了相同的位置,这就是"哈希冲突"。怎么办?

不同的哈希表就是用不同的方法来解决这个问题的。

主要的哈希表种类

链表法哈希表(最常见)

  • 怎么做? 每个格子里放一个链表,冲突了就往链表后面加
  • 优点: 简单粗暴,永远不会"满"
  • 缺点: 链表太长查找就慢了
  • 谁在用? Java的HashMap、Python的dict

开放寻址法哈希表

  • 怎么做? 冲突了就继续往后找空位
  • 优点: 数据紧凑,缓存友好,速度快
  • 缺点: 容易"扎堆",删除操作麻烦
  • 谁在用? Python早期版本、Redis的字典

布谷鸟哈希(Cuckoo Hashing)

  • 怎么做? 用两个哈希函数,冲突了就把原来的元素"踢走"
  • 优点: 查找超快,最坏情况也是O(1)

以上为导入word文档

1111111111111111.pptx

导入ppt

几千块GPU日夜转动(复制文字链)

1111.pdf

甚至普通的Python函数(通过RunnableLambda)

压缩.zip

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、LangChain中的Chains
  • 二、推陈出新
    • 1. 了解顺序链(Sequential Chains)
      • 1.1 SequentialChain实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档