
引言LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它将大型语言模型LLM的强大能力与外部数据源、计算工具和记忆系统连接起来构建出功能强大、可交互的智能应用。理解其核心组件是掌握 LangChain 并构建复杂应用的关键。本文将深入解析 LangChain 的六大核心组件模型Models、提示Prompts、链Chains、索引Indexes、记忆Memory和代理Agents帮助你从原理到应用全面掌握 LangChain 的架构。1. 模型Models模型是 LangChain 应用的基础负责与各种语言模型进行交互。LangChain 主要支持两类模型1.1 语言模型LLMs语言模型是纯文本补全模型接收文本输入并返回文本输出。例如 OpenAI 的 GPT 系列、Anthropic 的 Claude 等。fromlangchain.llmsimportOpenAI llmOpenAI(model_namegpt-3.5-turbo,temperature0.7)responsellm(请介绍一下人工智能。)print(response)1.2 聊天模型Chat Models聊天模型基于语言模型构建但输入和输出格式化为聊天消息如SystemMessage,HumanMessage,AIMessage更适合对话场景。fromlangchain.chat_modelsimportChatOpenAIfromlangchain.schemaimportHumanMessage,SystemMessage chatChatOpenAI(temperature0)messages[SystemMessage(content你是一个乐于助人的助手。),HumanMessage(content什么是机器学习)]responsechat(messages)print(response.content)2. 提示Prompts提示是指导语言模型生成所需输出的结构化指令。LangChain 提供了强大的提示模板和少量示例提示功能。2.1 提示模板Prompt Templates提示模板允许你参数化提示动态插入变量实现提示的复用。fromlangchain.promptsimportPromptTemplate template你是一位{role}。请用{style}风格回答以下问题 问题{question} 回答promptPromptTemplate.from_template(template)formatted_promptprompt.format(role技术专家,style简洁明了,question解释一下神经网络。)print(formatted_prompt)2.2 少量示例提示Few-shot Prompting通过提供少量示例引导模型学习任务格式和风格。fromlangchain.promptsimportFewShotPromptTemplate,PromptTemplate examples[{input:高兴,output:这是一个表示积极情绪的词语。},{input:悲伤,output:这是一个表示消极情绪的词语。},]example_promptPromptTemplate(input_variables[input,output],template输入{input}\n输出{output})few_shot_promptFewShotPromptTemplate(examplesexamples,example_promptexample_prompt,prefix请对以下词语进行情感分类,suffix输入{query}\n输出,input_variables[query])resultfew_shot_prompt.format(query愤怒)print(result)3. 链Chains链是将多个组件模型、提示、工具等组合在一起按顺序执行以完成复杂任务的机制。它是 LangChain 的核心抽象。3.1 简单链LLMChain最基本的链将一个提示模板和一个语言模型组合起来。fromlangchain.chainsimportLLMChain promptPromptTemplate.from_template({product}的三大优点是什么)chainLLMChain(llmllm,promptprompt)resultchain.run(电动汽车)print(result)3.2 顺序链SequentialChain将多个链按顺序连接前一个链的输出作为后一个链的输入。fromlangchain.chainsimportSimpleSequentialChain# 链1生成产品名称chain1LLMChain(llmllm,promptPromptTemplate.from_template(为{industry}行业想一个创新的产品名称。))# 链2生成营销口号chain2LLMChain(llmllm,promptPromptTemplate.from_template(为产品“{product_name}”写一句吸引人的营销口号。))overall_chainSimpleSequentialChain(chains[chain1,chain2],verboseTrue)final_resultoverall_chain.run(教育科技)print(final_result)4. 索引Indexes索引组件用于高效地从外部文档中检索信息是实现基于知识的问答RAG的核心。4.1 文档加载器Document Loaders从各种来源PDF、网页、数据库等加载文档。fromlangchain.document_loadersimportWebBaseLoader loaderWebBaseLoader(https://docs.langchain.com/docs/)docsloader.load()print(f加载了{len(docs)}个文档)4.2 文本分割器Text Splitters将长文档分割成适合模型处理的小块。fromlangchain.text_splitterimportRecursiveCharacterTextSplitter text_splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50)split_docstext_splitter.split_documents(docs)print(f分割为{len(split_docs)}个文本块)4.3 向量存储与检索器Vectorstores Retrievers将文档转换为向量并存储实现语义搜索。fromlangchain.embeddingsimportOpenAIEmbeddingsfromlangchain.vectorstoresimportChroma# 创建向量存储embeddingsOpenAIEmbeddings()vectorstoreChroma.from_documents(documentssplit_docs,embeddingembeddings)# 创建检索器retrievervectorstore.as_retriever(search_kwargs{k:3})relevant_docsretriever.get_relevant_documents(什么是链)fordocinrelevant_docs:print(doc.page_content[:200])5. 记忆Memory记忆使链或代理能够在多次交互中记住先前的对话或信息对于聊天机器人等应用至关重要。5.1 对话缓冲记忆ConversationBufferMemory简单地保存所有对话历史。fromlangchain.memoryimportConversationBufferMemory memoryConversationBufferMemory()memory.chat_memory.add_user_message(你好)memory.chat_memory.add_ai_message(你好我是AI助手。)print(memory.load_memory_variables({}))5.2 对话摘要记忆ConversationSummaryMemory对长对话进行摘要避免超出模型上下文长度。fromlangchain.memoryimportConversationSummaryMemoryfromlangchain.llmsimportOpenAI summary_memoryConversationSummaryMemory(llmOpenAI())summary_memory.save_context({input:我喜欢编程。},{output:很棒编程很有趣。})summary_memory.save_context({input:我主要用Python。},{output:Python是一门优秀的语言。})print(summary_memory.load_memory_variables({}))6. 代理Agents代理是 LangChain 中最强大的概念之一。它使用语言模型来决定采取一系列行动调用工具以完成目标而不仅仅是输出文本。6.1 代理与工具Agents Tools代理通过工具与外界交互。工具可以是搜索、计算、API调用等。fromlangchain.agentsimportload_tools,initialize_agent,AgentTypefromlangchain.llmsimportOpenAI llmOpenAI(temperature0)toolsload_tools([serpapi,llm-math],llmllm)# 需要 SERPAPI 密钥agentinitialize_agent(tools,llm,agentAgentType.ZERO_SHOT_REACT_DESCRIPTION,verboseTrue)agent.run(特斯拉当前的股价是多少如果我有100股总价值是多少美元)6.2 自定义工具你可以创建自己的工具来扩展代理的能力。fromlangchain.toolsimportToolfromdatetimeimportdatetimedefget_current_time(format:str%Y-%m-%d %H:%M:%S)-str:获取当前时间。returndatetime.now().strftime(format)time_toolTool(nameCurrent Time,funcget_current_time,description当需要知道当前日期和时间时使用此工具。)# 可以将此工具加入代理的工具列表