langChain 基础 04 - 模型链
本文介绍使用 langchain 构建模型链的过程
前面在使用 llm 时,通常需要先构建 prompt,然后再传递到 llm,这还是一个 llm 的情况下,假设使用多个 llm,处理流程就很复杂,langchian 提供 “模型链 (Chain)” 组件,将 prompt、llm 链接起来,完成更复杂的 llm 应用
1 | from langchain import chains |
1 | ['APIChain', 'OpenAPIEndpointChain', 'AnalyzeDocumentChain', 'MapReduceDocumentsChain', 'MapRerankDocumentsChain', 'ReduceDocumentsChain', 'RefineDocumentsChain', 'StuffDocumentsChain', 'ConstitutionalChain', 'ConversationChain', 'ChatVectorDBChain', 'ConversationalRetrievalChain', 'FlareChain', 'ArangoGraphQAChain', 'GraphQAChain', 'GraphCypherQAChain', 'FalkorDBQAChain', 'HugeGraphQAChain', 'KuzuQAChain', 'NebulaGraphQAChain', 'NeptuneOpenCypherQAChain', 'NeptuneSparqlQAChain', 'OntotextGraphDBQAChain', 'GraphSparqlQAChain', 'LLMChain', 'LLMCheckerChain', 'LLMMathChain', 'LLMRequestsChain', 'LLMSummarizationCheckerChain', 'load_chain', 'MapReduceChain', 'OpenAIModerationChain', 'NatBotChain', 'create_citation_fuzzy_match_chain', 'create_extraction_chain', 'create_extraction_chain_pydantic', 'create_qa_with_sources_chain', 'create_qa_with_structure_chain', 'create_tagging_chain', 'create_tagging_chain_pydantic', 'QAGenerationChain', 'QAWithSourcesChain', 'RetrievalQAWithSourcesChain', 'VectorDBQAWithSourcesChain', 'create_retrieval_chain', 'LLMRouterChain', 'MultiPromptChain', 'MultiRetrievalQAChain', 'MultiRouteChain', 'RouterChain', 'SequentialChain', 'SimpleSequentialChain', 'create_sql_query_chain', 'load_summarize_chain', 'TransformChain'] |
Langchian 提供较多 chains, 选择部分类构建类图如下,可以看出基类是 Chain,下文以 LLMChain、SequentialChain、LLMRouterChain 说明路由链的作用
classDiagram
Chain <|-- LLMChain
BaseRetrievalQA <|-- RetrievalQA
Chain <|-- BaseRetrievalQA
Chain <|-- RouterChain
RouterChain <|-- LLMRouterChain
Chain <|-- SequentialChain
LLMChain
1 | from langchain.chains import LLMChain |
1 | {'product': '大号床单套装', 'text': '为一家专注于制造大号床单套装的公司命名时,可以从以下几个方面考虑:\n\n1. **强调产品特点**:可以使用一些能够反映产品尺寸、品质或用途的名字。例如,“巨宅家居”、“宽舒寝享”等。\n\n2. **品牌定位和文化**:如果公司的理念是提供奢华舒适的睡眠体验,那么可以选择像“贵族寝居”这样的名称;若注重环保与可持续发展,则可以考虑“绿织家”。\n\n3. **易于记忆且具象化**:选择一个简单、朗朗上口的名字有助于品牌传播。比如,“床海拾光”、“大美卧间”等。\n\n4. **地域性元素**:如果公司有特定的市场定位或希望突出地方特色,可以考虑使用相关词汇。如“华夏寝尚”(如果目标市场主要在中国)。\n\n5. **创意与情感连接**:创造一个独特的名称,让人联想到品质、舒适或是梦想中的居住空间。\n\n基于以上几点,这里提供几个建议的名字作为参考:\n- 宽舒良寐\n- 大床盛宴\n- 巨宅寝居\n- 绿织家园\n- 床海拾光\n\n请注意,最终选择的公司名称还需确保不侵犯他人商标权益,并通过相关注册流程。'} |
顺序链 (SequentialChains)
1 | from langchain.chains import SimpleSequentialChain |
1 | > Entering new SimpleSequentialChain chain... |
当只有一个输入和一个输出时,简单顺序链(SimpleSequentialChain)即可实现。当有多个输入或多个输出时,我们则需要使用顺序链(SequentialChain)来实现
1 | import pandas as pd |
1 | > Entering new SequentialChain chain... |
路由链
以上例子的所有链都接受输入,假设要实现根据用户输入选择执行的链,应该如何做呢?
通过定义路由器实现选择链路,路由器通过两个组件实现:
- 路由链(Router Chain):路由器链本身,负责选择要调用的下一个链,本身也是 LLM,通过分析输入与 destination_chains 各链路描述的差异,确定选择的链路
- destination_chains:路由器链可以路由到的链
1 | from langchain.chains.router import MultiPromptChain #导入多提示链 |
对提示模板进行命名和描述,目的是为每个链路增加描述信息,后续 LLM 根据这些信息和用户输入比较,选择要执行的链路
1 | prompt_infos = [ |
基于提示模版信息创建相应目标链,目标链是由路由链调用的链,每个目标链都是一个语言模型链
1 | destination_chains = {} |
定义默认目标链路,除了目标链之外,我们还需要一个默认目标链。这是一个当路由器无法决定使用哪个子链时调用的链。在上面的示例中,当输入问题与物理、数学、历史或计算机科学无关时,可能会调用它。
1 | default_prompt = ChatPromptTemplate.from_template("{input}") |
通过多提示模板路构建模板路由链路,实际上它是 LLM 根据用户输入,在可选输出内选择一个输出(或者默认输出)
1 | # 多提示路由模板 |
构建整体链路
1 | #多提示链 |
1 | > Entering new MultiPromptChain chain... |
1 | response=chain.run("2+2等于多少?") |
1 | > Entering new MultiPromptChain chain... |