探索LangChain中的JavaScript集成:以Ollama为例

来源:网络时间:2025-05-16 15:03:46

在当今快速发展的AI领域,LangChain作为连接不同语言模型和工具的桥梁,正日益受到开发者的关注。特别地,将Ollama这一智能助手融入JavaScript生态系统,开辟了新的应用可能性。本文旨在深入浅出地探讨如何在JavaScript项目中高效利用Ollama,解锁高级自然语言处理功能。Ollama,以其灵活的接口和强大的语言理解能力著称,让开发者能够轻松构建能够理解和回应复杂人类语言的应用程序。通过细致讲解其集成步骤、示例代码演示以及最佳实践分享,我们不仅揭示Ollama如何无缝嵌入JavaScript环境,还展示了它如何成为提升应用智能交互水平的关键工具。随着JavaScript继续在全球Web开发中占据核心地位,Ollama的集成无疑为前端和全栈开发者打开了通往人工智能应用的大门。

  简介  

本文档介绍了如何在javascript环境中使用ollama与langchain集成,以创建强大的ai应用。ollama是一个开源的大语言模型部署工具,而langchain则是一个用于构建基于语言模型的应用的框架。通过结合这两者,我们可以在本地环境中快速部署和使用先进的ai模型。

  注:本文档包含核心代码片段和详细解释。完整代码可在notebook/c5/ollama_langchain_javascript中找到。  

?

  1.环境设置  配置node.js环境  

首先,确保你的系统已安装Node.js。你可以从?Node.js官网?下载并安装最新版本。

  创建项目并安装依赖    切换到运行目录运行:    cdnotebook/C5/ollama_langchain_javascript  npminit-y  登录后复制    安装必要的依赖:    npminstall@langchain/ollama@langchain/core@langchain/commUnityzod  登录后复制    在?package.json?文件中添加?"type":"module"?以启用ES模块支持:    {  "type":"module",  //...其他配置  }  登录后复制  

?

  2.下载所需模型并初始化Ollama  下载llama3.1模型    进入官网?下载并安装Ollama到可用的受支持平台。  查看?了解所有可用的模型。  通过?ollamapull?命令获取可用LLM模型(例如:ollamapullllama3.1)。    

命令行执行完毕后如图所示:

  

立即学习“Java免费学习笔记(深入)”;

  

Ollama 在 LangChain 中的使用 - JavaScript 集成

  

模型存储位置:

  Mac:?~/.ollama/models/  Linux(或WSL):?/usr/share/ollama/.ollama/models  windows:?C:UsersAdministrator.ollamamodels  

下载完毕后,需要确保Ollama服务已经启动:

  ollamaps  登录后复制  

Ollama 在 LangChain 中的使用 - JavaScript 集成

  

?

  3.基本使用示例  使用ChatOllama进行简单对话  

可运行?base_chat.js?文件,具体代码如下:

  import{Ollama}from"@langchain/community/llms/ollama";  constollama=newOllama({  baseUrl:"//确保Ollama服务已经启动  model:"llama3.1",//替换为实际使用的模型  });  constStream=awaitollama.stream(  `你比GPT4厉害吗?`  );  constchunks=[];  forawait(constchunkofstream){  chunks.push(chunk);  }  console.log(chunks.join(""));  登录后复制  

运行代码:

  nodebase_chat.js  登录后复制  

这段代码做了以下几件事:

    导入Ollama类并初始化它,指定模型和基础URL。  使用?stream?方法发送一个问题给模型,这允许我们逐块接收响应。  使用for-await循环收集所有响应块。  将所有块组合并打印出完整响应。    多模态模型使用  

运行base_mulTIModal.js文件,具体代码如下:

  import{Ollama}from"@langchain/community/llms/ollama";  import*asfsfrom"node:fs/promises";  constimageData=awaitfs.readFile("../../../docs/images/C5-1-4.png");//可以替换为你想询问的图片  constmodel=newOllama({  model:"llava",  baseUrl:"  }).bind({  images:[imageData.toString("Base64")],  });  constres=awaitmodel.invoke("图片里是什么动物呀?");  console.log({res});  登录后复制  

运行代码:

  nodebase_multimodal.js  登录后复制  

这段代码演示了如何使用多模态模型(如llava)处理图像和文本输入:

    读取图像文件并将其转换为base64编码。  初始化Ollama模型,并使用?bind?方法将图像数据绑定到模型。  使用?invoke?方法发送一个关于图像的问题。  打印模型的响应。    工具调用  

运行?base_tool.js?文件,代码如下:

  import{tool}from"@langchain/core/tools";  import{ChatOllama}from"@langchain/ollama";  import{z}from"zod";  //定义简单计算器工具  constsimpleCalculatorTool=tool((args)=>{  const{operation,x,y}=args;  switch(operation){  case"add":  returnx+y;  case"subtract":  returnx-y;  case"multiply":  returnx*y;  case"divide":  if(y!==0){  returnx/y;  }else{  thrownewError("Cannotdividebyzero");  }  default:  thrownewError("Invalidoperation");  }  },{  name:"simple_calculator",  description:"Performsimplearithmeticoperations",  schema:z.object({  operation:z.enum(["add","subtract","multiply","divide"]),  x:z.number(),  y:z.number(),  }),  });  //定义模型  constllm=newChatOllama({  model:"llama3.1",  temperature:0,  });  //将工具绑定到模型  constllmWithTools=llm.bindTools([simpleCalculatorTool]);  //使用模型进行工具调用  constresult=awaitllmWithTools.invoke(  "你知道一千万乘二是多少吗?请使用'simple_calculator'工具来计算。"  );  console.log(result);  登录后复制  

运行代码:

  nodebase_tool.js  登录后复制  

这段代码展示了如何定义和使用工具:

    使用?tool?函数定义一个简单的计算器工具,包括操作逻辑和参数schema。  初始化ChatOllama模型。  使用?bindTools?方法将工具绑定到模型。  使用?invoke?方法发送一个需要计算的问题,模型会自动调用相应的工具。    

?

  4.进阶用法  自定义提示模板  

自定义提示模板不仅提高了内容生成的效率,还确保了输出的一致性和针对性。通过精心设计的模板,我们可以充分利用AI模型的能力,同时保持对输出内容的控制和指导:

  import{ChatOllama}from"@langchain/ollama";  import{ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate}from"@langchain/core/prompts";  //初始化ChatOllama模型  constmodel=newChatOllama({  model:"llama3.1",  temperature:0.7,  });  constsystemMessageContent=`  你是一位经验丰富的电商文案撰写专家。你的任务是根据给定的产品信息创作吸引人的商品描述。  请确保你的描述简洁、有力,并且突出产品的核心优势。  `;  consthumanMessageTemplate=`  请为以下产品创作一段吸引人的商品描述:  产品类型:{product_type}  核心特性:{key_feature}  目标受众:{target_audience}  价格区间:{price_range}  品牌定位:{brand_positioning}  请提供以下三种不同风格的描述,每种大约50字:  1.理性分析型  2.情感诉求型  3.故事化营销型  `;  constprompt=ChatPromptTemplate.fromMessages([  SystemMessagePromptTemplate.fromTemplate(systemMessageContent),  HumanMessagePromptTemplate.fromTemplate(humanMessageTemplate),  ]);  constchain=prompt.pipe(model);  asyncfunctiongenerateProductDescriptions(productInfo){  constresponse=awaitchain.invoke(productInfo);  returnresponse.content;  }  //示例使用  constproductInfo={  product_type:"智能手表",  key_feature:"心率监测和睡眠分析",  target_audience:"注重健康的年轻专业人士",  price_range:"中高端",  brand_positioning:"科技与健康的完美结合"  };  generateProductDescriptions(productInfo)  .then((result)=>console.log(result))  .catch((error)=>console.error("Error:",error));  登录后复制  

运行代码:

  nodeadvanced_prompt.js  登录后复制  

这段代码展示了如何创建和使用自定义提示模板:

    定义系统消息和人类消息模板。  使用?ChatPromptTemplate.fromMessages?创建一个完整的提示模板。  使用?pipe?方法将提示模板与模型连接起来,创建一个处理链。  定义一个函数来生成产品描述,该函数使用处理链来处理输入的产品信息。    

自定义提示模板在实际应用中有着广泛的用途,尤其是在需要生成特定格式或风格的内容时。以下是一些实际应用场景:

    电子商务产品描述生成:正如本例所示,可以用于自动生成不同风格的产品描述,提高产品页面的吸引力和转化率。  客户服务回复模板:可以创建各种情景的回复模板,如处理投诉、提供产品信息等,确保客服回复的一致性和专业性。  新闻报道生成:可以设计模板来生成不同类型的新闻报道,如突发新闻、深度分析等,帮助记者快速起草初稿。  个性化营销邮件:根据客户数据和营销目标,生成个性化的营销邮件内容,提高邮件营销的效果。    高级JSON输出与知识图谱生成  

在这个例子中,我们展示了如何使用Ollama和LangChain生成结构化的JSON输出,特别是用于创建知识图谱。这种方法与Microsoft的开源项目GraphRAG有着密切的联系,尤其是在自动化知识提取和三元组生成方面。

  import{ChatOllama}from"@langchain/ollama";  import{PromptTemplate}from"@langchain/core/prompts";  import{HumanMessage,SystemMessage}from"@langchain/core/messages";  constsystemTemplate=`  你是一位医疗领域的专家,擅长创建知识图谱。请将所有响应格式化为具有以下结构的JSON对象:  {  "节点":[  {"id":"string","标签":"string","类型":"string"}  ],  "关系":[  {"源":"string","目标":"string","关系":"string"}  ]  }  确保所有节点id都是唯一的,并且关系引用的是已存在的节点id。  `;  consthumanTemplate=`  请为医疗主题"{topic}"创建一个知识图谱。包括以下相关概念:{concepts}。  提供至少5个节点和5个关系。请确保使用中文回答。  `;  constsystemMessage=newSystemMessage(systemTemplate);  consthumanPrompt=PromptTemplate.fromTemplate(humanTemplate);  constllmJsonMode=newChatOllama({  baseUrl:"//默认值  model:"llama3.1",  format:"json",  });  asyncfunctiongenerateMedicalKnowledgeGraph(topic,concepts){  try{  consthumanMessageContent=awaithumanPrompt.format({  topic:topic,  concepts:concepts.join("、"),  });  consthumanMessage=newHumanMessage(humanMessageContent);  constmessages=[systemMessage,humanMessage];  constresult=awaitllmJsonMode.call(messages);  console.log(JSON.stringify(result,null,2));  returnresult;  }catch(error){  console.error("生成知识图谱时出错:",error);  }  }  //使用示例  consttopic="糖尿病";  constconcepts=["胰岛素","血糖","并发症","饮食管理","运动疗法"];  generateMedicalKnowledgeGraph(topic,concepts);  登录后复制  

运行代码:

  nodeadvanced_json.js  登录后复制  

这段代码演示了如何使用Ollama生成结构化的JSON输出:

    定义系统模板,指定期望的JSON结构。  创建一个人类提示模板,用于生成知识图谱的请求。  初始化ChatOllama模型,设置?format:"json"?以获取JSON输出。  定义一个函数来生成医疗知识图谱,该函数组合系统消息和人类消息,并调用模型。    

我们可以窥见到通过json格式的特定输出,可以将其运用到许多方面:

    自动化三元组生成:在传统方法中,创建知识图谱通常需要大量的人工标注工作。专家需要仔细阅读文档,识别重要概念和它们之间的关系,然后手动创建三元组(主体-关系-客体)。这个过程不仅耗时,而且容易出错,特别是在处理大量文档时。使用我们的方法,大语言模型可以自动从给定的主题和概念生成相关的节点和关系。这极大地加速了知识图谱的构建过程。  数据增强:这种方法不仅可以用于直接生成知识图谱,还可以用于数据增强。例如:  扩展现有的训练数据集:通过让模型基于已有的三元组生成新的相关三元组。  创建多样化的示例:为不同的医疗条件生成知识图谱,增加数据的多样性。  跨语言数据生成:通过调整提示,可以生成不同语言的知识图谱,支持多语言应用。  提高数据质量:大语言模型可以利用其广泛的知识基础,生成高质量、连贯的知识图谱。通过精心设计的提示,我们可以确保生成的数据符合特定的质量标准和领域规范。  灵活性和可扩展性:这种方法非常灵活,可以轻松适应不同的领域和需求:  通过修改系统提示,我们可以改变输出的JSON结构,以适应不同的知识图谱格式。  可以轻松地将此方法扩展到其他领域,如科技、金融、教育等。    

?

  结论  

通过这些示例,我们展示了如何使用Ollama和LangChain在JavaScript环境中构建各种AI应用,从简单的对话系统到复杂的知识图谱生成。这些工具和技术为开发强大的AI应用提供了坚实的基础。

  

Ollama和LangChain的结合为开发者提供了极大的灵活性和可能性。你可以根据具体需求,选择合适的模型和组件,构建出适合你的应用场景的AI系统。

  

随着技术的不断发展,我们期待看到更多创新的应用出现。希望这个指南能够帮助你开始你的AI开发之旅,并激发你的创造力,去探索AI技术的无限可能。

以上就是Ollama在LangChain中的使用-JavaScript集成的详细内容,更多请关注其它相关文章!

文章内容来源于网络,不代表本站立场,若侵犯到您的权益,可联系我们删除。(本站为非盈利性质网站) 联系邮箱:[email protected]