每日一博 | LangChain 原理学习笔记
最新越发觉得AI的发展,对未来是一场革命,LangChain已经在工程设计上有了最佳实践,类似于AI时代的编程模型或编程框架,有点Spring框架的意思。之前在LangChain上也有些最佳实践,所以在这里分享记录下。
LangChain是基于LLM之上的,在应用层和底层LLM之前的一个很好的编程框架,如果把LLM比喻为各种类型的数据库、中间件等这些基础设施,应用层是各种业务逻辑的组合之外,那么LangChain就负责桥接与业务层和底层LLM模型,让开发者可以快速地实现对接各种底层模型和快速实现业务逻辑的软件开发框架。
那么LangChain是如何做到的呢?试想一下,现在底层有一个大模型的推理能力,除了在对话框手动输入跟他聊天之外。如何用计算机方式跟它互动呢?如果把一次LLM调用当作一个原子能力,如何编排这些原子能力来解决一些业务需求呢?Langchain就是来解决这个事情的。
▐ Model I/O
这里重点把背后的LLM模型做了一层封装,开发者可以通过更改配置的方式快速切换底层LLM模型,比如chatgpt,chatGLM、通义千问等模型。
同时还有些高阶功能:比如提供了缓存等功能,这样对于语义上类似的query,如果缓存有,那么langchain可以快速返回结果,而不需要调用大模型。
▐ Retriver
关键技术:文档如何拆分、embedding过程、 TOPN 向量距离的选择
embedding技术选型
embedding是将现实中的物体通过向量化的方法转化为高维向量,可被机器学习模型所识别。他是一种映射,同时也保证了能清晰地表达现实物体的特征。基于此,可以进行一些归类分析、回归分析等。
现在市面上常见的embedding方法有通义千问的embedding等方法。
向量数据库:
向量数据库底层存储的是一堆向量,它提供了根据向量相似度进行查询的能力,一般情况下,向量相似度代表了现实世界中物体的相似度。比如”我的名字是小明“ 和“我叫小明”这两句话所代表的含义几乎是相同的,那么在embedding之后,基于向量数据库进行查询的时候,它们俩的相似度就会很近。
▐ Chain
各种类型的chain,chain代表了各种业务类型的组合,类似于工作流的编排。
▐ Memory
LLM本身提供了记忆的能力,同时提供了接口,开发者可以将历史的对话记录传入给LLM。LangChain需要使用外部存储保存这些历史的会话和记忆。可以使用数据库、缓存等进行保存。
▐ Agent
重点是代理工具
代理工具可以让应用程序基于大模型的推理能力,然后进行代理工具或代理服务的调用。因为LLM是没有“联网”的能力的,如果想解决特定的应用场景,代理工具是个完美的选择。
代理工具通常包含三个方面:用户输入、prompt编排LLM思考与路由代理的过程、背后的代理服务。其中难点可能就在于prompt设计了。通常的“套路”是这样的:
ReAct 模型
输入:用户的问题
思考过程:如果是情况1(这个是需要LLM进行意图识别进行思考的),那么推理和提取出一些关键参数,调用agent1,如果是情况2,那么推理和提取出一些关键参数,调用agent2
Act:调用agent1对应一个JSON格式化的输入,调用function1,返回结果。
观察:观察调用后的结果,再结合推理的能力,再进行循环思考。
LangChain的在实际场景中的实践
集团内部开发了一个JAVA版本的LangChain框架,以下实践基于此框架与开源大模型chatGLM-6B进行。
▐ 淘宝开放平台智能问答
淘宝开放平台对内托管了上万个API,每天在内部群里都会有开发者咨询API发布问题,之前我们是通过NLP来实现智能问答的,现将它升级为基于大模型的智能问答,以下是具体的技术实现过程。
-
知识库Embedding过程
由于之前已经沉淀好了很多知识库,都是Question-Answer的这种形式,这里我们对Question,也就是问题进行Embedding,此处采用通义千问提供的Embedding方法。
知识库embedding:
TongYiEmbeddings embeddings = new TongYiEmbeddings();
embeddings.setServerAccessId(ALINLP_EMBEDDINGS_ACCESSID);
embeddings.setServerUrl(ALINLP_EMBEDDINGS_SERVER_URL);
embeddings.setServerUuid(ALINLP_EMBEDDINGS_UUID);
Document document = new Document();
document.setPageContent(rawText);
List<Document> documents = embeddings.embedDocument(Arrays.asList(document));
Document vecDocument= documents.get(0);
// 向量化知识
String embeddingString = JSON.toJSONString(vecDocument.getEmbedding()).replaceAll("\\[", "{")
.replaceAll("\\]", "}");
return embeddingString;
-
向量数据库存储和查询
向量距离数据库查询:
select origin_content as originContent,
origin_title as originTitle,
pm_approx_squared_euclidean_distance(embedding_title, #{embeddingTitle}) as distance
from vs_knowledge
order by distance asc
limit #{limit}
-
大模型问答链路
//1. 初始化ChatGLM的参数
ChatGLMV2Internal chatGLMV2Internal = new ChatGLMV2Internal();
chatGLMV2Internal.setTemperature(0.01d);
chatGLMV2Internal.setMaxLength(2048);
//2. 提示词编写
PromptTemplate prompt = new PromptTemplate();
String template = "已知信息:\n" +
"{context} \n" +
"\n" +
"根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”,不允许在答案中添加编造成分,答案请使用中文。问题是:{question}";
prompt.setTemplate(template);
//3. 向量数据库检索配置,比如最大向量距离
RetrievalQA qa = new RetrievalQA();
qa.setRecommend(5);
qa.setMaxDistanceValue(10000.0d);
qa.setLlm(chatGLMV2Internal);
qa.setPrompt(prompt);
qa.setRetriever(holoRetriver.asRetriever());
qa.init();
//4. LLM大模型问答
Map<String, Object> inputs = new HashMap<>();
inputs.put("question", question);
inputs.put("input", question);
Map<String, Object> outputs = qa.run(inputs);
llmKonwledgeDO.setContent(String.valueOf(outputs.get("text")));
// 补充 doclist
return llmKonwledgeDO;
▐ AI Agent实践
以下实现了一个网关API调用日志解析的agent。
this.setName("ApiLogTool");
this.setDescription("这是一个调用日志查询接口,如果[{question}]中包含requestId关键字,你可以请求这个工具与日志系统进行交互,调用这个工具。\n" +
"请先提取出requestId的值,将它赋值为value。调用参数:[{\"requestId\": \"value\", \"type\": \"String\", \"description\": \"调用请求id\"}]。");
Map<String,Object> parse = (Map<String,Object>)JSON.parse(toolInput);
if(parse.get("requestId")==null){
return new ToolExecuteResult("");
}
String requestId = parse.get("requestId").toString();
ApiLogSearchQuery apiLogSearchQuery = new ApiLogSearchQuery();
//日志查询解析处理
public static final String FORMAT_INSTRUCTIONS_CH =
"用户提出了一个问题: {question} \n" +
"你可以选择使用下面这些工具:\n"+
"{tool_list_description}"+
"\n"+
"同时你的思考过程如下:"+
"Thought: 每一次你需要首先思考你应该做什么\n" +
"Action: 你需要决定是否使用工具,应该是[{tool_names}] 中的一个Action,格式为JSON。如果匹配不到工具,就不要思考了,直接返回结果,请不要把思考过程返回给用户。\n" +
"Input: 如果匹配到工具,使用的工具的输入参数,赋值给params\n" +
"Observation: 如果匹配到工具,工具的输出结果 格式为[]。\n" +
"Answer: 每一步回答问题的答案,格式为JSON。你可以多次使用Thought/Action/Input/Observation/Answer来一步一步的思考如何回答问题。\n";
-
未来微服务HSF这种形式会向上往 agent工厂或者agent服务框架这种形式演进,因为这个框架搭好了后,后面各个业务方快速集成到agent服务上,可被上层AI应用层调用 -
如果多个agent联动了,才是真正的智能 -
如何定义agent?
团队介绍
本文分享自微信公众号 - 大淘宝技术(AlibabaMTT)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Apache DolphinScheduler<3.2.1 任意代码执行漏洞
漏洞描述 Apache Dolphinscheduler 是开源的分布式任务调度系统。 受影响版本中,由于 SwitchTaskUtils#generateContentWithTaskParams 方法未对用户可控的任务参数有效过滤,攻击者可构造包含模版字符串(如:${cmd})或Unicode编码的恶意参数创建数据处理任务,当程序执行时会在服务器上执行任意可逃逸沙箱的 JavaScript 代码。 漏洞名称 Apache DolphinScheduler<3.2.1 任意代码执行漏洞 漏洞类型 输入验证不恰当 发现时间 2024-02-24 漏洞影响广度 一般 MPS编号 MPS-t2ir-al41 CVE编号 CVE-2024-23320 CNVD编号 - 影响范围 org.apache.dolphinscheduler:dolphinscheduler@(-∞, 3.2.1) 修复方案 将 org.apache.dolphinscheduler:dolphinscheduler 升级至 3.2.1 及以上版本 参考链接 https://www.oscs1024.com/h...
- 下一篇
周鸿祎:Sora 的技术路线如果被开源,国内将能很快赶上
360集团创始人周鸿祎近日接受了新京报的独家采访,在被问及国内大模型企业如何追赶 Sora 时,他认为: “Sora的技术路线如果被开源,国内将能很快赶上,但在追赶Sora时,算力有可能成为门槛,对此,集中国内所有AI企业的算力或许是方法之一。” 周鸿祎对新京报贝壳财经记者表示,Sora所代表的技术路线出炉后,国外也有两条路线的斗争,一条是OpenAI的闭源,另一条是以Meta为代表的开源,“开源路线的目标就要打破闭源,他们会不断去猜测闭源是怎么做的,最后再开源出来。开源出来的好处是,很多小公司和大公司的个人成员会积极地在开源项目中借鉴他人成果,同时再贡献自己的成果,其化学作用会非常明显。” 周鸿祎同时认为,在追赶Sora方面,算力可能也是一个坎。Sora视频分析对算力的消耗应该是远远超过千亿模型的。所以,当现在国内显卡都被卡脖子之后,算力就可能会是一个问题。“目前,Meta已经有50万块GPU,明年可能会买百万块,微软应该也会按照百万级别去下订单。而国内的所有人工智能公司加在一起可能有50万块GPU,但都分散在各个公司里。” 来源:https://m.bjnews.com.cn/de...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题