微信扫码
添加专属顾问
我要投稿
探索LangChain,打造高效多任务LLM应用。 核心内容: 1. LangChain的核心组件及功能介绍 2. 如何利用LangChain构建知识库 3. LangChain集成工具及自定义工具方法
LangChain = LLM application
LangChain: 提供了一套工具、组件和接口,简化了创建LLM应用的过程
LangChain是由多个组件组成的:
• Models:模型,比如GPT-4o
• Prompts:提示,包括提示管理、提示优化和提示序列化
• Memory:记忆,用来保存和模型交互时的上下文
• Indexes:索引,用于结构化文档,方便和模型交互如果要构建自己的知识库,就需要各种类型文档的加载,转换,长文本切割,文本向量计算,向量索引存储查询等
• Chains:链,一系列对各种组件的调用
• Agents:代理,决定模型采取哪些行动,执行并且观察流程,直到完成为止
LangChain官方文档中对Agent的定义:
they use an LLM to determine which actions to take and in what order. An action can either be using a tool and observing its output, or returning to the user.
在LangChain中集成了一些常用的tools,你也可以自定义自己的工具:
ApifyArXiv API ToolAWS Lambda APIShell ToolBing SearchChatGPT PluginsDuckDuckGo SearchFile System ToolsGoogle PlacesGoogle SearchGoogle Serper APIGradio ToolsGraphQL toolHuggingFace ToolsHuman as a toolIFTTT WebHooksMetaphor SearchCall the APIUse Metaphor as a toolOpenWeatherMap APIPython REPLRequestsSceneXplainSearch ToolsSearxNG Search APISerpAPITwilioWikipediaWolfram AlphaYouTubeSearchToolZapier Natural Language Actions APIExample with SimpleSequentialChain
场景用serpapi举例:
1)实时了解目前发生的新闻
2)互联网上的页面的信息
其他Tools,也有一些定义好的,但你得自己去了解这些Tools都是干啥的。这个Tools没有描述,是因为这个工具是在Agent中已经存在了描述。另外Tools和MCP不同,Tools一般是自己来定义的。MCP是一个接口的标准协议,更方便的调用tools
使用单个工具Tool举例
Serpapi工具: 支持Google, Baidu, Yahoo, Ebay, YouTube等多种API查询
pip install google-search-results(安装工具)
https://serpapi.com/(需要先注册,然后获取SERPAPI_API_KEY)
让LangChain可以使用Serpapi工具(Google搜索API)进行问题的解答
例子:
"今天是几月几号?历史上的今天有哪些名人出生"
import osfrom langchain.agents import load_toolsfrom langchain.agents import initialize_agentfrom langchain_community.llms import Tongyi # 导入通义千问Tongyi模型from langchain.agents import AgentType# 你需要在环境变量中添加 DASHSCOPE_API_KEY和 SERPAPI_API_KEY#os.environ["DASHSCOPE_API_KEY"] = '*******'#os.environ["SERPAPI_API_KEY"] = '*******' # 设置通义千问API密钥 这个在自己的系统环境变量里面配置DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY")# 加载模型llm = Tongyi(model_name="qwen-turbo", dashscope_api_key=DASHSCOPE_API_KEY) # 使用通义千问qwen-turbo模型# 加载 serpapi 工具tools = load_tools(["serpapi"]) """agent:代理类型 zero-shot-react-description: 根据工具的描述和请求内容的来决定使用哪个工具(最常用) react-docstore: 使用 ReAct 框架和 docstore 交互, 使用Search 和Lookup 工具, 前者用来搜, 后者寻找term, 举例: Wipipedia 工具 self-ask-with-search 此代理只使用一个工具: Intermediate Answer, 它会为问题寻找事实答案(指的非 gpt 生成的答案, 而是在网络中,文本中已存在的), 如 Google search API 工具 conversational-react-description: 为会话设置而设计的代理, 它的prompt会被设计的具有会话性, 且还是会使用 ReAct 框架来决定使用来个工具, 并且将过往的会话交互存入内存"""# 工具加载后需要初始化,verbose=True 代表打印执行详情agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) # 运行 agentagent.run("今天是几月几号?历史上的今天有哪些名人出生")
DASHSCOPE_API_KEY 去https://bailian.console.aliyun.com/获取
LangChain思考调用工具过程:
LangChainDeprecationWarning: The method `Chain.run` was deprecated in langchain 0.1.0 and will be removed in 1.0. Use :meth:`~invoke` instead. agent.run("今天是几月几号?历史上的今天有哪些名人出生")> Entering new AgentExecutor chain...我需要先知道今天的日期,然后搜索历史上的今天有哪些名人出生。Action: SearchAction Input: 今天是几月几号Observation: Friday, May 23, 2025Thought:我现在知道今天的日期是2025年5月23日。接下来,我需要搜索历史上的5月23日有哪些名人出生。Action: SearchAction Input: 历史上的5月23日名人出生Observation: ['出生 · 1052年:腓力一世,法兰西国王。 · 1100年:宋钦宗赵桓,北宋皇帝。 · 1208年:西蒙·德孟福尔,英格兰贵族,第六代莱斯特伯爵。 · 1707年:卡尔·林奈,瑞典自然学者,现代生物学双 ...', '1928年——“米老鼠”卡通形象诞生。 1942年——毛泽东《在延安文艺座谈会上的讲话》结束,做出“结论”。 1949 ...', '这一天,众多明星和公众人物迎来了他们的生日,他们在各自的领域内取得了显著的成就,为世界带来了无尽的欢乐与灵感。 德鲁·巴里摩尔是一位著名的美国女 ...', '5月23日出生的名人. 杨采妮. 杨采妮. 香港女演员及歌手,出生于台湾省台北市。父亲是上海人,而母亲是台湾人。幼年时成长于香港,中学就读于德望学校,在十五岁时她前往 ...', '1928年——“米老鼠”卡通形象诞生。 1942年——毛泽东《在延安文艺座谈会上的讲话》结束,做出“结论”。 1949 ...', '1052年:腓力一世; 1707年:卡尔·林奈; 1839年:永仓新八; 1844年:阿博都巴哈; 1908年:约翰·巴丁; 1910年:玛格莉特?怀丝?', '农历5月23日出生的名人有哪些 ... 00:11 1100年5月23日,宋朝第九位皇帝宋钦宗赵桓出生。 ... 食神制殺,大富大贵。 霍啟山出生年月日:1983年5月23日八字:癸亥,丁亥,辛亥。 辛金 ...', '5月23日 · :世界乌龟日 · 1568年 ; 5月24日 · :厄立特里亚独立日(1993年)、保加利亚教师节、圣母进教之佑瞻礼(天主教会). 1822年 ...', '00:11 1100年5月23日,宋朝第九位皇帝宋钦宗赵桓出生。 ... 00:05 1794年德籍波西米亚出生的音乐家,钢琴家、作曲家、教师伊格纳兹·莫谢莱斯(lgnaz Moscheles)。出生于捷克的 ...', '历史上的今天-5月23日. 大事件. 1430年. 在百年战争中,法国民族英雄圣女贞德在贡比 ... 出生名人. 1707年. 卡尔·林奈,瑞典自然学者,现代生物学双名法分类命名的奠基 ...']Thought:我找到了一些在5月23日出生的名人。Final Answer: 5月23日出生的名人有:1052年腓力一世(法兰西国王)、1100年宋钦宗赵桓(北宋皇帝)、1208年西蒙·德孟福尔(英格兰贵族,第六代莱斯特伯爵)、1707年卡尔·林奈(瑞典自然学者,现代生物学双名法分类命名的奠基人)、1908年约翰·巴丁(美国物理学家,晶体管发明者之一)等。> Finished chain.
AI回答:
'5月23日出生的名人有:1052年腓力一世(法兰西国王)、1100年宋钦宗赵桓(北宋皇帝)、1208年西蒙·德孟福尔(英格兰贵族,第六代莱斯特伯爵)、1707年卡尔·林奈(瑞典自然学者,现代生物学双名法分类命名的奠基人)、1908年约翰·巴丁(美国物理学家,晶体管发明者之一)等。'
使用多个工具Tools举例
llm-math工具: 给Agent提供数学相关的计算,比如:当前温度的0.5次方是多少?
例子:
"当前成都的温度是多少华氏度?升高1000米后减少6摄氏度,这个温度的是多少"
Serpapi,搜索当前成都的温度
llm-math,计算这个温度的Calculator
代码:
import osfrom langchain.agents import load_toolsfrom langchain.agents import initialize_agentfrom langchain_community.llms import Tongyi # 导入通义千问Tongyi模型from langchain.agents import AgentType# 你需要在环境变量中添加 DASHSCOPE_API_KEY和 SERPAPI_API_KEY#os.environ["DASHSCOPE_API_KEY"] = '*******'#os.environ["SERPAPI_API_KEY"] = '*******' # 设置通义千问API密钥 这个在自己的系统环境变量里面配置DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY") # 加载 Tongyi 模型llm = Tongyi(model_name="qwen-turbo", dashscope_api_key=DASHSCOPE_API_KEY) # 使用通义千问qwen-turbo模型 # 加载 serpapi, llm-math工具, 因为llm-math要使用LLM,所以后面需要指定LLMtools = load_tools(["serpapi", "llm-math"], llm=llm) """agent:代理类型 zero-shot-react-description: 根据工具的描述和请求内容的来决定使用哪个工具(最常用) react-docstore: 使用 ReAct 框架和 docstore 交互, 使用Search 和Lookup 工具, 前者用来搜, 后者寻找term, 举例: Wipipedia 工具 self-ask-with-search 此代理只使用一个工具: Intermediate Answer, 它会为问题寻找事实答案(指的非 gpt 生成的答案, 而是在网络中,文本中已存在的), 如 Google search API 工具 conversational-react-description: 为会话设置而设计的代理, 它的prompt会被设计的具有会话性, 且还是会使用 ReAct 框架来决定使用来个工具, 并且将过往的会话交互存入内存"""# 工具加载后需要初始化,verbose=True 代表打印执行详情agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) # 运行 agentagent.run("当前成都的温度是多少华氏度?升高1000米后减少6摄氏度,这个温度的是多少")
LangChain思考调用工具过程:
LangChainDeprecationWarning: The method `Chain.run` was deprecated in langchain 0.1.0 and will be removed in 1.0. Use :meth:`~invoke` instead. agent.run("当前成都的温度是多少华氏度?升高1000米后减少6摄氏度,这个温度的是多少")> Entering new AgentExecutor chain...我需要查找当前成都的温度,并将其从摄氏度转换为华氏度。然后,我需要计算升高1000米后减少6摄氏度后的温度,并将其转换为华氏度。Action: SearchAction Input: 当前成都的温度Observation: {'type': 'weather_result', 'temperature': '78', 'unit': 'Fahrenheit', 'precipitation': '10%', 'humidity': '49%', 'wind': '7 mph', 'location': '中国四川省成都市', 'date': 'Friday 6:00 PM', 'weather': 'Cloudy'}Thought:我找到了当前成都的温度为78华氏度。现在我需要将这个温度转换为摄氏度,然后减去6摄氏度,最后再将结果转换回华氏度。Action: CalculatorAction Input: (78 - 32) * 5/9Observation: Answer: 25.555555555555557Thought:我将78华氏度转换为摄氏度,结果为25.56摄氏度(四舍五入)。现在我需要减去6摄氏度,然后将结果转换回华氏度。Action: CalculatorAction Input: 25.56 - 6Observation: Answer: 19.56Thought:我减去了6摄氏度,结果为19.56摄氏度。现在我需要将这个温度转换回华氏度。Action: CalculatorAction Input: 19.56 * 9/5 + 32Observation: Answer: 67.208Thought:我将19.56摄氏度转换为华氏度,结果为67.208华氏度。Final Answer: 当前成都的温度是78华氏度。升高1000米后减少6摄氏度,这个温度是约67.2华氏度。> Finished chain.
AI回答:
'当前成都的温度是78华氏度。升高1000米后减少6摄氏度,这个温度是约67.2华氏度。'
• Chains 和 Agent之前是无状态的,如果你想让他能记住之前的交互,就需要引入Memory
• 可以让LLM拥有短期记忆
对话过程中,记住用户的input 和 中间的output
• BufferMemory将之前的对话完全存储下来,传给LLM
• BufferWindowMemory最近的K组对话存储下来,传给LLM
• ConversionMemory对对话进行摘要,将摘要存储在内存中,相当于将压缩过的历史对话传递给LLM
• VectorStore-backed Memory将之前所有对话通过向量存储到VectorDB(向量数据库)中,每次对话,会根据用户的输入信息,匹配向量数据库中最相似的K组对话
import osfrom langchain.agents import load_toolsfrom langchain.agents import initialize_agentfrom langchain_community.llms import Tongyi # 导入通义千问Tongyi模型from langchain.agents import AgentTypefrom langchain import ConversationChain# 设置通义千问API密钥DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY")# 加载 Tongyi 模型llm = Tongyi(model_name="qwen-turbo", dashscope_api_key=DASHSCOPE_API_KEY) # 使用通义千问qwen-turbo模型# 使用带有memory的ConversationChainconversation = ConversationChain(llm=llm, verbose=True)output = conversation.predict(input="你好!")print(output)
LangChainDeprecationWarning: Please see the migration guide at: https://python.langchain.com/docs/versions/migrating_memory/ self.__pydantic_validator__.validate_python(data, self_instance=self)> Entering new ConversationChain chain...Prompt after formatting:The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.Current conversation:Human: 你好!AI:> Finished chain.
你好!今天过得怎么样?有没有什么我可以帮你的?比如说,我可以分享一些有趣的事实,或者帮你解答问题。如果你对历史感兴趣,我可以告诉你关于古罗马的趣事;如果你喜欢科学,我们可以聊聊宇宙中的黑洞!
output = conversation.predict(input="I'm doing well! 我就想跟 AI进行对话")print(output)
Entering new ConversationChain chain...Prompt after formatting:The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.Current conversation:Human: 你好!AI: 你好!今天过得怎么样?有没有什么我可以帮你的?比如说,我可以分享一些有趣的事实,或者帮你解答问题。如果你对历史感兴趣,我可以告诉你关于古罗马的趣事;如果你喜欢科学,我们可以聊聊宇宙中的黑洞!Human: I'm doing well! 我就想跟 AI进行对话AI:> Finished chain.
太好了,很高兴你想要聊天!? 那我们可以聊点有趣的话题。比如,你知道吗,AI其实也在不断学习中,就像人类一样。不过我的学习主要依赖于数据和算法。你对AI是怎么工作的感兴趣吗?或者,我们也可以聊聊其他话题,像电影、音乐、旅行经历之类的!
Memory和LLM上下文区别:作用是一样的,memory是对llm上下文做了一些管理
其他例子:给公司商品取名字
LLMChain = LLM+Prompt
from langchain.prompts import PromptTemplatefrom langchain_community.llms import Tongyi # 导入通义千问Tongyi模型# 设置通义千问API密钥DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY") # 加载 Tongyi 模型llm = Tongyi(model_name="qwen-turbo", dashscope_api_key=DASHSCOPE_API_KEY) # 使用通义千问qwen-turbo模型# 创建Prompt Templateprompt = PromptTemplate( input_variables=["product"], template="What is a good name for a company that makes {product}?",)from langchain.chains import LLMChain# 创建LLMChain = LLM + promptchain = LLMChain(llm=llm, prompt=prompt)# 传入用户输入的inputchain.run("编写代码")
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-05-27
Langchain创始人最新分享:如何跨越“原型惊艳”到“生产可靠”的鸿沟
2025-05-26
二、LangChain提示词工程
2025-05-24
AI Agent技术原理解析 —— LangManus、Deerflow...
2025-05-21
首个落地案例!WEBTOON 用 LangGraph 构建故事理解 Agent,创作者 AI 时代的范式来了?
2025-05-21
一文学会LangChain搭建Agent工具
2025-05-19
新手必看!LangGraph如何轻松搞定多语言模型协同工作
2025-05-19
LangChain:一个AI应用框架的开发生态
2025-05-19
继MCP、A2A协议之后,又一个Agent协议AG-UI来了
2024-10-10
2024-07-13
2024-06-03
2024-04-08
2024-09-04
2024-04-08
2024-08-18
2024-03-28
2024-06-24
2024-07-10
2025-05-21
2025-05-19
2025-05-08
2025-05-06
2025-04-22
2025-04-18
2025-03-22
2025-03-22