前提
OpenAI api还有额度,否则会报错:
Error Code 429 - You exceeded your current quota, please check your plan and billing details.
https://help.openai.com/en/articles/6891831-error-code-429-you-exceeded-your-current-quota-please-check-your-plan-and-billing-details
刚发现我额度过期了,暂不贴运行结果了
问答
用 LangChain 加载 OpenAI 的模型,并且完成一次问答
import os
from langchain.llms import OpenAI
os.environ["OPENAI_API_KEY"] = 'sk-UWc6x**********iGUuGT3BlbkFJ18eb0jpOFCPNKiyqLZpI'
llm = OpenAI(model_name="text-davinci-003", max_tokens=1024)
llm("怎么评价人工智能")
模型+联网搜索
通过 Google 搜索并返回答案
import os
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAI
from langchain.agents import AgentType
os.environ["OPENAI_API_KEY"] = 'sk-********************************'
os.environ["SERPAPI_API_KEY"] = '49da8858d587cb5e5f1452c224421d7084a********************************'
# 加载 OpenAI 模型
llm = OpenAI(temperature=0,max_tokens=2048)
# 加载 serpapi 工具
tools = load_tools(["serpapi"])
# 如果搜索完想再计算一下可以这么写
# tools = load_tools(['serpapi', 'llm-math'], llm=llm)
# 如果搜索完想再让他再用python的print做点简单的计算,可以这样写
# tools=load_tools(["serpapi","python_repl"])
# 工具加载后都需要初始化,verbose 参数为 True,会打印全部的执行详情
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# 运行 agent
agent.run("What's the date today? What great events have taken place today in history?")
AgentType
- 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 框架来决定使用来个工具, 并且将过往的会话交互存入内存
长文本总结
import os
from langchain.document_loaders import UnstructuredFileLoader
from langchain.chains.summarize import load_summarize_chain
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain import OpenAI
os.environ["OPENAI_API_KEY"] = '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'
# 导入文本
loader = UnstructuredFileLoader("abc.txt")
# 将文本转成 Document 对象
document = loader.load()
print(f'documents:{len(document)}')
# 初始化文本分割器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 500,
chunk_overlap = 0
)
# 切分文本
split_documents = text_splitter.split_documents(document)
print(f'documents:{len(split_documents)}')
# 加载 llm 模型
llm = OpenAI(model_name="text-davinci-003", max_tokens=1500)
# 创建总结链
chain = load_summarize_chain(llm, chain_type="refine", verbose=True)
# 执行总结链
chain.run(split_documents[:5])
text_splitter的chunk_overlap参数
这个是指切割后的每个 document 里包含几个上一个 document 结尾的内容
text_splitter
https://python.langchain.com/en/latest/modules/indexes/text_splitters.html
chain 的 chain_type参数
stuff
:这种最简单粗暴,会把所有的 document 一次全部传给 llm 模型进行总结
map_reduce
:分割后的每个Document分别进行总结,然后对所有Document总结的结果再进行总结
refine
:总结后一个 document 的时候,会带着前一个的 document 进行总结,给需要总结的 document 添加了上下文,增加了总结内容的连贯性。
map_rerank
:用于问答系统
总结:了解了一下使用,通过使用进一步加深对相关概念的理解