LangChain系列文章
- LangChain 实现给动物取名字,
- LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
- LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
- LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
- LangChain 5易速鲜花内部问答系统
- LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
- LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
- LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
- LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
- LangChain 10思维链Chain of Thought一步一步的思考 think step by step
- LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain
- LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
- LangChain 13输出解析Output Parsers 自动修复解析器
- LangChain 14 SequencialChain链接不同的组件
- LangChain 15根据问题自动路由Router Chain确定用户的意图
- LangChain 16 通过Memory记住历史对话的内容
- LangChain 17 LangSmith调试、测试、评估和监视基于任何LLM框架构建的链和智能代理
- LangChain 18 LangSmith监控评估Agent并创建对应的数据库
- LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷
- LangChain 20 Agents调用google搜索API搜索市场价格 Reason Action:在语言模型中协同推理和行动
1. Self-ask with search自问自答与搜索
这个代理利用了一个工具,应该被称为中级答案。这个工具应该能够查找问题的事实答案。最初的自问自答与搜索论文,其中提供了谷歌搜索API作为工具。
Self-ask with search 就相当于把大问题切成小问题,逐步解答。
Agents/chat_agents_self_ask.py
这个演示展示了自问自答和搜索链。
大问题:最近一届奥运会男子100米赛跑冠军的家乡是哪里?
拆解为小问题:
- 最近一届奥运会男子100米赛跑冠军是谁?
- 冠军的家乡在哪里?
# 导入与 OpenAI 语言模型交互的模块。
from langchain.llms import OpenAI
# 导入创建和管理提示模板的模块。
from langchain.prompts import PromptTemplate
# 导入用于初始化代理和定义代理类型的模块。
from langchain.agents import initialize_agent, AgentType
# 导入创建和管理 OpenAI 聊天模型实例的类。
from langchain.chat_models import ChatOpenAI
# 导入用于定义和初始化工具的模块。
from langchain.agents import Tool
# 导入用于包装 SERP API 的实用工具。
from langchain.utilities import SerpAPIWrapper
# 导入 Langchain 的 hub 模块用于拉取预设的提示。
from langchain import hub
# 导入用于格式化代理日志的工具。
from langchain.agents.format_scratchpad import format_log_to_str
# 导入用于解析自问自答(Self-Ask)输出的解析器。
from langchain.agents.output_parsers import SelfAskOutputParser
# 导入用于执行代理的执行器。
from langchain.agents import AgentExecutor
# 从 .env 文件加载环境变量,常用于管理 API 密钥等敏感数据。
from dotenv import load_dotenv
load_dotenv()
# 设置 SERPAPI 的 API 密钥环境变量。
import os
os.environ["SERPAPI_API_KEY"] = 'xxx'
# 初始化 OpenAI 模型。
llm = OpenAI(temperature=0)
# 初始化 SERPAPI 包装器。
search = SerpAPIWrapper()
# 定义工具列表,包括一个中间回答工具,使用搜索功能。
tools = [
Tool(
name="Intermediate Answer",
func=search.run,
description="useful for when you need to ask with search",
)
]
# 从 Langchain hub 拉取预设的提示。
prompt = hub.pull("hwchase17/self-ask-with-search")
# 将 OpenAI 模型与停止标记绑定。
llm_with_stop = llm.bind(stop=["\nIntermediate answer:"])
# 定义一个智能代理,包括输入处理、格式化和输出解析。
agent = (
{
"input": lambda x: x["input"],
"agent_scratchpad": lambda x: format_log_to_str(
x["intermediate_steps"],
observation_prefix="\nIntermediate answer: ",
llm_prefix="",
),
}
| prompt
| llm_with_stop
| SelfAskOutputParser()
)
# 初始化代理执行器,并设置为详细模式。
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 使用代理执行器处理特定查询。
agent_executor.invoke(
{"input": "最近一届奥运会男子100米赛跑冠军的家乡是哪里?"}
)
执行结果
(develop)⚡ [1] % python Agents/chat_agents_self_ask.py ~/Workspace/LLM/langchain-llm-app
> Entering new AgentExecutor chain...
Yes.
Follow up: 最近一届奥运会男子100米赛跑冠军是谁?您可以让系统朗读此内容暂停概要 意大利选手马塞尔·雅各布斯的成绩是9.80秒,获得金牌,他也成为意大利第一位男子百米冠军,也是29年来第一位来自欧洲的百米冠军,这是他几年内第二次打破欧洲选手的纪录,和史蒂夫·穆林斯的世界纪录第10名成绩相同。
Follow up: 马塞尔·雅各布斯的家乡是哪里?拉蒙特·马塞尔·雅各布斯(Lamont Marcell Jacobs),1994年9月26日出生于美国的埃尔帕索(EL PASO),意大利男子田径运动员。
So the final answer is: El Paso, USA
代码
https://github.com/zgpeace/pets-name-langchain/tree/develop
参考
- https://python.langchain.com/docs/modules/agents/