ChatGPT分享-如何开发一个LLM应用

1​背景​

ChatGPT引起巨大的业界震撼,各行各业都在讨论大语言模型、通用人工智能。AI经历了五十多年的发展,现在正处于产业结构水平化发展的关键时期。这一变化源于NLP领域范式的转变,从“预训练+微调”向“预训练、提示、预测”模式演进。在这一新模式下,下游任务适应预训练模型,使得一个大型模型能适用于多个任务。这一变化为AI产业的水平化分工奠定了基础,大型语言模型成为基础设施,Prompt Engineering公司层出不穷,专注于连接用户和模型。AI产业的分工初步形成,包括底层基础设施(云服务商)、大型模型、Prompt Engineering平台和终端应用。随着AI产业变革,开发者可以充分利用大型语言模型(LLM)和Prompt Engineering来开发创新应用。

2Prompt-Ops下的应用

目前要开发一个基于LLM的应用,我们面临最大的工程上的问题是什么?

大语言模型不能联网,无法获取最新的信息大语言模型没有我们私有的数据,无法回答垂直方向的问题大语言模型的开放API(text-davinci-003)没有像ChatGPT那样优秀的上下文能力大语言模型无法驱动其他工具。

2.1   Langchain等工程框架解决了这些工程上的问题

以Langchain为例简单来说:LangChain是 LLM 底层能力的封装,是一种 Prompt Engineering或者说是Prompt-Ops。

它可以接入各种不同LLM的服务,抽象了各种大语言模型的调用它可以创建各种PromptTemplate,实现定制化的Prompt模版它可以创建链来组合调用PromptTemplate它可以通调用各种工具,实现GPT-3目前不擅长的事情,比如搜索/数学/链接私有数据库/Python代码它可以使用代理, 驱动LLM 来确定采取哪些行动以及采取何种顺序。动作可以是使用工具并观察其输出,也可以是返回给用户。它可以通过它的Memory模块,来实现对话历史的建模。

2.2    一些Langchain的开发例子

2.2.1   结合搜索的GPT

图片

图片

这是一个用ChatGPT和LangChain开发的Demo对比的例子,输入的都是“谁是周杰伦的老婆?她当前的年龄乘以0.23是多少?”。可以看出ChatGPT或者GPT-3.5因为没有搜索能力,回答的结果是错误的。右边用LangChain结合OpenAI的GPT-3.5的API则输出了正确的结果,他会逐步去搜索获得正确信息,得出正确结果,而且中间的过程是框架自动处理的,我除了输入问题没有其他操作。

2.2.2   将自然语言转为Python代码并自行纠错

这是一个非常令人震惊的例子,在这个流程中,它自己发现函数未定义的报错并自行纠正。

图片

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

图片

2.2.3   使用GPT-3 + Statmuse + Langchain查询NBA数据

Fuzzy API composition: querying NBA stats with GPT-3 + Statmuse + Langchain

使用Langchain与体育数据搜索网站相结合,提问复杂的数据问题并得到准确的回复。例如:“波士顿凯尔特人队在这个 2022-2023 赛季的 NBA 赛季场均防守得分是多少?与他们上赛季的平均水平相比,百分比变化如何?”

图片

2.2.4   连接Python REPL打开浏览器播放音乐

一个蛮科幻的场景,我用Langchain接入了Python REPL工具,输入“给我放一首歌”,它导入了webBrowser包,调用代码打开了浏览器,给我播放了一首 《never gonna give you up》

def pythonTool():bash = BashProcess()python_repl_util = Tool("Python REPL",PythonREPL().run,"""A Python shell. Use this to execute python commands. Input should be a valid python command.If you expect output it should be printed out.""",)command_tool = Tool(name="bash",descriptinotallow="""A Bash shell. Use this to execute Bash commands. Input should be a valid Bash command.If you expect output it should be printed out.""",func=bash.run,)# math_tool = _get_llm_math(llm)# search_tool = _get_serpapi()tools = [python_repl_util, command_tool]agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)agent.run("给我播放一首音乐")

图片

2.2.5   连接私有数据

连接私有数据对第三方企业做LLM应用来说非常重要。下面举几个例子

LangchainJs的文档,结合了Langchain:AI-powered search for LangchainJS Documentation,你可以直接问文档内容、技术细节。

图片

数据库产品 Supabase也做了同样的事情,将自己的文档与ChatGPT相连接,使得开发者可以很方便的询问/查找自己遇到的技术问题。https://supabase.com/docs

图片

政府信息问答的一个例子:Co-pilot for government

法律公文和政策条款一般都非常复杂繁琐,这个demo中将旧金山政府的信息用Langchain与GPT结合,做到询问其中细节能获得准确回复的效果。

图片

> Entering new AgentExecutor chain...I need to find out the size limit for a storage shed without a permit and then search for sheds that are smaller than that size.Action: SF Building Codes QA SystemAction Input: "What is the size limit for a storage shed without a permit in San Francisco?"Observation: The size limit for a storage shed without a permit in San Francisco is 100 square feet (9.29 m2).Thought:Now that I know the size limit, I can search for sheds that are smaller than 100 square feet.Action: GoogleAction Input: "Storage sheds smaller than 100 square feet"Observation: Results 1 - 24 of 279 ...Thought:I need to filter the Google search results to only show sheds that are smaller than 100 square feet and suitable for backyard storage.Action: GoogleAction Input: "Backyard storage sheds smaller than 100 square feet"Thought:I have found several options for backyard storage sheds that are smaller than 100 square feet and do not require a permit. Final Answer: The size limit for a storage shed without a permit in San Francisco is 100 square feet. There are many options for backyard storage sheds that are smaller than 100 square feet and do not require a permit, including small sheds under 36 square feet and medium sheds between 37 and 100 square feet.

2.3   结合私有数据问答

LLM应用与私有数据交互非常重要,我看到无数人在问一些ChatGPT无法回答的问题了:问认不认识谁、问自己公司业务细节、问各种可能不包含在预训练数据集里的东西。这些都已用Langchain和LlaMaIndex来解决。试想一下,将私有数据与LLM相结合,将改变数据原有的访问方式,通过问答能很自然地获取到自己需要的信息,这是比当前的搜索/打标分类都要高效的数据交互方式。

2.3.1   如何构建一个基于私有数据的LLM问答系统

图片

向量数据库现在看起来是构建LLM App中很关键的一个组件。首先 LLM 的预训练和微调过程不可能包含我们所期待的私有数据,因此如何将LLM关联到私有数据成为一个很关键的需求。而且LLM的“接口”-自然语言通常不是像Key-Value的映射那样精确地。而且在这一阶段我们希望LLM去理解我们的知识库,而不是简单的在其中搜索相同的字符串,我们希望询问关于我们知识库的细节,并给出一定理解后的答案(以及来源),这样匹配向量这样的搜索方式是一个非常合适且关键的解决方案。还有一个关键点是,LLM在每次调用是按token计费(即文本量),并且目前的接口的上下文有着4096 tokens的限制。,因此面对庞大的数据,我们也不可能将所有的数据一次性传给LLM。因此才有了第一张图那个流程图的结构。本地预先将我们私有的数据转成向量存在Qdrant里,用户问答时,将用户的问题转为向量,然后去Qdrant里进行搜索(相似性匹配)得到Top K个结果,然后将这些结果(注意这里的结果已经是自然语言了)传给LLM进行总结输出。

2.3.2   结合私有数据问答的抽象流程

这里使用Langchain社区博客的流程图为例

图片

私有数据分割成小于LLM上下文的分块,创建向量后存入向量数据库

图片

将问题计算向量后在向量数据库进行相似性搜索,算出相关性较高的top k个结果后拼接prompt送往LLM获得答案。

Gridster.js多列网格式拖动布局插件 Gridster.js多列网格式拖动布局插件

网页中拖动 DIV 是很常见的操作,今天就分享给大家一个 jQuery 多列网格拖动布局插件,和其它的插件不太一样的地方在于你处理拖放的元素支持不同大小,并且支持多列的网格布局,它们会自动的根据位置自己排序和调整。非常适合你开发具有创意的应用。这个插件可以帮助你将任何的 HTML 元素转换为网格组件

Gridster.js多列网格式拖动布局插件 74 查看详情 Gridster.js多列网格式拖动布局插件

2.3.3   重要组件

OpenAI Ada模型:text-embedding-ada-002模型可以快速编码一个1536维的向量,我们可以使用这个向量来计算文本之间的相似性。Langchain / LLamaIndex:Langchain包含多种文本拆分器与文档连接器,方便将文件进行拆分并且在向量数据库中索引;LlamaIndex 可以从向量存储加载数据,类似于任何其他数据连接器。然后可以在 LlamaIndex 数据结构中使用此数据。向量数据库,选型比较多:Chroma / FAISS / Milvus / PGVector / Qdrant / Pinecone等等。

2.3.4   OpenAI私有部署与成本的问题

再来聊聊最近那个OpenAI私有部署的新闻,如果用Langchain来做链接,面对庞大的私有数据,用一个embedding模型(OpenAI的ada)计算输入问题向量,用Qdrant等向量数据库来管理私有数据的向量和向量搜索,用Langchain来做中间的链接虽然可以解决问题,但是token的消耗却是不容忽视的成本问题。私有部署+微调可能能解决大部分前面提到的问题。可能是有钱大公司用Model instance和fine-tuning,小公司独立开发者用Langchain等框架。更未来OpenAI的LLM服务能力外溢,可能不需要Prompt了,甚至把Langchain的功能都能包括了,LLM应用的开发接入也许只需要一个接口调用。

2.4    2023年的LLM应用技术栈

2023 用来简单搭建 AI Demo 的最新技术栈:

托管: Vercel前端: Next.js后端: Vercel with flask数据库: SupabaseAI 模型: OpenAI / Replicate / Hugging FaceLLM框架层: LangChain / LLaMaIndex向量存储/搜索: Pinecone / FAISS

2.5   Prompt-Ops 目前最大的问题

一些关于 Langchain 这类Prompt-Ops这类工具的反对观点:stream.thesephist.com主要问题是在这类工具/框架,将自然语言作为代码和LLM的连接,使用非确定性语言本身作为控制流,有点疯狂。而且本身评估模型输出效果现在是个很麻烦的事,没有很好的解决方案,很多都是维护一个巨大的电子表格,靠人去评估。(也有用LLM评估LLM的方案,还比较早期)所以要投入生产,真实面对用户而不是作为twitter演示可能还有很多工作要做。

详细说说测试环节面临的巨大挑战。假如你的产品有一套研发阶段效果很好的prompt,交给测试后,可能测试上百条上千条就能看出问题了。由于效果无法保证,真正推出给c端用户会面临很大的挑战。而且没有用微调服务或者model instance的话,如果OpenAI更新了模型,你的生产环境的prompt可能需要全部重新测试一下效果。你的prompt也需要和代码一样按版本来管理,不管有没有prompt变更,每个版本上线前都需要进行回归测试。没有好的自动化评估方案的话,大量的case都需要测试人工来看会耗费非常多的人力。

结合私有数据的LLM应用目前开发起来在工程上已经有很多不错的方案了,很容易跑出效果不错的demo,但还是需要非常谨慎对待这样一种应用。毕竟我们不只是要做一个在社交媒体或者Leader面前演示的项目。提供给用户输入的是一个对话框,自然语言宽泛到即使你测试上万条结果也可能出现意想不到的结果,毕竟像new bing和chatGPT这样的产品也会被Prompt Injection。面对这种不确定性,工程上如何去避免,测试如何去覆盖都是一个成熟产品待解决或者说还有很多工作可以做的问题。

但我觉得也不必完全否定这类Prompt-Ops工具/框架,毕竟现阶段确实能做出很多不错的demo来验证想法。

3未来可能的一些产品形态

聊聊ChatGPT API开放后LLM应用可能的形态。

对话聊天,是最直观的应用方式,在API上做好对话历史的管理。虚拟角色聊天,在基础对话聊天上,对API的prefix_message上做一些角色定义的prompt,可以实现类似Character.ai的效果。更深入可能是作为游戏角色、虚拟人、XR助手等。类似Notion的文本辅助撰写工具,目前Notion、FlowUs都做了类似的应用。未来各家社区的发布器集成也是一个趋势,减低用户发布门槛,提升发布质量。数据总结性工具,实现Chat-Your-Data,提供文档的输入给用户,让用户可以与自己提供的数据聊天,本质只涉及到互联网公开的数据与用户私有的数据。大企业的Chat-Your-Data,各家大公司在原有业务基础上,结合大企业的私有数据,提供更优质的服务。比如结合用户点评的大众点评,能够用“想去放neo-soul和R&B音乐的酒吧”,比如我们的商详页,能够总结所有用户对这个商品的评价,并且可以让用户对这个商品的资料进行问答。与政务、医疗、教育等领域结合,融合线上机构官网、线下大屏,提供更好的市民服务。与其他工具比如IFTTT或者各种私有协议相结合,实现LLM可以访问更多的工具和系统,举个例子:iot场景,Office Copilot。

LLM应用实际是一种新的人机交互方式,能够让用户用自然语言与我们目前的系统沟通,很多应用甚至可以简化到只有一个聊天窗口。

4总结

目前来说由于通用大模型训练/部署的高成本来说,产业水平化分工的条件基本成熟,世界上并不需要很多个大模型,做LLM的应用将会是中小型企业和个人开发者的必然选择。新形态的编程/工程范式需要工程师去及时学习理解。目前的开源技术栈已经能满足大部分产品的需求,可以尝试快速实践demo来验证想法。

参考资料:

https://blog.langchain.dev/tutorial-chatgpt-over-your-data/

Tutorial: ChatGPT Over Your Data

https://qdrant.tech/articles/langchain-integration/

Question Answering with LangChain and Qdrant without boilerplate

https://mp.weixin.qq.com/s/VZ6n4qlDx4bh41YvD1HqgQ

Atom Capital:深入探讨ChatGPT带来的产业变革

以上就是ChatGPT分享-如何开发一个LLM应用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/838913.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月27日 11:42:19
下一篇 2025年11月27日 11:46:26

相关推荐

  • 深入理解粘性定位的应用和功能

    粘性定位是一种在网页设计中常用的技术,它能够使网页元素保持在页面的固定位置,即使用户滚动页面时也不会发生改变。粘性定位具有很强的功能性和实用性,在网页设计和用户体验中发挥着重要作用。本文将探讨粘性定位的功能和应用。 一、功能 固定导航栏:粘性定位可以使导航栏始终保持在页面的顶部或侧边,使用户在滚动页…

    2025年12月24日
    000
  • CSS中绝对定位属性的解析与其在前端开发中的应用

    解析绝对定位属性 CSS 的特性及其在前端开发中的应用 一、绝对定位属性 CSS 的特性 绝对定位是 CSS 中常用的定位方式之一,它可以让元素脱离普通文档流,并通过指定的偏移量相对于包含它的父元素或根元素进行定位。绝对定位属性具有以下几个特性: 脱离文档流:绝对定位的元素脱离了普通文档流,不再占据…

    2025年12月24日 好文分享
    000
  • 前端开发中的应用与实践:使用Ajax函数

    Ajax函数在前端开发中的应用与实践 随着Web应用的快速发展,前端开发变得越来越重要。而Ajax作为一种前端开发技术,能够实现无需刷新页面的数据交互,成为了前端开发中不可或缺的工具。本文将介绍Ajax函数的基本原理,以及在前端开发中的应用与实践,并提供具体的代码示例。 Ajax函数的基本原理Aja…

    2025年12月24日
    000
  • 元素选择器在网页设计的应用领域

    元素选择器在网页设计中的应用,需要具体代码示例 在网页设计中,元素选择器是一种非常重要的CSS选择器,它能够帮助我们对网页中的元素进行样式的控制和调整。通过灵活运用元素选择器,可以实现各种精美的网页设计效果。 一、元素选择器的基本语法和用法元素选择器是CSS选择器中最简单的一种,它通过指定HTML元…

    2025年12月24日
    000
  • 使用元素选择器实现动态效果

    元素选择器在动态效果实现中的应用 在前端开发中,动态效果的实现是非常常见的需求。元素选择器是 CSS 中的一个重要概念,它能够根据元素的属性、类名等特征来选择元素,并为其添加样式或处理事件。本文将探讨元素选择器在动态效果实现中的应用,并提供一些具体的代码示例。 一、元素选择器的基本用法元素选择器是 …

    2025年12月24日
    000
  • CSS中的固定定位属性的应用和案例分析

    固定定位属性在CSS中的应用及案例分析 在网页开发中,CSS的固定定位属性是一项非常常用的技术。通过设置元素的position为fixed,我们可以将元素固定在页面的某个位置,使之不受滚动影响。本文将介绍固定定位属性的基本用法,并提供一些案例分析,以帮助读者更好地理解和运用这一技术。 一、基本用法 …

    2025年12月24日
    000
  • CSS3的新特性一览:如何应用CSS3动画效果

    CSS3的新特性一览:如何应用CSS3动画效果 引言:随着互联网的发展,CSS3逐渐取代了CSS2成为前端开发中最常用的样式语言。CSS3提供了许多新的特性,其中最受欢迎的是动画效果。通过使用CSS3动画,可以为网页添加令人惊艳的交互效果,提高用户体验。本文将介绍一些CSS3常用的动画特性,并提供相…

    2025年12月24日
    000
  • ai做html怎么运行_AI生成html运行步骤【教程】

    答案是使用AI生成HTML代码后,将其保存为.html文件并用浏览器打开即可运行。具体步骤为:1. 在AI工具中输入需求生成HTML代码;2. 将代码复制到文本编辑器并另存为index.html,编码选UTF-8,类型选“所有文件”;3. 双击该文件用浏览器打开,若无法正常显示需检查文件后缀、编码及…

    2025年12月23日
    000
  • 在Flask应用中利用JavaScript实现动态图片更新教程

    本教程详细介绍了如何在python flask web应用中实现图片的周期性自动更新。我们将学习如何使用javascript在客户端定时刷新图片,并探讨flask后端如何配合处理图片文件,确保前端能够获取到最新的图像内容,即使文件名保持不变。 引言:动态图片更新的需求 在现代Web应用开发中,许多场…

    2025年12月23日 好文分享
    000
  • Node.js 中处理 HTML 文件上传并本地存储的教程

    本教程详细介绍了如何在 node.js 环境下,利用 express 框架和 `express-fileupload` 中间件,实现从 html “ 标签上传图片文件并将其存储到服务器本地文件系统的完整流程。文章涵盖了前端表单配置、后端中间件集成、文件接收与存储,并提供了示例代码和注意事…

    2025年12月23日
    000
  • 网页中调用Android应用并显示确认对话框的实现指南

    本教程详细阐述了如何在网页中通过自定义url scheme启动android应用,并在此过程中集成一个用户确认对话框。我们将利用html、css和javascript构建一个模态对话框,确保用户在点击启动应用前获得明确提示,从而提升用户体验和安全性。 引言:从网页启动Android应用的挑战与解决方…

    2025年12月23日 好文分享
    000
  • Geolocation API 海拔数据处理与精度优化指南

    本文深入探讨了 web geolocation api 在获取海拔数据时可能出现的精度问题及`altitudeaccuracy`属性显示`undefined`的原因。我们将分析海拔数据不准确的潜在因素,包括设备硬件、gps信号和api实现差异,并提供实用的代码示例和优化策略,帮助开发者更准确地处理地…

    2025年12月23日
    000
  • Web前端:隐藏输入框下捕获条形码扫描数据的技术指南

    本教程详细介绍了如何在web应用中实现条形码扫描数据的捕获,同时保持输入框的隐藏状态。通过监听全局键盘事件并手动管理隐藏输入框的值,可以有效解决传统隐藏输入框无法接收扫描数据的问题。文章将提供具体的javascript代码示例和实现步骤,确保扫描功能在不干扰用户界面的情况下正常运作。 引言:隐藏输入…

    2025年12月23日
    000
  • React 应用中的模块导入与 Webpack 文件扩展名解析深度解析

    本教程深入探讨React应用开发中常见的模块导入问题,特别是当Webpack无法正确解析省略文件扩展名的本地模块时。我们将解释import语句的工作原理,并详细指导如何通过配置Webpack的resolve.extensions选项来确保模块路径的正确解析,从而避免因文件扩展名缺失导致的构建错误,提…

    2025年12月22日
    000
  • 高效利用CSS选择器实现日历忙碌日悬停提示

    本文详细介绍了如何利用CSS选择器为日历插件中带有动态日期和固定“忙碌”类名的元素创建悬停提示。通过解析常见的选择器误区,重点阐述了直接类选择器.busy的正确应用,并结合伪元素::after和:hover状态,提供了实现专业级悬停提示的完整CSS代码和最佳实践,帮助开发者高效处理动态UI交互。 引…

    2025年12月22日
    000
  • 解析HTML全局属性的用途和在前端开发中的应用

    HTML全局属性的功能解析及其在前端开发中的应用 引言:随着互联网的发展,前端开发变得越来越重要。在前端开发中,HTML作为标记语言起着至关重要的作用。HTML全局属性是一组应用广泛且功能强大的属性,它们可以应用于HTML的任何元素上。本文将解析HTML全局属性的功能,以及其在前端开发中的应用。 一…

    好文分享 2025年12月22日
    000
  • HTTP状态码300的详细解释及其在网络通信中的应用

    HTTP状态码是指在进行HTTP通信过程中,服务器返回给客户端的一个三位数的数字代码,用于表示当前请求的处理情况和结果。其中,HTTP状态码300代表了多种选择。 在网络通信中,HTTP状态码300的主要应用场景是在网页重定向和内容选择方面。当客户端发起请求时,服务器可能会返回多个可选的URL作为响…

    2025年12月22日
    000
  • 使用display属性探索HTML的特性和应用

    HTML中display属性的特性与应用 HTML是一种用于创建网页的标记语言,display属性是HTML中常用的一个属性之一,用于控制元素在页面中的显示方式。display属性有不同的取值,每个取值都有自己的特性和应用。本文将介绍常见的几个display属性取值,并给出相应的代码示例。 disp…

    2025年12月21日
    000
  • 掌握numpy:从入门到应用,深入了解这个强大的数学库

    numpy解析:从基础到应用,全方位了解这个强大的数学库 导语:在数据科学和机器学习领域,处理和分析大量数据是至关重要的。而numpy作为Python的一个强大的数学库,在数据处理和科学计算方面发挥着重要作用。本文将以numpy为主题,介绍它的基础知识和应用实例,帮助读者全面了解和掌握这个强大的数学…

    2025年12月21日
    000
  • 探索numpy切片操作的深层理解及应用

    深入理解numpy切片操作方法及其应用 numpy是一个强大的Python科学计算库,常用于处理多维数组数据。其中,切片操作是numpy中非常重要且常用的功能之一。本文将深入介绍numpy切片操作的方法,并结合具体的代码示例进行说明,以帮助读者更好地理解和运用numpy中的切片操作。 一、numpy…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信