LangChain入门 -- 认识LangChain

发布时间:2026/10/20 2:02:46
LangChain入门 -- 认识LangChain LangChain由Harrison Chase创建于2022年10月是用于开发智能体工程的平台。1、Agent在人工智能领域Agent智能体或代理是指一种能感知环境、进行推理、自主决策并采取行动以实现特定目标的智能系统。也就是给大模型装上大脑2、Tool工具底层可调用的函数 / Api粒度最小比如查时间、调用计算器、调用搜索API输入输出结构化3、Skill技能多个Tool组合封装出来的某件任务的能力。例如“查询并总结网页资料”这个Skill由【网页搜索Tool 网页解析Tool】组合而成4、Action动作Agent 向外执行的一步操作。可以是调用 Tool也可以输出自然语言回复。Tool 调用属于 Action 的其中一类。5、Observation观测Tool执行之后返回给Agent的结果。Agent拿到Observation继续思考6、tool_call工具调用大模型输出的一段结构化JSON指令用来告诉Agent我们要调用什么工具什么指令Tought - Action - Observation-Thought一、LangChain调用大模型的大概流程1、安装LangChain依赖uv add langchain # 有pyproject.toml文件下用 #正常情况下我们还是用pip pip install langchain如果没有uv环境还得先装uv环境pip install uv2、安装各种不同的模型每个模型提供对应的兼容SDK#集成Deepseek uv add langchain-deepseek pip install langchain-deepseek #集成Open AI uv add langchain-openai pip install langchain-openai #集成 Anthropic uv add langchain-anthropic pip install langchain-anthropic3、加载环境变量这个在部署和调用大模型的那个文章中讲过就是解析.env文件的from dotenv import load_dotenv load_dotenv()4、定义工具Toolfrom langchain.tools import tool tool def getWeather(location:str) - str: 得到天气情况的工具 tool中必须有这个解释 return fCurrent weather in {location} is sunny5、创建Agentfrom langchain.agents import creat_agent agent creat_agent( deepseek-chat, tools [getWeather] )6、调用Agentresponse agent.invoke({ messages:[ {role:user,content:今天杭州天气如何} ] }) for message in respone[messages] print(message.model_dump_json(indent2)) #model_dump_json是转换成json格式indent2是遇到逗号换行遇到下一层嵌套在换行前空2格7、Agent系统的执行流程用户提问input- 模型分析Reasoning- 调用工具Action-感知分析Observation- 生成结果Output总的来说大模型用来接收消息思考并且输出tool_call决定用哪个tool把这些信息组装成tool_calls返回然后LangChain根据分析tool_call去Action执行Tool再把Observation的结果交给大模型让它再次思考输出结果。二、模型Models1、初始化模型langchain支持的模型1langchain支持市面上大部分的大语言模型并提供了各个模型对应的依赖库。OpenAIgpt- langchain-openai - ChatOpenAI、Anthropicclaude- langchain-anthropic - ChatAnthropic、Googlegemini- langchain-google-genai - ChatGoogleGenerativeAIDeepSeekdeepseek- langchain-deepseek - ChatDeepSeekfrom langchain_openai import ChatOpenAI model ChatOpenAI(model gpt-5.2)ps这种方式是老方式因为你要用几个大模型就得导入几个类再去创建几个对象不适配于多模型切换的场景。2为解决上面的弊端引入了“init_chat_model”这个函数这个函数不需要导入任何函数只需要指定你想要的模型即可。from dotenv import load_dotenv from langchain.chat_models import init_chat_model load_dotenv (config.env) llm init_chat_model( modeldeepseek-flash temperature 1.5 ) print(type(llm))2、如果langchain里没有对应的库1需要自定义模型参数来访问如qwen是openai旗下的from dotenv import load_dotenv from langchain.chat_models import init_chat_model import os load_dotenv (config.env) api_key os.getenv(DASHSCOPE_API_KEY) base_url os.getenv(DASHSCOPE_BASE_URL) llm init_chat_model( modelqwen-max, model_provideropenai # langchain不认识的模型就需要指明提供商 api_key api_key, base_url base_url temperature 1.5 )2用老方法 -- langchain社区中的库pip install langchain-community uv add langchain-communitypip install dashscope #阿里云白炼自己的库from langchain_community.chat_models.tongyi import ChatTongyi model ChatTongyi( model qwen-max )3、调用模型因为langchain可以在初始化的时候把模型参数初始化固定temparature等所以我们调用模型的时候就只需要传递消息即可1invoke完整内容输出到显示器from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain.agents import create_agent import os load_dotenv (config.env) llm init_chat_model( modeldeepseek-flash, temperature 1.5 ) response llm.invoke([ { role:system, content:你扮演火箭队的武藏 }, { role:user, content:你是谁 } ]) 如果想采用流式调用直接把invoke改成stream即可llm.stream print(response.content)如果直接response llm.invoke(你是谁)默认就是user的内容2流式一个字一个字的输出from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain.agents import create_agent import os load_dotenv (config.env) llm init_chat_model( modeldeepseek-flash, temperature 1.5 ) response llm.stream([ { role:system, content:你扮演火箭队的武藏 }, { role:user, content:你是谁 } ]) 如果想采用流式调用直接把invoke改成stream即可llm.stream for l in response: print(l.content,end,flushTrue) # end“”遍历一次不换行flush刷新缓冲机制True可以让它输出内容后马上显示4、在智能体中调用模型1创建智能体creat_agent可以先初始化再在智能体里用res create_agent( modelllm )也可以直接res create_agent( modeldeepseek-falsh )2用智能体调用模型invoke型from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain.agents import create_agent import os load_dotenv (config.env) llm init_chat_model( modeldeepseek-flash, temperature 1.5 ) agent create_agent(modelllm) response agent.invoke({ messages:[{role:user,content:你是谁}] }) print(response[messages][-1].content)stream型from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain.agents import create_agent import os load_dotenv (config.env) llm init_chat_model( modeldeepseek-flash, temperature 1.5 ) agent create_agent(modelllm) response agent.stream({ messages:[{role:user,content:你是谁}] }, stream_modemessages #stream有很多种类型要想看到回复的消息流式输出就是messages模式 ) for token,metadata in response: if token.content: print(token.content,end,flushTrue)三、消息Message在langchain中发送给模型的消息、模型返回的消息都统一被封装成BaseMessage并准备了多个BaseMessage的子类对应不用角色类型的消息。1、BaseMessage的子类1SystemMessage - Role:system2HumanMessage - Role:user3AIMessage - Role:assistant模型返回的消息4ToolMessage - Role:toolresponse agent.invoke({ messages:[ {role:system,content:你是虎哥}, {role:user,content:你是谁}, {role:assistant,content:你好呀我是虎哥}, {role:user,content:今天杭州的天气怎么样} ] })就可以直接用BaseMessagefrom langchain_core.messages import SystemMessage,HumanMessage,AIMessage response agent.invoke({ messages:[ SystemMessage(content 你是虎哥), HumanMessage(content 你是谁), AIMessage(content 你好呀我是虎哥), HumanMessage(content今天杭州的天气怎么样) ] })总代码就是from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain.agents import create_agent from langchain.tools import tool from langchain_core.messages import SystemMessage,HumanMessage,AIMessage load_dotenv (config.env) 初始化模型 llm init_chat_model( modeldeepseek-flash, temperature 1.5 ) tool def getWeather(location:str)-str: summary Returns: str: 返回天气 return f今天{location}的天气是晴朗 #创建一个Langchain对象 agent create_agent(modelllm,tools[getWeather]) #用Langchain创建出的对象去调用大模型 response agent.invoke({ messages:[ SystemMessage(content 你是虎哥), HumanMessage(content 你是谁), AIMessage(content 你好呀我是虎哥), HumanMessage(content今天杭州的天气怎么样) ] }) for message in response[messages]: message.pretty_print() #更好看的打印信息用pretty_print()方法打印的就是这样2、多模态消息很多大模型不止能处理文字消息还能处理图片等多模态的信息但是前提是这个模型本身就是多模态模型deepseek就不行但是上面提到的qwen就可以识别图片。1在线图片from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain.agents import create_agent from langchain.tools import tool from langchain_core.messages import SystemMessage,HumanMessage,AIMessage import os load_dotenv (config.env) llm init_chat_model( modelqwen-vl-max, api_key os.getenv(DASHSCOPE_API_KEY), base_urlhttps://maas.qianwenaiapi.com/compatible-mode/v1, model_provideropenai, temperature 1.5 ) agent create_agent(modelllm) response agent.stream({ messages:[ HumanMessage(content[ {type: image_url,image_url: https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg}, {type: text,text: 图中描绘的是什么景象?} ]) ] }, stream_modemessages ) for chunk,meta in response: if chunk.content: print(chunk.content,end,flushTrue)2本地图片有时用户会上传磁盘的图片数据而不是url地址我们就需要把图片数据转换成base64字符串然后发送给模型。首先安装一个上传组件用于模拟图片上传上传必须有前端界面或者用python的.ipynb文件!uv add ipywidgetsfrom ipywidgets import FileUpload from IPython.display import display Which file types to accept, e.g. .doc,.docx.*代表所有类型 multiple是否允许上传多个文件这里我们演示就先设置成False upload FileUpload(accept *,mutiple False) display(upload ({name: OIP.webp, type: image/webp, size: 12898, content: memory at 0x0000018A5E374DC0, last_modified: datetime.datetime(2026, 10, 9, 9, 31, 46, 203000, tzinfodatetime.timezone.utc)}, ) ps其中upload.value的content就是存放base64编码的地址上传后就要把图片数据转换成base64的数据格式import base64 # 拿取第一张照片的内容的值 upload_file upload.value[0] # 把存放内容的内存地址赋值给content_dizhi content_dizhi upload_file[content] # 将内存地址的内容转化为bytes类型 image_bytes bytes(content_dizhi) # 将bytes类型的内容转化为base64编码 image_base64 base64.b64encode(image_bytes).decode(utf-8)再编写消息message并调用大模型from langchain_core.messages import HumanMessage message HumanMessage(content[ {type: text, text: 请帮我分析这张图片的内容}, { type: image, base64: image_base64, mime_type: image/jpeg, }, ]) response agent.stream({ messages: [message] }, stream_modemessages ) for chunk,data in response: if chunk.content: print(chunk.content,end,flushTrue)四、提示词prompts提示词prompts就是发送给模型的消息其中SystemMessage是系统提示词system prompt可以给模型设定角色、聊天背景、任务说明对模型生成的内容有很大的影响。1、在message中设置SystemMessage同样的问题系统提示词不一样回答的问题也不一样比如message [SystemMessage(content你以海盗的口吻回答问题), HumanMessage(content你是谁)]回答嘿嘿俺是纵横七海、闻着宝藏味儿就能找到路的海盗船长帆一扯、炮一响连海鸥都得给俺让道。你问俺是谁先报上名来免得俺的弯刀认错了人message [SystemMessage(content你以台湾女子的口吻回答问题), HumanMessage(content你是谁)]回答我是林小满啦台湾女生今年28岁住台中平时喜欢喝手摇饮、逛夜市也爱跟朋友聊聊天。你这样问我是想认识我一下吗2、在agent中设置全局系统提示词这样就不用每次传消息都要设置系统提示词了agent create_agent( modelllm, system_prompt以海盗的口吻回答我的问题。 ) message [HumanMessage(content你是谁)]3、提示词工程通过优化提示词使模型输出的结果更符合业务的逻辑。身份角色Identity描述AI的职责、沟通风格和总体目标指令说明Instructions指导模型如何生成所需的响应它应该遵循哪些规则模型应该做什么以及模型绝对不能做什么对话示例Examples提供可能的输入示例以及模型期望的输出背景信息Context向模型提供生成响应所需的任何额外信息例如RAG的额外知识库数据或你认为特别相关的任何其他数据编写System Prompt时推荐使用Markdown格式和XML标签的组合来帮助模型理解提示和上下文数据逻辑的边界避免话太多逻辑太杂乱风格不喜欢1身份角色和指令说明agent create_agent( modelllm, system_prompt #身份你是一个编程助手你帮用户编写python文件 #指令你只需要输出python代码不要输出任何解释和多余的文字 ) message [HumanMessage(content怎样定义string变量记录人民比如张飞)]2对话示例agent create_agent( modelllm, system_prompt #身份你是一个科幻作家根据用户的要求创建一个太空之都 #示例 user:月球的首都是什么 assistant:月球的首都是“月光城”位于月球的南极地区是一个高科技、环保、宜居的城市。 user:火星的首都是什么 assistant:火星的首都是“火星城”位于火星的赤道地区是一个充满未来感和科技感的城市。 ) message [HumanMessage(content木星的首都是什么)]回答木星的首都是“云穹城”位于木星赤道云带的高层大气中是一座悬浮在气态巨行星上空的浮空都市依靠反重力平台和风暴能源运转充满未来科技感。3结构化输出a、基于提示词的结构化输出agent create_agent( modelllm, system_prompt #身份你是一个科幻作家根据用户的要求创建一个太空之都 #指令务必以json格式输出不要加任何markdown语法和多余的文字json中必须包含城市名称、位置、特点三个字段 #示例 user:月球的首都是什么 assistant: {name:月华市 location:位于月球正面赤道附近的静海面基地遗址上 vibe:冷调、高效、革新 economy:量子通信枢纽、尖端生物圈 } ) message [HumanMessage(content木星的首都是什么)]回答{name:云冠市,location:位于木星赤道北带高空云层中的反重力悬浮都市群依托轨道环木卫三中转港连接vibe:恢宏、炽烈、精密,economy:氦-3采集与磁层能源、星际航运枢纽、气态巨行星深。空科研}b、基于Model的结构化输出·定义一个数据类型基于pydantic·创建智能体设置输出格式from langchain.chat_models import init_chat_model from langchain.agents import create_agent from langchain_core.messages import HumanMessage, AIMessage, SystemMessage from dotenv import load_dotenv from pydantic import BaseModel import os load_dotenv(Api.env) llm init_chat_model( modeldeepseek-chat, model_provideropenai, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com, temperature 0.7 ) # 定义一个继承BaseModel的类写属性 class City(BaseModel): name: str location: str vibe: str economy: str agent create_agent( modelllm, system_prompt你是一个科幻作家根据用户的要求创建一个太空之都, response_formatCity #设置结构化的输出格式pydantic校验大模型输出必须是JSON格式且有City中定义的属性否则就报错 ) message [HumanMessage(content木星的首都是什么)] response agent.invoke({messages: message} ) print(response[structured_response])五、工具Tools一个完整的Agent至少包含2个关键的部分大模型推理分析、规划任务工具执行任务定义工具 - 初始化模型 - 初始化Agent绑定模型和工具1、自定义工具本质就是一个可调用的函数用tool装饰的自定义要包括工具名、工具作用、工具需要的参数from langchain.tools import tool tool(args_schema WeatherInput) def get_weather(city: str,units:str celsius) - str: Description: Get the current weather for a given city. Args: city (str): The name of the city to get the weather for. units (str): The units for the temperature (e.g., celsius, fahrenheit). return f{city}天气29{units}适合出行。可以通过Pydantic Model描述参数去约束参数在tool工具前加上pydantic描述类from pydantic import BaseModel,Field from typing import Literal #枚举 class WeatherInput(BaseModel): city: str Field(..., descriptionThe name of the city to get the weather for.) units: Literal[celsius, fahrenheit] Field( defaultcelsius, description温度单位摄氏度或华氏度)2、预定义工具很多常用的工具其实已经被写好了langchain官网的文档中就有很多预定义的tool我来用其中的Tavily Search这个搜索工具演示一下怎么调用这个工具的作用是能够快速提供实时、准确且事实相关的结果。让智能体联网step1点进去看一下这个tool的文档步骤按步骤先下载它的SDK包step2这个工具里面有很多功能用最常见的搜索功能举例可以搞一个tool函数把代码封装进去也可以用langchain官方的方法1tool函数封装from langchain.tools import tool from tavily import TavilyClient import os tool def search(message: str): A simple search tool that returns the input message. tavily_client TavilyClient(api_keyos.getenv(tvly-YOUR_API_KEY)) response tavily_client.search(message) return reponse2用langchain封装好的方法首先还是下载相关SDK导入key但是方法和上面的不一样具体在langchain官网查看from dotenv import load_dotenv load_dotenv(Api.env) import getpass import os if not os.environ.get(TAVILY_API_KEY): os.environ[TAVILY_API_KEY] getpass.getpass(Tavily API key:\n)再用它官方封装的toolfrom langchain_tavily import TavilySearch #相关参数可以在文档里查看 tool TavilySearch( max_results5, topicgeneral, # include_answerFalse, # include_raw_contentFalse, # include_imagesFalse, # include_image_descriptionsFalse, # search_depthbasic, # time_rangeday, # include_domainsNone, # exclude_domainsNone )最后用智能体调用from langchain.chat_models import init_chat_model from langchain.agents import create_agent from langchain_core.messages import HumanMessage import os llm init_chat_model( modeldeepseek-chat, model_provideropenai, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com ) agent create_agent( modelllm, tools[tool] ) response agent.invoke({messages: [HumanMessage(contentWho is Leo Messi,用中文回答)]}) print(response[messages][-1].content)3优化a、token消耗大Langchain官方提供的这个tool包含了完整的参数列表会导致额外的Token消耗因此对于简单的业务可以用tavily封装一下。from langchain_tavily import TavilySearch from langchain.tools import tool #相关参数可以在文档里查看 tavily_searcher TavilySearch( max_results5, topicgeneral ) tool def search(message: str): Args: message (str): The input message to be searched. restavily_searcher.invoke({query: message}) return res[results]这样的话在大模型调用tool时tool已经调用invoke了tavily搜索工具返回的是字典中的results把其他的东西全部清洗掉了再传输给大模型思考就会节省token。如果让智能体干完全程返回的就是一大段字典如下图b、结果中不包含网页数据源可行度低容易出现幻觉胡写可以强制输出时结构化输出用上面所说的pydantic的BaseModel类from langchain_tavily import TavilySearch from langchain.tools import tool from pydantic import BaseModel, Field #相关参数可以在文档里查看 tavily_searcher TavilySearch( max_results5, topicgeneral ) #Agent回答内容引用的网页信息 class RefreshInput(BaseModel): title:strField(...,descriptionThe title of the document to be refreshed.) url:strField(...,descriptionThe URL of the document to be refreshed.) #Agent的回答内容 class SearchInput(BaseModel): answer:strField(...,descriptionThe answer to the users question.) references:list[RefreshInput]Field(...,descriptionThe list of references used to answer the users question.) def search(message: str): Args: message (str): The input message to be searched. restavily_searcher.invoke({query: message}) return res[results]就会输出图示的信息把每个信息的来源的url网页地址都标注清楚可信度就很高了

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询