通过 OpenAI 和 Langchain 构建 Arxiv 论文摘要 Twitter 机器人

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 通过 OpenAI 和 Langchain 构建 Arxiv 论文摘要 Twitter 机器人

arXiv 是一个收集物理学、数学、计算机科学、生物学与数理经济学的论文预印本的网站,成立于1991年8月14日。截至2008年10月,arXiv 已收集超过50万篇预印本;至2014年底,藏量达到1百万篇。截至2016年10月,每月提交量超过10,000篇。

arXiv 网站的研究论文每天都在更新,跟上 arXiv 最新科学成就的节奏就成了一件具有挑战的事情。生在这个年代的我们是幸运的,跟上 AI 的潮流,通过使用大型语言模型及其支持应用程序框架(如 Langchain),可以实现自动跟踪 arXiv 论文的新版本。在本教程中,将介绍如何设计一个 Twitter 机器人,发布新论文摘要的推文,让研究人员和人工智能爱好者快速了解最有趣的科学成就或发现。

1、总体设计

先感受一下机器人发送的演示推文:

image.png

Twitter 机器人在功能上称为 arXiv 论文摘要器,由几个无缝协作的关键组件组成。这些组件包括用于检索新论文发布的 arXiv API、用于摘要的 LLMChain 以及带有自定义推文工具的 Langchain 代理,用于执行整个发布过程。

为了更好地理解该机器人内的信息流和操作,下面是整体的架构图:

image.png

在此演示应用程序中,将语言模型在不同步骤中运行两次。第一次运行是使用普通链根据论文摘要生成摘要,第二次运行是要求代理执行推文帖子。显然,第二次运行可以用没有任何 AI 参与的纯程序代码代替,但是,为了演示如何最好地利用生成式 AI 来完成未来更复杂的任务,值得将此任务包装到 Langchain 代理中。

2、代码模块

现在,就来逐步探索使这个推文机器人的代码工作流程。将深入研究每个步骤,提供代码片段和解释,以确保顺利实施。

arXiv API

arXiv 是康奈尔大学图书馆的一个流行的在线存储库,存储物理、数学、计算机科学等各个领域的科学论文。它为研究人员在正式同行评审和在传统科学期刊上发表之前分享他们的工作提供了一个平台。arXiv 上托管的论文可以免费向公众开放,让研究人员和技术爱好者能够及时了解最新的研究进展。

arXiv 还提供对其资源的 API 访问,可以通过 Python 调用API定期下载所需的论文及其关键数据。

安装软件包:


pip install arxiv

搜索关于 language model 的最新论文。


import arxiv
def arxiv_search():
    summary = ''
    search = arxiv.Search(
      query = "language model",
      max_results = 1,
      sort_by = arxiv.SortCriterion.SubmittedDate
    )
    for result in search.results():
        summary = f"Title: {result.title}, Abstract: {result.summary}, URL: {result.entry_id}"
    return summary

代码通过 API 在 arXiv 数据库上执行 search() 检索与查询匹配关于 language model 的最新论文,结果按提交日期排序。

然后迭代搜索结果,对于每个结果,它将论文的标题、摘要和 URL 附加到将用于后续文本摘要步骤的 summary 字符串。

有关 arXiv API 的更详细用法,可以在这里找到它们。

使用 LLMChain 进行摘要

现在,将实现一个简单的 LLM 链来自动处理动态提示,要求 gpt-3.5-turbo 模型在 arXiv 抽象上下文上生成摘要。

安装软件包:


pip install langchain openai

将 OpenAI API 密钥设置为环境。


os.environ["OPENAI_API_KEY"] = "{Your_API_Key}"

创建一个好的提示模板(始终是最重要的)。


prompt_tweet_template = """
You are a AI technology blogger who write regular tweets for shortly summarizing new papers on Arxiv about language
model topics. You write summary for tweets based on text with content of Title, Abstract, URL: ##start {text} ##end
Your write a 50-word quick summary including key information from the Title and Abstract, then, attach the URL after summary.
Summary: 
"""

使用模型 gpt-3.5-turbo 和提示模板 PROMPT_TWEET 创建 LLMChain


from langchain import PromptTemplate, LLMChain
from langchain.chat_models import ChatOpenAI
PROMPT_TWEET = PromptTemplate(template=prompt_tweet_template, input_variables=["text"])
llm = ChatOpenAI(temperature=0.5)
tweet_chain = LLMChain(llm=llm, prompt=PROMPT_TWEET,verbose=True)

arxiv_search() 提供最新 arXiv 论文的摘要字符串。


new_paper = arxiv_search()
tweet_body = tweet_chain.run(new_paper)

现在有了一条不错的推文,其中包含 arXiv 论文摘要 tweet_body ,接下来就准备发送。

Twitter API

要获得 Twitter API 的许可,必须登录 Twitter 开发者平台创建一个项目及其应用程序,以方便机器人稍后调用它们的 API。

开发者平台的 URL:developer.twitter.com/en/portal/

image.png

如果开发者免费账户,则只能创建包含一个应用程序的项目。重命名项目应用程序后,找到钥匙图标,然后单击,将重定向到该应用程序的Keys and tokens页面。

image.png

单击 GenerateRegenerate 按钮生成密钥,然后将 consumer_keyconsumer_secret 复制到将在后续步骤中使用的安全位置。

以下代码演示了如何通过密钥和 secret 授权获得对 Twitter API 的完全访问权限。

安装软件包


pip install requests requests_oauthlib

通过授权来初始化 Twitter 会话。


def tweet_init():
    consumer_key = "{Your_consumer_key}"
    consumer_secret = "{Your_consumer_secret}"
    # Get request token
    request_token_url = "https://api.twitter.com/oauth/request_token?oauth_callback=oob&x_auth_access_type=write"
    oauth = OAuth1Session(consumer_key, client_secret=consumer_secret)
    print(oauth)
    try:
        fetch_response = oauth.fetch_request_token(request_token_url)
    except ValueError:
        print(
            "There may have been an issue with the consumer_key or consumer_secret you entered."
        )
    resource_owner_key = fetch_response.get("oauth_token")
    resource_owner_secret = fetch_response.get("oauth_token_secret")
    print("Got OAuth token: %s" % resource_owner_key)
    # Get authorization
    base_authorization_url = "https://api.twitter.com/oauth/authorize"
    authorization_url = oauth.authorization_url(base_authorization_url)
    print("Please go here and authorize: %s" % authorization_url)
    verifier = input("Paste the PIN here: ")
    # Get the access token
    access_token_url = "https://api.twitter.com/oauth/access_token"
    oauth = OAuth1Session(
        consumer_key,
        client_secret=consumer_secret,
        resource_owner_key=resource_owner_key,
        resource_owner_secret=resource_owner_secret,
        verifier=verifier,
    )
    oauth_tokens = oauth.fetch_access_token(access_token_url)
    access_token = oauth_tokens["oauth_token"]
    access_token_secret = oauth_tokens["oauth_token_secret"]
    oauth = OAuth1Session(
        consumer_key,
        client_secret=consumer_secret,
        resource_owner_key=access_token,
        resource_owner_secret=access_token_secret,
    )
    return oauth
mytweet = tweet_init()

此代码片段设置使用 OAuth 1.0 访问 Twitter API 的身份验证过程。它涉及获取授权所需令牌的几个步骤。

  • 首先使用 fetch_request_token() 方法从 Twitter 的 API 请求临时请求令牌 resources_ownertokensecret
  • 生成一个临时 URL,用于提供 PIN 码,希望用户在终端提示中输入如下所示的内容:

请前往此处授权:https://api.twitter.com/oauth/authorize?oauth_token=jvPdHgAAAAABofwiAAABiRDFU_MPIN 码粘贴到此处:{Input the PIN display on above link}

  • 使用 PIN 码作为 verifier,与其他两个 token/secret 对一起请求一对访问 token/secret
  • 最后,使用获得的 access tokensecret 重新配置 OAuth1Session 实例。此重新配置允许使用 Twitter 帐户对 Twitter API 的后续请求进行身份验证。

在应用程序被授予对 API 的访问权限后,只需编写一个函数 tweet_send() 即可通过授权实例 mytweet 发布包含有效负载内容的推文。


def tweet_send(payload):
    payload_json = {"text": payload}
    # Making the request
    response = mytweet.post(
        "https://api.twitter.com/2/tweets",
        json=payload_json,
    )
    if response.status_code != 201:
        raise Exception(
            "Request returned an error: {} {}".format(response.status_code, response.text)
        )
    return  response.status_code

Langchain 代理创建

最后一步是创建一个运行 ReAct 来发布推文的 Langchain 代理。

导入必要的模块。


from langchain.agents import AgentType, initialize_agent
from langchain.tools import BaseTool, StructuredTool, Tool, tool
from pydantic import BaseModel, Field
from typing import Optional, Type
from langchain.callbacks.manager import (
    AsyncCallbackManagerForToolRun,
    CallbackManagerForToolRun,
)

创建从 BaseTool 派生的名为 TweetSendTool 的工具来调用外部函数 tweet_send(payload)


class TweetSendInput(BaseModel):
    payload: str = Field(..., description="This is the content of tweet to be sent.")
class TweetSendTool(BaseTool):
    name = "Tweet Send"
    description = "useful for when you need to send a tweet"
    def _run(
        self, payload: str, run_manager: Optional[CallbackManagerForToolRun] = None
    ) -> str:
        """Use the tool."""
        return tweet_send(payload)
    async def _arun(
        self, payload: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None
    ) -> str:
        """Use the tool asynchronously."""
        raise NotImplementedError("Tweet send does not support async")
    args_schema: Type[BaseModel] = TweetSendInput

从在前面的步骤中创建的现有工具和 llm 创建代理。


tools = [TweetSendTool()]
agent = initialize_agent(
    tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)

构建一个像样的提示模板,用于从备用 arXiv 摘要 tweet_body 到推文发布方法的连接。


instructions = f"""
    Post a tweet with the summary of Arxiv paper, use the common Twitter expression style, and with '#AI #arXiv', and provide URL at the end.
    The summary: {tweet_body}
"""

运行代理。


agent.run(instructions)

每次代理运行时,Twitter 上都会发布一条推文,其中总结了最新 arXiv 论文中有关语言模型主题的关键信息。不足的是每次都需要授权 PIN 码,免费的 Twitter API 没办法实现自动执行发布。


相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
1月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
255 2
|
18天前
|
JSON 数据可视化 NoSQL
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
本文介绍了LangChain的LLM Graph Transformer框架,探讨了文本到图谱转换的双模式实现机制。基于工具的模式利用结构化输出和函数调用,简化了提示工程并支持属性提取;基于提示的模式则为不支持工具调用的模型提供了备选方案。通过精确定义图谱模式(包括节点类型、关系类型及其约束),显著提升了提取结果的一致性和可靠性。LLM Graph Transformer为非结构化数据的结构化表示提供了可靠的技术方案,支持RAG应用和复杂查询处理。
67 2
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
|
8天前
|
XML 算法 自动驾驶
ROS进阶:使用URDF和Xacro构建差速轮式机器人模型
【11月更文挑战第7天】本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。
|
1月前
|
人工智能 API
LangChain-14 Moderation OpenAI提供的功能:检测内容中是否有违反条例的内容
LangChain-14 Moderation OpenAI提供的功能:检测内容中是否有违反条例的内容
38 2
|
2月前
|
人工智能 自然语言处理 API
深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
我们小时候都玩过乐高积木。通过堆砌各种颜色和形状的积木,我们可以构建出城堡、飞机、甚至整个城市。现在,想象一下如果有一个数字世界的乐高,我们可以用这样的“积木”来构建智能程序,这些程序能够阅读、理解和撰写文本,甚至与我们对话。这就是大型语言模型(LLM)能够做到的,比如 GPT-4,它就像是一套庞大的乐高积木套装,等待我们来发掘和搭建。
104 1
|
1月前
|
人工智能 自然语言处理 机器人
用Python构建你的第一个聊天机器人
【10月更文挑战第7天】在这篇文章中,我们将一起探索如何利用Python编程语言和AI技术,一步步打造一个基础的聊天机器人。无论你是编程新手还是有一定经验的开发者,都能通过这个指南获得启发,并实现一个简单的对话系统。文章将引导你理解聊天机器人的工作原理,教你如何收集和处理用户输入,以及如何设计机器人的响应逻辑。通过动手实践,你不仅能够学习到编程技能,还能深入理解人工智能在语言处理方面的应用。
34 0
|
3月前
|
Python
Langchain使用OpenAI报错AttributeError: module ‘openai‘ has no attribute ‘error 的解决方案
这篇文章描述了作者在使用Python的`openai`和`langchain`库时遇到的错误,错误的提示是`AttributeError: module 'openai' has no attribute 'error'`。文章通过分析环境和版本信息,发现问题出在`langchain`库的版本过旧。作者通过卸载旧版本并安装指定版本的`langchain`库解决了问题,并总结了在遇到此类问题时检查和更新依赖库的重要性。
365 1
|
3月前
|
Apache UED 数据安全/隐私保护
揭秘开发效率提升秘籍:如何通过Apache Wicket组件重用技巧大翻新用户体验
【8月更文挑战第31天】张先生在开发基于Apache Wicket的企业应用时,发现重复的UI组件增加了维护难度并影响加载速度。为优化体验,他提出并通过面板和组件重用策略解决了这一问题。例如,通过创建`ReusableLoginPanel`类封装登录逻辑,使得其他页面可以轻松复用此功能,从而减少代码冗余、提高开发效率及页面加载速度。这一策略还增强了应用的可维护性和扩展性,展示了良好组件设计的重要性。
57 0
|
3月前
|
人工智能 自然语言处理 机器人
掌握未来沟通的艺术:运用TensorFlow与自然语言处理(NLP)技术,从零开始构建你的专属智能对话机器人,让机器理解你的一言一行
【8月更文挑战第31天】本文详细介绍如何利用TensorFlow与自然语言处理技术开发对话机器人。从准备问答数据集开始,通过预处理、构建Seq2Seq模型、训练及预测等步骤,最终实现了一个简易的聊天机器人。示例代码涵盖数据加载、模型搭建及对话功能,适合希望在实际项目中应用AI技术的开发者参考。
47 0
|
3月前
|
人工智能 自然语言处理 前端开发
LangChain 构建问题之MetaGPT 和 ChatDev 的支持功能差异如何解决
LangChain 构建问题之MetaGPT 和 ChatDev 的支持功能差异如何解决
63 0