分享好友 最新资讯首页 最新资讯分类 切换频道
生成式AI -大模型Claude 和 LangChain 教程:构建由搜索驱动的个人助理应用
2024-11-07 21:17

本文转自:躺平猫猫

生成式AI -大模型Claude 和 LangChain 教程:构建由搜索驱动的个人助理应用

本文讲述如何利用 LangChain 并在其之上使用 Anthropic 的 Claude 大模型, 结合Python 和 ReactJS 构建由搜索驱动的个人助理 AI 应用

这里先讲一下,我为啥要用Claude, 而不是ChatGPT。据我自己的感受

1 Claude是嵌在Slack中使用,很方便,只需要在登录Slack的时候要用下梯子,其余的时候是无障碍使用的

2 Claude 比较实事求是,比如问 秦始皇是罗马帝国第几任皇帝,Claude会告知这个问题是错误的,但是ChatGPT会直接给出一个头头是道的虚拟故事

Claude 介绍

Anthropic是一个专注于开发先进AI系统的研究机构。Claude是其研制的大模型产品, 旨在提供诚实可靠无害的新一代AI助手。该模型在各种任务中需要确保高度的可靠性和可预测性。

Claude的主要功能包括:

  • 全面的对话和文本处理能力
  • 将用户安全和隐私放在首要位置

Claude的主要使用场景:

  • - 摘要生成
  • - 搜索引擎
  • - 创意和协作式写作
  • - 问答
  • - 编程辅助

Claude是跨领域应用的理想AI工具, 能够赋能不同领域的用户。

Claude和ChatGPT的主要区别

1. 训练数据不同:

  • Claude主要通过对话进行监督训练,注重提高交互的一致性和安全性。
  • ChatGPT通过自监督在大规模文本数据上进行预训练,更关注知识的广度

2. 能力定位不同:

  • Claude定位为辅助工具,旨在提供有用、真实、无害的帮助。
  • ChatGPT侧重娱乐交互,可能生成具有欺骗性或有害信息的文本。

3. 使用方式不同:

  • Claude提供API接入,需要在后端对其进行封装和控制。
  • ChatGPT直接面向终端用户,交互更自由开放。

4. 系统设计不同:

  • Claude在模型和系统层面都加入了对安全性和可控性的考量。
  • ChatGPT主要关注交互的流畅性和人类化程度。

总体来说,Claude更注重可靠性、安全性,ChatGPT更注重自然交互和知识丰富度。两者有各自的侧重点和使用场景。

LangChain 介绍

LangChain是一个用于构建端到端大语言模型应用的通用工具。它提供了健壮的框架, 简化了创建、管理和部署大语言学习模型(LLM)的过程。

LLM是专门为理解、生成人类语言而设计的先进AI模型。

LangChain的主要功能包括:

  • 高效管理LLM的提示
  • 能够为复杂工作流创建任务链
  • 为AI添加状态,允许它记住以往的交互信息

这些功能使得LangChain成为一个强大且易于使用的平台,可以利用大语言模型提升各种应用的能力。


学习本文需要提前掌握的知识

  • Python基础
  • Typescript和/或React基础
  • 可访问Anthropic的Claude API
  • 可访问SerpApi的网络搜索API 

步骤大纲

  1. 初始化项目

  2. 使用Claude和LangChain构建AI助手App的前端

  3. 编写项目文件

  4. 测试AI助手App 

初始化项目

1. 安装 Flask 

 

2. 创建工作目录

 

3. 设置虚拟环境(可选),在使用Python项目时,使用虚拟环境是个好习惯。可以使用`venv`来创建一个虚拟环境,这样可以将项目的依赖隔离在单独的环境中,避免污染全局Python环境

 

4. 创建 main.py 文件

 

5. 在main.py文件中编写 Flask代码:​​​​​​​

 

6. 运行该代码

 

7. 打开浏览器,输入http://127.0.0.1:5000,将看到 "Hello, World!",此时说明Flask项目创建成功

管理环境变量 

1. 安装python-dotenv and langchain

使用python-dotenv包来控制.env 文件,可以方便的管理环境变量。同时也需要安装langchain包

 

2. 创建.env文件​​​​​​​

 

3. 在文件中添加环境变量​​​​​​​

 

获取Claude API key 的地址 https://console.anthropic.com/chat

获取SerpAPI key 的地址 https://serpapi.com/dashboard

4. 加载环境变量​​​​​​​

 

5.不要在版本控制中共享敏感信息,例如秘钥。如果使用 Git,请在 .gitignore 文件中添加以下内容:

 

这样可以避免意外地提交包含敏感信息的 .env 文件到版本仓库中。

现在,Flask 项目已经设置好了从 .env 文件中加载环境变量。你可以根据需要添加更多变量,并通过 os.environ.get('KEY') 访问它们。切记勿将 .env 文件提交到版本控制中。

使用Claude和LangChain构建AI助手App的前端

本教程会涉及Node.js、npm、React和Typescript相关知识。

同时,将Anthropic的Claude模型和LangChain这两种强大的AI技术进行结合,演示如何生成准确的、近似人类的的文本语言。

安装 Node.js 和 NPM

1. 下载安装 Node.js (https://nodejs.org).

2. 使用如下命令检查是否安装成功​​​​​​​

 

设置项目环境

安装 Create React App

Create React App (CRA - https://reactjs.org/docs/create-a-new-react-app.html#create-react-app) 是一个命令行工具,可以用来创建一个全新的React.js应用,可以通过npm进行全局安装,很方便地为我们生成一个 React 项目的基础结构和配置。

 

使用Typescript创建新的React 项目 

使用带有Typescript模板的CRA来创建一个名为`ai-assistant-claude`的新项目。

 

这个命令在当前的目录下创建一个名为 ai-assistant-claude 的新目录,其中包含一个支持Typescript的新的React应用程序

集成 TailwindCSS

本教程中的步骤基于 官方Tailwind CSS文档

(https://tailwindcss.com/docs/guides/create-react-app)。

使用如下命令进行安装​​​​​​​

 

配置模版路径

Next, we configure our template paths by adding them to the `tailwind.config.js` file. The `++` signifies the lines you'll be adding:

请参考以下在tailwind.config.js文件中配置模板路径的步骤, 标记的是需要添加的代码行:​​​​​​​

 

最后我们需要在 https://blog.csdn.net/u011537073/article/details/src/index.css 文件中为Tailwind的各个层添加 @tailwind 指令:​​​​​​​

 

Tailwind CSS 集成完毕

安装必须的类库

在开始编程之前,先安装好必须的类库,包括`fontawesome`, `react-markdown`, `axios`, and `react-hook-form`。

安装FontAwesome​​​​​​​

 

安装 React Markdown 

 

项目编程

为之前初始化的Flask应用程序添加新的端点`/ask`和`/search`,它们将分别用于我们的简单聊天和高级聊天功能(后者由谷歌搜索结果提供支持)。

首先导入必要的模块:​​​​​​​

 

上述代码导入需要的包,初始化Flask应用程序

开发后端

创建端点(`/`)​​​​​​​

 

访问根URL, 如果显示"Hello, World!",表明程序运行成功。

创建 `/ask` 端点

这个端点会读取请求中的 JSON 数据,包含用户的消息和对话 ID。使用 LangChain 库和Claude大模型来理解消息并生成响应。

这就是一个基本的聊天机器人端点的实现。可以进一步扩展这个端点,添加更多的自然语言处理能力。​​​​​​​

 

从请求中提取消息

检查并提取消息​​​​​​​

 

生成响应

以下代码使用LangChain的`ChatAnthropic()`模型和`ChatpromptTemplate`来生成聊天响应。对话历史记录使用`ConversationBufferMemory`来存储。​​​​​​​

 

发送响应​​​​​​​

 

创建`/search` 端点/search 端点与 /ask 类似,但包含了搜索功能,可以提供更详细的回复。我们可以使用 SerpAPIWrapper 来添加这个功能​​​​​​​

 

运行 Flask App

最后添加标准的引导代码来运行Flask应用:​​​​​​​

 

测试

全部的后端代码如下所示​​​​​​​

 

运行该应用

 

命令行显示如下信息,即表示成功

现在,让我们来测试一下这两个端点 /ask 和 /search。为了区分这两个端点的功能,我们发送相似的 payload 给它们。

首先,我们调用 /ask 端点,发送以下 payload。问题是关于游戏“塞尔达传说-旷野之息 ”的续集,它并不会给出正确的答案。这是在意料之中的,因为这个Claude大模型只训练到2021年底,当时还没有续集的官方消息。

 端点的实现更复杂一些,它利用了 Agent。通过 Agent,我们可以给 AI 更多的决策能力,提供比仅仅使用自己的大模型更多的工具,就像上一个案例,单独的大模型存在缺陷。

下图是演示使用 `/search` 端点

答案是王国之泪,这回正确了。

其背后的工作知见下图的日志。

有意思的是,这次AI模型没有立即回答,而是在沉思该如何回答。它在从网页搜索结果中得出“根据新闻搜索看来已经宣布了一个名为《塞尔达传说:王国之泪》的续作”的结论后,决定给出回答

按照这个逻辑,我们难道不应该直接使用 /search 端点吗?因为它更准确,更智能?其实并不是这样。

仅仅依靠搜索引擎的结果来回答问题确实更直接和精准,但是聊天机器人还需要结合对话历史和上下文来进行推理,使对话更加连贯自然。我们不能仅仅依赖 /search 端点,还需要让机器人“记住”之前的对话,并基于这些上下文进行回答。这可以让聊天机器人更像是一个有连贯思维的个体,使沟通更加顺畅。机器人对话能力的提升不仅仅依靠提高搜索准确度,还需要结合对话上下文。

下面来实验一下/search端点能否记住之前问过的问题

这种情况发生的原因是,LangChain库虽然有记忆链功能可以用来保留过去的对话,但构建在其上的web服务器和REST API服务本质上是无状态的。这意味着,web服务器将把每一个请求都当作一个新的请求来对待

即使我们已经将之前的对话内容放入payload了。但LangChain中使用的Agent链目前还不支持处理复合prompt,复合prompt由用户和AI的请求与响应组成。我们主要将其用来为大模型提供示例对话,进一步调整模型以产生我们期望的响应。另一方面,Agent的工作方式是接收一个单独的指令并围绕它展开思考。这就是为什么,无论我们的对话多长,agent都只会响应最新的请求。

再来看看/ask端点的反应

这次,它的回答是基于之前对话的上下文了。到这里我们已经意识到,我们需要用两个端点同时来构建我们的 AI 助手应用程序。但是我们如何将/ask 端点(过时但有记忆的 )与 /search 端点(健忘但最新的)结合在一起呢?方法就是构建前端。

前端可以使/ask端点提供连续对话的记忆能力和/search端点提供最新信息的能力巧妙地结合起来。

开发前端

创建文件 App.tsx​​​​​​​

 

在上面的代码中,我们导入了`ChatClient`组件,这个组件会在后续步骤中创建。然后我们在`<div>元素中包含了<ChatClient/>`组件。后续React会使用这些组件。

创建文件 ChatClient.tsx​​​​​​​

 

这个组件是我们AI助手的主用户界面。它包含了一个`ChatHistory`组件来显示对话历史,和一个`ChatInput`组件用于输入文本。这个组件会处理来自`ChatInput`的输入,然后向后端发送请求,显示加载状态。如果请求成功的话,该组件还将显示从后端收到的响应。

创建文件 ChatHistory.tsx​​​​​​​

 

幸运的是,TailwindCSS提供了内置的工具类可以实现简单的动画,比如 。这个类可以优雅地表示一个请求正在等待响应。在这个组件中,我们还将“用户”和“助手”消息的位置分开了。

创建文件 ChatInput.tsx​​​​​​​

 

最后,我们在文本输入框添加了两个按钮。第一个按钮用于将输入内容发送到`/ask`端点,该端点将使用AI大模型处理输入,并没有做任何额外的增强。这个端点是具有上下文意识的。第二个按钮名称为“询问并搜索”,它会将输入内容发送到`/search`端点。除了通过AI大模型处理输入之外,如果情况需要,这个按钮还会触发AI驱动的网络搜索。

创建文件 index.html​​​​​​​

 

`index.html`页面中更新应用的标题,改为“Claude AI助手”

创建文件 package.json​​​​​​​

 

最后,在`package.json`文件中添加了一个代理配置,并将其设置为`http://localhost:5000`。这有助于我们绕过使用不同端口所产生的CORS限制

测试 AI 助手 App

启动后端程序

 

在浏览器中访问  `localhost:3000`.

测试的问题是, 如龙游戏的续作(2021年还没有宣布发布)。另外,还要问这个游戏是否会包含前作中深受玩家喜爱的桐生一马。点击“询问”按钮

等待中

AI的回答显然错了。《如龙:Like a Dragon》确实是最新的如龙游戏,但主角是春日一番,不是桐生一马。我们再来重新提问,这次使用“询问并搜索”按钮。

这次,AI花费了更长的时间来决定是否需要搜索网络。在确定需要进行网络搜索并找到满意的答案后,它将信息返回给了前端

这回的答案是对的,感兴趣的可以自行搜索下官方的宣传进行对照。我对日本游戏不太有研究,不强行翻译游戏名称了。

这个由大型语言模型驱动的代理可以根据可用的资源(搜索)预测下一步的操作,并给出满意的答案。LangChain的封装,使得对“链式”模型、提示以及代理其他工具的应用变得异常简单。

总结

本次教程中,我们展示了LangChain与Claude大语言模型结合使用时的强大威力。强调了LangChain的关键特性,如提示模板、模型、记忆和代理。有了这种通用抽象,可以轻松快捷的将各种AI大模型集成起来以驱动应用的AI化。

一开始,展示了使用默认提示来创建AI助手是多么简单,方法是链式调用对话历史,并通过`/ask`端点发送给大模型。然后继续展示了AI代理在做出特定决策方面的能力。在`/search`端点,我们向助手提出了问题,同时提供了搜索工具来进一步在互联网上探索满意的答案。

最新文章
【系统架构设计】计算机网络
OSI/RM 结构模型 1977年,国际标准化组织为适应网络标准化发展的需求,制定了开放系统互联参考模型(Open System Interconnectio
全世界规模最大战争排名,第一名居然是清朝时期!
自打人类走上进化这条路,就想着法儿想要证明【一伙人就该被另一伙人支配】。古罗马角斗士时代一方有多大势力,就看他有多少人的
python tk随机内容生成器
MyRandom ran=new MyRandom();System.out.println(ran.nextString(1));System.out.println(ran.nextString(50, OnlyNum));System
ai自动写文章在线 在线写文章自动生成器
身为文案工作者,我深感写作之重要且充满挑战。如今,随着人工智能(AI)写作平台的出现,我的写作历程出现了巨大变革。在此,很
AI写系统性综述ChatGPT还远远不够未来百年能否实现
在科学研究的浩瀚海洋中,科研人员时常面临一个棘手的问题:如何有效整合和理解海量的科学文献。尽管网络的普及极大地丰富了文献
全球AI半导体技术排名:韩国强势第三,未来发展值得关注
近年来,人工智能(AI)技术的迅猛发展促进了相关硬件的创新,尤其是AI半导体的需求日益上升。根据最新的研究报告和韩国媒体的报
MVSO影视程序源码 影视自动采集_魔改超强SEO_自定义苹果cms资源站接口
?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK ]/
多地楼市政策不断优化 房地产市场企稳态势渐明
原标题:多地楼市政策不断优化 房地产市场企稳态势渐明来源:人民网近日,海南省住房公积金管理局发布《关于调整优化住房公积金
新澳正版资料免费大全,词语作答释义解释汇总
随着互联网的普及和在线信息资源的丰富,人们对于各类资料的需求日益增长,在新时代,获取正版资料显得尤为重要,本文将介绍新澳
揭秘快速排名SEO软件,网站高效提升排名的秘密武器
快速排名SEO软件,是网站提升排名的得力助手。它通过优化关键词、内容布局和链接策略,帮助网站在搜索引擎中迅速提升排名,实现