Home
Softono

Langchain Learning

Open source
233
Stars
32
Forks
3
Issues
1
Watchers
3 years
Last Commit

 About Langchain Learning

langchain学习笔记,包含langchain源码解读、langchain中使用中文模型、langchain实例等。

Platforms

Web Self-hosted

Links

Need Help Installing Langchain Learning?

We provide expert installation service for this software. Our team will install, configure, and secure Langchain Learning on your server. plans start at just $30.

Langchain Learning

View on GitHub

langchain-learning

langchain的学习笔记。依赖:

openai==0.27.8
langchian==0.0.225

和langchain相类似的一些工具:

文章

注意:由于langchain或langchain-ChatGLM的更新,可能导致部分源码和讲解的有所差异。

有的一些文章直接放的是一些链接,从网上收集整理而来。


  • langchain组件-数据连接(data connection)
  • langchain组件-模型IO(model IO)
  • langchain组件-链(chains)
  • langchain组件-代理(agents)
  • langchain组件-内存(memory)
  • langchain组件-回调(callbacks)
  • langchain中ChatOpenAI背后做了什么.md
  • langchain.load.serializable.py.md
  • langchain中的一些schema.md
  • langchain中是怎么调用chatgpt的接口的.md
  • langchain结构化输出背后的原理,md
  • langchain中memory的工作原理.md
  • langchain怎么确保输出符合道德期望.md
  • langchain中路由链LLMRouterChain的原理.md
  • langchain中的EmbeddingRouterChain原理.md
  • langchain集成GPTCache.md
  • langchain集成Mivus向量数据库.md
  • langchain中的StreamingStdOutCallbackHandler原理.md
  • pydantic中config的一些配置.md
  • pydantic中的Serializable和root_validator.md
  • python中常用的一些魔术方法.md
  • python的typing常用的类型.md
  • python中functools的partial的用法.md
  • python中inspect的signature用法.md
  • python中args和kwargs.md
  • 我为什么放弃了 LangChain? - 知乎 (zhihu.com)

目前基于langchain的中文项目有两个:

我们从中可以学到不少。

langchain-ChatGLM

中文例子

英文例子

prompt工程.md

一个优化的prompt对结果至关重要,感兴趣的可以去看看这个。

yzfly/LangGPT: LangGPT: Empowering everyone to become a prompt expert!🚀 Structured Prompt,结构化提示词。 (github.com):构建结构化的高质量prompt

langchain可能存在一些问题

虽然langchain给我们提供了一些便利,但是也存在一些问题:

  • 无法解决大模型基础技术问题,主要是prompt重用问题:首先很多大模型应用的问题都是大模型基础技术的缺陷,并不是LangChain能够解决的。其中核心的问题是大模型的开发主要工作是prompt工程。而这一点的重用性很低。但是,这些功能都需要非常定制的手写prompt。链中的每一步都需要手写prompt。输入数据必须以非常特定的方式格式化,以生成该功能/链步骤的良好输出。设置DAG编排来运行这些链的部分只占工作的5%,95%的工作实际上只是在提示调整和数据序列化格式上。这些东西都是不可重用的。

  • LangChain糟糕的抽象与隐藏的垃圾prompt造成开发的困难:简单说,就是LangChain的抽象工作不够好,所以很多步骤需要自己构建。而且LangChain内置的很多prompt都很差,不如自己构造,但是它们又隐藏了这些默认prompt。

  • LangChain框架很难debug尽管LangChain很多方法提供打印详细信息的参数,但是实际上它们并没有很多有价值的信息。例如,如果你想看到实际的prompt或者LLM查询等,都是十分困难的。原因和刚才一样,LangChain大多数时候都是隐藏了自己内部的prompt。所以如果你使用LangChain开发效果不好,你想去调试代码看看哪些prompt有问题,那就很难。

  • LangChain鼓励工具锁定:LangChain鼓励用户在其平台上进行开发和操作,但是如果用户需要进行一些LangChain文档中没有涵盖的工作流程,即使有自定义代理,也很难进行修改。这就意味着,一旦用户开始使用LangChain,他们可能会发现自己被限制在LangChain的特定工具和功能中,而无法轻易地切换到其他可能更适合他们需求的工具或平台。

以上内容来自:

有时候一些简单的任务,我们完全可以自己去实现相关的流程,这样每一部分都由我们自己把控,更易于修改。

使用langchain解决复杂任务

方法一:领域微调LLM

使用领域数据对LLM进行微调,受限于计算资源和模型参数的大小,而且模型会存在胡言乱语的情况。这里面涉及到一系列的问题:

  • 数据怎么获取,怎么进行数据清理。
  • 分词使用什么方式。
  • 模型采用什么架构,怎么训练,怎么评估模型。
  • 模型怎么进行有效推理,怎么进行部署。
  • 领域预训练、领域指令微调、奖励模型、结果对齐。

方法二:langchain + LLM + tools

基本思路:

1、用户提问:请对比下商品雅诗兰黛特润修护肌活精华露和SK-II护肤精华?

2、RouterChain问题路由,即使用哪种方式回答问题:(调用一次LLM)

  • RouterChain可以是一个LLM,也可以是一个embedding,去匹配到合适的解决方案,如果没有匹配到任何解决方案,则使用模型内部知识进行回答。
  • 这里匹配到商品对比这一问题,得到解决方案:(1)调用商品搜索工具得到每一个商品的介绍。(2)通过搜索结果对比这些商品。

3、使用Planner生成step:(调用一次LLM)

  • 根据解决方案生成合适的steps,比如:(1)搜索雅诗兰黛特润修护肌活精华露。(2)搜索SK-II护肤精华。(3)对比上述商品。

4、执行者Executer执行上述步骤:(调用steps次LLM,n是超参数表明调用的最大次数)

  • 需要提供工具,每个step的问题,需要调用llm生成每个工具的调用参数。
  • 调用工具获取结果。

5、对所有的结果进行汇总。(调用一次LLM)

方法三:langchain + LLM + 检索

相比于方案1,不使用工具,直接根据问题进行对数据库进行检索,然后对检索到的结果进行回答。

检索的方式可以是基于给定问题的关键字,使用ES工具从海量数据库中检索到可能存在答案的topk段落。把这topk个段落连同问题一起发送给LLM,进行回答。

检索的方式改成向量的形式,先对所有已知资料按照300个字切分成小的段落,然后对这些段落进行编码成向量,当用户提问时,把用户问题同样编码成向量,然后对这些段落进行检索,得到topk最相关的段落,把这topk个段落连同问题一起发送给LLM,进行回答。

图片

上述方法的优缺点:

领域微调LLM:需要耗费很多的人力收集领域内数据和问答对,需要耗费很多算力进行微调。

langchain + LLM + tools:是把LLM作为一个子的服务,LangChain作为计划者和执行者的大脑,合适的时机调用LLM,优点是解决复杂问题,缺点是不可靠。LLM生成根据问题和工具调用工具获取数据时不可靠。可以不能很好的利用工具。可能不能按照指令调用合适的工具,还可能设定计划差,难以控制。优点是:用于解决复杂的问题。

langchain + LLM + 检索:优点是现在的领域内主流问答结构,缺点:是根据问题对可能包含答案的段落检索时可能检索不准。不适用于复杂问答

总结:最大的问题还是LLM本身:

  • LLM输出的不可控性,会导致后续步骤出现偏差。
  • LLM的输入的context的长度问题:目前已经可以把长度推广到10亿以上了。
  • 训练一个LLM需要的成本:对于数据而言,除了人工收集整理外,也可以使用大模型进行生成;对于训练而言,目前也有不少基于参数有效微调的例子。
  • LLM的部署问题:也已经有不少加速推理的方法,比如量化、压缩、使用分布式进行部署、使用C++进行部署等。

LLM是整个系统的基座,目前还是有不少选择的余地的,网上开源了不少中文大语言模型,但大多都是6B/7B/13B的,要想有一个聪明的大脑,模型的参数量还是需要有保证的。

以上参考:https://mp.weixin.qq.com/s/FvRchiT0c0xHYscO_D-sdA

扩展

留出一些问题以待思考:可能和langchain相关,也可能和大模型相关

  • **怎么根据垂直领域的数据选择中文大模型?**1、是否可以商用。2、根据各评测的排行版。3、在自己领域数据上进行评测。4、借鉴现有的垂直领域模型的选择,比如金融大模型、法律大模型、医疗大模型等。

  • **数据的一个答案由一系列相连的句子构成,怎么对文本进行切分以获得完整的答案?**比如:

    怎么能够解决失眠?
    1、保持良好的心情;
    2、进行适当的训练。
    3、可适当使用药物。
    

    1、尽量将划分的文本的长度设置大一些。2、为了避免答案被分割,可以设置不同段之间可以重复一定的文本。3、检索时可返回前top_k个文档。4、融合查询出的多个文本,利用LLM进行总结。

  • 怎么构建垂直领域的embedding?

  • 怎么存储获得的embedding?

  • 如何引导LLM更好的思考? 可使用:chain of thoughts、self ask、ReAct,具体介绍可以看这一篇文章:https://zhuanlan.zhihu.com/p/622617292 实际上,langchain中就使用了ReAct这一策略。

参考

Introduction | 🦜️🔗 Langchain

API Reference — 🦜🔗 LangChain 0.0.229

https://mp.weixin.qq.com/s/FvRchiT0c0xHYscO_D-sdA

https://python.langchain.com.cn/docs/modules/agents/how_to/custom_llm_chat_agent