支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


简单实战LangChain多任务应用开发

发布日期:2025-05-26 15:08:32 浏览次数: 1575 作者:雕2画0
推荐语

探索LangChain,打造高效多任务LLM应用。

核心内容:
1. LangChain的核心组件及功能介绍
2. 如何利用LangChain构建知识库
3. LangChain集成工具及自定义工具方法

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家

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)进行问题的解答

例子:

"今天是几月几号?历史上的今天有哪些名人出生"
代码(需要在环境变量中添加 DASHSCOPE_API_KEY和 SERPAPI_API_KEY)
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华氏度。'
Memory

• Chains 和 Agent之前是无状态的,如果你想让他能记住之前的交互,就需要引入Memory

• 可以让LLM拥有短期记忆

对话过程中,记住用户的input 和 中间的output

LangChain中提供了几种短期记忆的方式:

• BufferMemory将之前的对话完全存储下来,传给LLM

• BufferWindowMemory最近的K组对话存储下来,传给LLM

• ConversionMemory对对话进行摘要,将摘要存储在内存中,相当于将压缩过的历史对话传递给LLM

• VectorStore-backed Memory将之前所有对话通过向量存储到VectorDB(向量数据库)中,每次对话,会根据用户的输入信息匹配向量数据库中最相似的K组对话

使用带有memoryConversationChain实例:
跟AI对话:
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)
LangChain思考调用工具过程:
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.
AI回复:
你好!今天过得怎么样?有没有什么我可以帮你的?比如说,我可以分享一些有趣的事实,或者帮你解答问题。如果你对历史感兴趣,我可以告诉你关于古罗马的趣事;如果你喜欢科学,我们可以聊聊宇宙中的黑洞!
继续对话:
output = conversation.predict(input="I'm doing well! 我就想跟 AI进行对话")print(output)
LangChain思考过程:
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其实也在不断学习中,就像人类一样。不过我的学习主要依赖于数据和算法。你对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+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询