golang 网站开发 开源青羊建站报价
2026/1/16 18:15:49 网站建设 项目流程
golang 网站开发 开源,青羊建站报价,公司网站制作开发公司,centos wordpress 5.5LangChain实战快速入门笔记#xff08;三#xff09;–LangChain使用之Chains 文章目录LangChain实战快速入门笔记#xff08;三#xff09;--LangChain使用之Chains一、Chains的基本使用1.Chain的基本概念2.LCEL 及其基本构成3.Runnable3.1 为什么需要统一调用方式#x…LangChain实战快速入门笔记三–LangChain使用之Chains文章目录LangChain实战快速入门笔记三--LangChain使用之Chains一、Chains的基本使用1.Chain的基本概念2.LCEL 及其基本构成3.Runnable3.1 为什么需要统一调用方式3.2 LCEL解决方案3.3 使用举例二、传统Chain的使用1.基础链LLMChain1.1 使用说明1.2 主要步骤1.3 参数说明举例1举例2verbose参数使用使用ChatPromptTemplate。2. 顺序链之 SimpleSequentialChain2.1 说明2.2 使用举例3. 顺序链之SequentialChain3.1 说明3.2 使用举例3.3 顺序链使用场景4. 数学链 LLMMathChain (了解)5. 路由链 RouterChain (了解)6. 文档链 StuffDocumentsChain(了解)三、基于LCEL构建的Chains的类型1. create_sql_query_chain2. create_stuff_documents_chain(了解)总结一、Chains的基本使用1.Chain的基本概念Chain: 链用于将多个组件提示模板、LLM 模型、记忆、工具等连接起来形成可复用的工作流完成复杂的任务。Chain 的核心思想通过组合不同的模块化单元实现比单一组件更强大的功能。比如• 将LLM与Prompt Template提示模板结合• 将LLM与输出解析器结合• 将LLM与外部数据结合例如用于问答• 将LLM与长期记忆结合例如用于聊天历史记录• 通过将第一个 LLM的输出作为第二个 LLM的输入…将多个 LLM 按顺序结合在一起2.LCEL 及其基本构成使用LCEL可以构造出结构最简单的Chain。LangChain表达式语言LCELLangChain Expression Language是一种声明式方法可以轻松地将多个组件链接成 AI 工作流。它通过Python原生操作符如管道符|将组件连接成可执行流程显著简化了AI应用的开发。**LCEL的基本构成**提示Prompt 模型Model 输出解析器OutputParser即# 在这个链条中用户输入被传递给提示模板然后提示模板的输出被传递给模型然后模型的输出被传递给输出解析器。chainprompt|model|output_parser chain.invoke({input:Whats your name?})•PromptPrompt 是一个 BasePromptTemplate这意味着它接受一个模板变量的字典并生成一个PromptValue。PromptValue 可以传递给 LLM它以字符串作为输入或 ChatModel它以消息序列作为输入。•Model将 PromptValue 传递给 model。如果我们的 model 是一个 ChatModel这意味着它将输出一个BaseMessage。•OutputParser将 model 的输出传递给 output_parser它是一个 BaseOutputParser意味着它可以接受字符串或 BaseMessage 作为输入。•chain我们可以使用|运算符轻松创建这个 Chain。|运算符在 LangChain 中用于将两个元素组合在一起。•invoke所有 LCEL 对象都实现了Runnable协议保证一致的调用方式invoke/batch/stream3.RunnableRunnable是LangChain定义的一个抽象接口Protocol它强制要求所有LCEL组件实现一组标准方法classRunnable(Protocol):definvoke(self,input:Any)-Any:...# 单输入单输出defbatch(self,inputs:List[Any])-List[Any]:...# 批量处理defstream(self,input:Any)-Iterator[Any]:...# 流式输出# 还有其他方法如 ainvoke异步等...任何实现了这些方法的对象都被视为LCEL兼容组件。比如聊天模型、提示词模板、输出解析器、检索器、代理(智能体)等。每个 LCEL 对象都实现了 Runnable 接口该接口定义了一组公共的调用方法。这使得 LCEL 对象链也自动支持这些调用成为可能。3.1 为什么需要统一调用方式传统问题假设没有统一协议• 提示词渲染用.format()• 模型调用用.generate()• 解析器解析用.parse()• 工具调用用.run()代码会变成prompt_textprompt.format(topic猫)# 方法1model_outmodel.generate(prompt_text)# 方法2resultparser.parse(model_out)# 方法3痛点每个组件调用方式不同组合时需要手动适配。3.2 LCEL解决方案通过Runnable协议统一# (分步调用)prompt_textprompt.invoke({topic:猫})# 方法1model_outmodel.invoke(prompt_text)# 方法2resultparser.invoke(model_out)# 方法3# (LCEL管道式)chainprompt|model|parser# 用管道符组合resultchain.invoke({topic:猫})# 所有组件统一用invoke•一致性无论组件的功能多复杂模型/提示词/工具调用方式完全相同•组合性管道操作符|背后自动处理类型匹配和中间结果传递3.3 使用举例举例1情况1没有使用chainfromlangchain_core.output_parsersimportStrOutputParserfromlangchain_openaiimportChatOpenAIfromlangchain.promptsimportPromptTemplateimportosimportdotenv dotenv.load_dotenv()os.environ[OPENAI_API_KEY]os.getenv(OPENAI_API_KEY1)os.environ[OPENAI_BASE_URL]os.getenv(OPENAI_BASE_URL)chat_modelChatOpenAI(modelgpt-4o-mini)prompt_templatePromptTemplate.from_template(template给我讲一个关于{topic}话题的简短笑话)parserStrOutputParser()prompt_valueprompt_template.invoke({topic:冰淇淋})resultchat_model.invoke(prompt_value)out_putparser.invoke(result)print(out_put)print(type(out_put))情况2使用chain将提示模板、模型、解析器链接在一起。使用LCEL将不同的组件组合成一个单一的链条fromdotenvimportload_dotenvfromlangchain_core.output_parsersimportStrOutputParser load_dotenv()chat_modelChatOpenAI(modelgpt-4o-mini)prompt_templatePromptTemplate.from_template(template给我讲一个关于{topic}话题的简短笑话)parserStrOutputParser()# 构建链式调用LCEL语法chainprompt_template|chat_model|parser out_putchain.invoke({topic:ice cream})print(out_put)print(type(out_put))二、传统Chain的使用1.基础链LLMChain1.1 使用说明LCEL之前最基础也最常见的链类型是LLMChain。这个链至少包括一个提示词模板PromptTemplate一个语言模型LLM 或聊天模型。特点• 用于单次问答输入一个 Prompt输出 LLM 的响应。• 适合无上下文的简单任务如翻译、摘要、分类等。•无记忆无法自动维护聊天历史1.2 主要步骤1、 配置任务链使用LLMChain类将任务与提示词结合形成完整的任务链。resultchain.invoke(...)print(result)1.3 参数说明这里我们可以整理如下举例1fromlangchain.chains.llmimportLLMChainfromlangchain_core.promptsimportPromptTemplateimportosimportdotenvfromlangchain.openaiimportChatOpenAI dotenv.load_dotenv()os.environ[OPENAI_API_KEY]os.getenv(OPENAI_API_KEY1)os.environ[OPENAI_BASE_URL]os.getenv(OPENAI_BASE_URL)# 1、创建大模型实例chat_modelChatOpenAI(modelgpt-4o-mini)# 2、原始字符串模板template桌上有{number}个苹果四个桃子和3本书一共有几个水果promptPromptTemplate.from_template(template)# 3、创建LLMChainllm_chainLLMChain(llmchat_model,promptprompt)# 4、调用LLMChain返回结果resultllm_chain.invoke({number:2})print(result)举例2verbose参数使用使用ChatPromptTemplate。# 1.导入相关包fromlangchain.chains.llmimportLLMChainfromlangchain_core.promptsimportChatPromptTemplatefromlangchain.openaiimportChatOpenAI# 2.定义提示词模板对象chat_templateChatPromptTemplate.from_messages([(system,你是一位{area}领域具备丰富经验的高端技术人才),(human,给我讲一个{adjective}笑话),])# 3.定义模型llmChatOpenAI(modelgpt-4o-mini)# 4.定义LLMChainllm_chainLLMChain(llmllm,promptchat_template,verboseTrue)# 5.调用LLMChainresponsellm_chain.invoke({area:互联网,adjective:上班的})print(response)补充说明调用方法除了invoke()外还有run()、predict()、实例方法等效果与invoke()相同这里不再介绍。2. 顺序链之 SimpleSequentialChain顺序链SequentialChain允许将多个链顺序连接起来每个Chain的输出作为下一个Chain的输入形成特定场景的流水线Pipeline。顺序链有两种类型• 单个输入/输出对应着 SimpleSequentialChain• 多个输入/输出对应着SequentialChain2.1 说明SimpleSequentialChain最简单的顺序链多个链串联执行每个步骤都有单一的输入和输出一个步骤的输出就是下一个步骤的输入无需手动映射。2.2 使用举例fromlangchain_core.promptsimportChatPromptTemplatefromlangchain.chainsimportLLMChain chainA_templateChatPromptTemplate.from_messages([(system,你是一位精通各领域知识的知名教授),(human,请你尽可能详细的解释一下{knowledge}),])chainA_chainsLLMChain(llmllm,promptchainA_template,verboseTrue)chainA_chains.invoke({knowledge:什么是LangChain})继续fromlangchain_core.promptsimportChatPromptTemplate chainB_templateChatPromptTemplate.from_messages([(system,你非常善于提取文本中的重要信息并做出简短的总结),(human,这是针对一个提问的完整的解释说明内容{description}),(human,请你根据上述说明尽可能简短的输出重要的结论请控制在20个字以内),])chainB_chainsLLMChain(llmllm,promptchainB_template,verboseTrue)# 导入SimpleSequentialChainfromlangchain.chainsimportSimpleSequentialChain# 在chains参数中按顺序传入LLMChain A和LLMChain Bfull_chainSimpleSequentialChain(chains[chainA_chains,chainB_chains],verboseTrue)full_chain.invoke({input:什么是langChain})在这个过程中因为SimpleSequentialChain定义的是顺序链所以在chains参数中传递的列表要按照顺序来进行传入即LLMChain A 要在LLMChain B之前。同时在调用时不再使用LLMChain A中定义的**{knowledge}** 参数也不是LLMChainB中定义的**{description}**参数而是要使用input进行变量的传递。源码classSimpleSequentialChain(Chain):Simple chain where the outputs of one step feed directly into next.chains:List[Chain]strip_outputs:boolFalseinput_key:strinput#:meta private:output_key:stroutput#:meta private:举例2创建了两条chain并且让第一条chain给剧名写大纲输出该剧名大纲作为第二条chain的输入然后生成一个剧本的大纲评论。最后利用SimpleSequentialChain即可将两个chain直接串联起来。# 1.导入相关包fromlangchain.chainsimportLLMChainfromlangchain_core.promptsimportPromptTemplatefromlangchain.chainsimportSimpleSequentialChain# 2.创建大模型实例llmChatOpenAI(modelgpt-4o-mini)# 3.定义一个给剧名写大纲的LLMChaintemplate1你是个剧作家给定剧本的标题你的工作就是为这个标题写一个大纲。 Title: {title} prompt_template1PromptTemplate(input_variables[title],templatetemplate1)synopsis_chainLLMChain(llmllm,promptprompt_template1)# 4.定义一个剧本大纲写一篇评论的LLMChaintemplate2你是《纽约时报》的剧评家有了剧本的大纲你的工作就是为剧本写一篇评论 剧情大纲: {synopsis} prompt_template2PromptTemplate(input_variables[synopsis],templatetemplate2)review_chainLLMChain(llmllm,promptprompt_template2)# 5.定义一个完整的链按顺序运行这两条链# (verboseTrue打印链的执行过程)overall_chainSimpleSequentialChain(chains[synopsis_chain,review_chain],verboseTrue)# 6.调用完整链顺序执行这两个链reviewoverall_chain.invoke(日落海滩上的悲剧)# 7.打印结果print(review)3. 顺序链之SequentialChain3.1 说明SequentialChain更通用的顺序链具体来说•多变量支持允许不同子链有独立的输入/输出变量。•灵活映射需显式定义变量如何从一个链传递到下一个链。即精准地命名输入关键字和输出关键字来明确链之间的关系。•复杂流程控制支持分支、条件逻辑分别通过input_variables和output_variables配置输入和输出。3.2 使用举例举例1fromlangchain_core.promptsimportChatPromptTemplatefromlangchain.chainsimportSequentialChainfromlangchain.openaiimportChatOpenAIfromlangchain.chainsimportLLMChainfromopenaiimportOpenAIimportos# 创建大模型实例llmChatOpenAI(modelgpt-4o-mini)schainA_templateChatPromptTemplate.from_messages([(system,你是一位精通各领域知识的知名教授),(human,请你先尽可能详细的解释一下{knowledge}并且{action})])schainA_chainsLLMChain(llmllm,promptschainA_template,verboseTrue,output_keyschainA_chains_key)# schainA_chains.invoke({# knowledge: 中国的篮球怎么样,# action: 举一个实际的例子# })schainB_templateChatPromptTemplate.from_messages([(system,你非常善于提取文本中的重要信息并做出简短的总结),(human,这是针对一个提问完整的解释说明内容{schainA_chains_key}),(human,请你根据上述说明尽可能简短的输出重要的结论请控制在100个字以内)])schainB_chainsLLMChain(llmllm,promptschainB_template,verboseTrue,output_keyschainB_chains_key)Seq_chainSequentialChain(chains[schainA_chains,schainB_chains],input_variables[knowledge,action],output_variables[schainA_chains_key,schainB_chains_key],verboseTrue)responseSeq_chain.invoke({knowledge:中国足球为什么踢得烂,action:举一个实际的例子})print(response)还可以单独输出print(response[schainA_chains_key])print(response[schainB_chains_key])举例2# 1.导入相关包fromlangchain.chains.llmimportLLMChainfromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportPromptTemplatefromlangchain.chainsimportSequentialChain# 创建大模型实例llmChatOpenAI(modelgpt-4o-mini)# 2.定义任务链一# first chain1 任务翻译成中文first_promptPromptTemplate.from_template(把下面内容翻译成中文:\n\n{content})chain_oneLLMChain(llmllm,promptfirst_prompt,verboseTrue,output_keyChinese_Review)# 3.定义任务链二# chain2 任务对翻译后的中文进行总结摘要 input key是上一个chain的output keysecond_promptPromptTemplate.from_template(用一句话总结下面内容:\n\n{Chinese_Review})chain_twoLLMChain(llmllm,promptsecond_prompt,verboseTrue,output_keyChinese_Summary)# 4.定义任务链三# chain3 任务识别语言third_promptPromptTemplate.from_template(下面内容是什么语言:\n\n{Chinese_Summary})chain_threeLLMChain(llmllm,promptthird_prompt,verboseTrue,output_keylanguage)# 5.定义任务链四# chain4 任务对摘要要使用指定语言进行评论 input key是上一个chain的output keyfourth_promptPromptTemplate.from_template(请使用指定的语言对以下内容进行评论:\n\n内容{Chinese_Summary}\n\n语言{language})chain_fourLLMChain(llmllm,promptfourth_prompt,verboseTrue,output_keyComment)# 6.总链# overall 任务翻译成中文-为翻译后的中文进行总结摘要-智能识别语言-针对摘要使用指定语言overall_chainSequentialChain(chains[chain_one,chain_two,chain_three,chain_four],input_variables[content],output_variables[Chinese_Review,Chinese_Summary,language,Comment],)#读取文件# read filecontentRecently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 04945-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-4923850, email: michael.johnsonexample.com).overall_chain.invoke(content)3.3 顺序链使用场景场景多数据源处理举例根据产品名使用 SimpleSequentialChain会失败# 假设链1返回 {price: 100}, 链2需要 {product: xx, price: xx}# 结构不匹配无法自动传递使用 SequentialChain正确方式fromlangchain.chainsimportSequentialChain# 创建大模型实例llmChatOpenAI(modelgpt-4o-mini)# 第1环节:query_chainLLMChain(llmllm,promptPromptTemplate.from_template(template请模拟查询{product}的市场价格直接返回一个合理的价格数字如6999不要包含任何其他文字或代码,verboseTrue,output_keyprice)# 第2环节:promo_chainLLMChain(llmllm,promptPromptTemplate.from_template(template为{product}售价{price}元创作一篇50字以内的促销文案要求突出产品卖点,verboseTrue,output_keypromo_text)sequential_chainSequentialChain(chains[query_chain,promo_chain],verboseTrue,input_variables[product],# 初始输入output_variables[price,promo_text],# 输出价格和文案)resultsequential_chain.invoke({product:iPhone16})print(result)# print(result[price])# print(result[promo_text])通过这两个例子可以看出当需要处理多变量或异构数据时SequentialChain的灵活性是必不可少的。4. 数学链 LLMMathChain (了解)LLMMathChain将用户问题转换为数学问题然后将数学问题转换为可以使用 Python 的 numexpr 库执行的表达式。使用运行此代码的输出来回答问题。使用LLMMathChain需要安装numexpr库pip install numexprfromlangchain.chainsimportLLMMathChainimportosimportdotenvfromlangchain_openaiimportChatOpenAIfromlangchain.chainsimportLLMChain dotenv.load_dotenv()os.environ[OPENAI_API_KEY]os.getenv(OPENAI_API_KEY1)os.environ[OPENAI_BASE_URL]os.getenv(OPENAI_BASE_URL)# 创建大模型实例llmChatOpenAI(modelgpt-4o-mini)# 创建链llm_mathLLMMathChain.from_llm(llm)# 执行链resllm_math.invoke(10 ** 3 100的结果是多少)print(res)5. 路由链 RouterChain (了解)路由链RouterChain用于创建可以动态选择下一条链的链。可以自动分析用户的需求然后引导到最适合的链中执行获取响应并返回最终结果。比如我们目前有三类chain分别对应三种学科的问题解答。我们的输入内容也是与这三种学科对应但是随机的比如第一次输入数学问题、第二次有可能是历史问题… 这时候期待的效果是可以根据输入的内容是什么自动将其应用到对应的子链中。RouterChain就为我们提供了这样一种能力。RouterChain图示6. 文档链 StuffDocumentsChain(了解)StuffDocumentsChain 是一种文档处理链它的核心作用是将多个文档内容合并“填充”或“塞入”到单个提示prompt中然后传递给语言模型LLM进行处理。使用场景由于所有文档被完整拼接LLM 能同时看到全部内容所以适合需要全局理解的任务如总结、问答、对比分析等。但注意仅适合处理少量/中等长度文档的场景。举例#1.导入相关包fromlangchain.chainsimportStuffDocumentsChainfromlangchain.chainsimportLLMChainfromlangchain.promptsimportPromptTemplatefromlangchain.document_loadersimportPyPDFLoaderfromlangchain.chat_modelsimportChatOpenAI#2.加载PDFloaderPyPDFLoader(./asset/example/loader.pdf)#3.定义提示词prompt_template对以下文字做简洁的总结: {text} 简洁的总结:#4.定义提示模板promptPromptTemplate.from_template(prompt_template)#5.定义模型llmChatOpenAI(modelgpt-4o-mini)#6.定义LLM链llm_chainLLMChain(llmllm,promptprompt)#7.定义文档链stuff_chainStuffDocumentsChain(llm_chainllm_chain,document_variable_nametext,# 在prompt模板中,文档内容应该用哪个变量名表示)#document_variable_nametext告诉StuffDocumentsChain把合并后的文档内容填充到{text}变量中。#8.加载pdf文档docsloader.load()#9.执行链resstuff_chain.invoke(docs)#print(res)print(res[output_text])三、基于LCEL构建的Chains的类型前面讲解的都是Legacy Chains下面看最新的基于LCEL构建的Chains。create_sql_query_chain create_stuff_documents_chain create_openai_fn_runnable create_structured_output_runnable load_query_constructor_runnable create_history_aware_retriever create_retrieval_chain1. create_sql_query_chaincreate_sql_query_chainSQL查询链是创建生成SQL查询的链用于将自然语言转换成数据库的SQL查询举例1这里使用MySQL数据库需要安装pymysqlpip install pymysqlfromlangchain_community.utilitiesimportSQLDatabase# 连接 MySQL数据库db_userrootdb_passwordabc123# 根据自己的密码填写db_host127.0.0.1db_port3306db_nameatguigudb# mysqlpymysql://用户名:密码ip地址:端口号/数据库名dbSQLDatabase.from_uri(fmysqlpymysql://{db_user}:{db_password}{db_host}:{db_port}/{db_name})print(哪种数据库,db.dialect)print(获取数据表,db.get_usable_table_names())# 执行查询resdb.run(SELECT count(*) FROM employees;)print(查询结果,res)进而fromlangchain_openaiimportChatOpenAIfromlangchain.chains.sql_database.queryimportcreate_sql_query_chain# 创建大模型实例llmChatOpenAI(modelgpt-4o-mini)# 调用Chainchaincreate_sql_query_chain(llmllm,dbdb)# response chain.invoke({question: 数据表employees中哪个员工工资高})# print(response)# response chain.invoke({question: 查询departments表中一共有多少个部门})# print(response)# response chain.invoke({question: 查询last_name叫King的基本情况})# print(response)## 限制使用的表responsechain.invoke({question:一共有多少个员工,table_names_to_use:[employees]})print(response)2. create_stuff_documents_chain(了解)create_stuff_documents_chain用于将多个文档内容合并成单个长文本的链式工具并一次性传递给LLM处理而不是分多次处理。适合场景• 保持上下文完整适合需要全局理解所有文档内容的任务如总结、问答•适合处理少量/中等长度文档的场景。举例1多文档摘要fromlangchain.chains.combine_documentsimportcreate_stuff_documents_chainfromlangchain_core.promptsimportPromptTemplatefromlangchain_openaiimportChatOpenAIfromlangchain_core.documentsimportDocument# 定义提示词模板promptPromptTemplate.from_template( 如下文档{docs}中说香蕉是什么颜色的 )# 创建链llmChatOpenAI(modelgpt-4o-mini)chaincreate_stuff_documents_chain(llm,prompt,document_variable_namedocs)# 文档输入docs[Document(page_content苹果学名Malus pumila Mill别称西洋苹果、奈属于蔷薇科苹果属的植物。苹果是全球最广泛种植和销售的水果之一具有悠久的栽培历史和广泛的分布范围。苹果的原始种群主要起源于中亚的天山山脉附近尤其是现代哈萨克斯坦的阿拉木图地区提供了所有现代苹果品种的基因库。苹果通过早期的贸易路线如丝绸之路从中亚向外扩散到全球各地。),Document(page_content香蕉是白色的水果主要产自热带地区。),Document(page_content蓝莓是蓝色的浆果含有抗氧化物质。)]# 执行摘要chain.invoke({docs:docs})总结记得关注么么哒

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询