仔细写好每一篇文章

装置

pip install openai -i pypi.douban.com/simple –trusted-host pypi.douban.com

pip install langchain -i pypi.douban.com/simple –trusted-host pypi.douban.com

pip install urllib3==1.25.11 -i pypi.douban.com/simple –trusted-host pypi.douban.com

import os
from langchain.llms import OpenAI
os.environ["OPENAI_API_KEY"] = 'xxx'
llm = OpenAI(model_name="text-davinci-003", max_tokens=1024)
result = llm("怎么点评人工智能")
print(result)

回来成果

人工智能是一种具有智能的技能,它能够让机器像人相同做出智能的决议和举动,然后进步生产力和服务质量。现在,人工智能现已发展到深度学习范畴,能够让机器自主学习,有效地解决复杂的问题,为社会发展做出奉献。总归,人工智能是一种极具前景的技能,具有重要的社会意义。

问题

rbody, rcode, resp.data, rheaders, stream_error=stream_error openai.error.AuthenticationError:

看看你openKey 好使不,假如不好使,我这有库存,也能够百度 找个好使的chatgpt 号

经过 Google 查找并回来答案

这里咱们需求借助 Serpapi 来进行完成,Serpapi 供给了 google 查找的 api 接口。

首要需求咱们到 Serpapi 官网上注册一个用户,serpapi.com/ 并复制他给咱们生成 api key。

推荐运用 Github登录

LangChain 入门(一) 搭建本地知识库

先履行 pip install google-search-results -i pypi.douban.com/simple –trusted-host pypi.douban.com


import os
os.environ\["OPENAI\_API\_KEY"] = '你的api key'
os.environ["SERPAPI_API_KEY"] = '你的api key'
from langchain.agents import load\_tools
from langchain.agents import initialize\_agent
from langchain.llms import OpenAI
from langchain.agents import AgentType
# 加载 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?")

LangChain 入门(一) 搭建本地知识库

咱们能够看到,他正确的回来了日期(有时差),并且回来了历史上的今天。

在 chain 和 agent 目标上都会有 verbose 这个参数,这个是个十分有用的参数,开启他后咱们能够看到完整的 chain 履行进程。

能够在上面回来的成果看到,他将咱们的问题拆分成了几个进程,然后一步一步得到终究的答案。

关于agent type 几个选项的意义(了解不了也不会影响下面的学习,用多了自然了解了):

  • zero-shot-react-description: 依据东西的描绘和请求内容的来决议运用哪个东西(最常用)
  • react-docstore: 运用 ReAct 结构和 docstore 交互, 运用SearchLookup 东西, 前者用来搜, 后者寻觅term, 举例: Wipipedia 东西
  • self-ask-with-search 此署理只运用一个东西: Intermediate Answer, 它会为问题寻觅事实答案(指的非 gpt 生成的答案, 而是在网络中,文本中已存在的), 如 Google search API 东西
  • conversational-react-description: 为会话设置而规划的署理, 它的prompt会被规划的具有会话性, 且仍是会运用 ReAct 结构来决议运用来个东西, 并且将过往的会话交互存入内存

reAct 介绍能够看这个:arxiv.org/pdf/2210.03…

LLM 的 ReAct 形式的 Python 完成: til.simonwillison.net/llms/python…

agent type 官方解释:

python.langchain.com/en/latest/m…

有一点要说明的是,这个 serpapi 形似对中文不是很友爱,所以提问的 prompt 主张运用英文。

当然,官方现已写好了 ChatGPT Plugins 的 agent,未来 chatgpt 能用啥插件,咱们在 api 里边也能用插件,想想都美滋滋。

不过现在只能运用不用授权的插件,等待未来官方解决这个。

感兴趣的能够看这个文档:python.langchain.com/en/latest/m…

对超长文本进行总结

假如咱们想要用 openai api 对一个段文本进行总结,咱们一般的做法便是直接发给 api 让他总结。可是假如文本超过了 api 最大的 token 限制就会报错。

这时,咱们一般会进行对文章进行分段,比方经过 tiktoken 核算并分割,然后将各段发送给 api 进行总结,终究将各段的总结再进行一个悉数的总结。

假如,你用是 LangChain,他很好的帮咱们处理了这个进程,使得咱们编写代码变的十分简略。

先履行 pip install unstructured -i pypi.douban.com/simple –trusted-host pypi.douban.com

pip install pdf2image -i pypi.douban.com/simple –trusted-host pypi.douban.com

代码

    from langchain.document_loaders import UnstructuredFileLoader
from langchain.chains.summarize import load_summarize_chain
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain import OpenAI
# 导入文本
loader = UnstructuredFileLoader("/content/sample_data/data/lg_test.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)
# 履行总结链,(为了快速演示,只总结前5段)
chain.run(split_documents[:5])

终究输出了对前 5 个 document 的总结。

这里有几个参数需求注意:

文本分割器的 chunk_overlap 参数

这个是指切开后的每个 document 里包括几个上一个 document 结尾的内容,首要作用是为了添加每个 document 的上下文相关。比方,chunk_overlap=0时, 第一个 document 为 aaaaaa,第二个为 bbbbbb;当 chunk_overlap=2 时,第一个 document 为 aaaaaa,第二个为 aabbbbbb。

不过,这个也不是肯定的,要看所运用的那个文本分割模型内部的详细算法。

文本分割器能够参阅这个文档:python.langchain.com/en/latest/m…

chain 的 chain_type 参数

这个参数首要操控了将 document 传递给 llm 模型的方法,一共有 4 种方法:

stuff: 这种最简略粗暴,会把所有的 document 一次悉数传给 llm 模型进行总结。假如document许多的话,必然会报超出最大 token 限制的错,所以总结文本的时分一般不会选中这个。

map_reduce: 这个方法会先将每个 document 进行总结,终究将所有 document 总结出的成果再进行一次总结。

LangChain 入门(一) 搭建本地知识库

refine: 这种方法会先总结第一个 document,然后在将第一个 document 总结出的内容和第二个 document 一起发给 llm 模型在进行总结,以此类推。这种方法的好处便是在总结后一个 document 的时分,会带着前一个的 document 进行总结,给需求总结的 document 添加了上下文,添加了总结内容的连贯性。

LangChain 入门(一) 搭建本地知识库

map_rerank: 这种一般不会用在总结的 chain 上,而是会用在问答的 chain 上,他其实是一种查找答案的匹配方法。首要你要给出一个问题,他会依据问题给每个 document 核算一个这个 document 能回答这个问题的概率分数,然后找到分数最高的那个 document ,在经过把这个 document 转化为问题的 prompt 的一部分(问题+document)发送给 llm 模型,终究 llm 模型回来详细答案。

资料来历

感谢 liaokong.gitbook.io/llm-kai-fa-…

代码

github.com/a25017012/L…

只是其demo的代码