LangChain의 올라마 - 자바스크립트 통합
개요
이 문서에서는 Ollama LangChain과 통합하여 강력한 AI 애플리케이션을 생성하세요.Ollama는 대규모 언어 모델을 위한 오픈 소스 배포 도구이며, LangChain은 언어 모델 기반 애플리케이션을 구축하기 위한 프레임워크입니다. 이 두 가지를 결합하면 로컬 환경에서 고급 AI 모델을 신속하게 배포하고 사용할 수 있습니다.
참고: 이 문서에는 핵심 코드 스니펫과 자세한 설명이 포함되어 있습니다. 전체 코드는 notebook/c5/ollama_langchain_javascript에서 찾을 수 있습니다.
1. 환경 설정
Node.js 환경 구성
먼저 시스템에 Node.js가 설치되어 있는지 확인합니다. Node.js 웹사이트에서 최신 버전을 다운로드하여 설치할 수 있습니다.
프로젝트 생성 및 종속성 설치
- 실행 디렉터리로 전환하여 실행합니다:
cd notebook/C5/ollama_langchain_javascript
npm init -y
- 필요한 종속성을 설치합니다:
npm install @langchain/ollama @langchain/core @langchain/community zod
- 존재
package.json
파일을 추가하여"type": "module"
를 설정하여 ES 모듈 지원을 활성화합니다:
{
"type": "module",
// ... 其他配置
}
2. 필요한 모델을 다운로드하고 Ollama를 초기화합니다.
llama3.1 모델 다운로드
- 공식 웹사이트 https://ollama.com/download 로 이동하여 지원되는 플랫폼에서 Ollama를 다운로드하여 설치하세요.
- 사용 가능한 모든 모델은 https://ollama.ai/library 에서 확인하세요.
- 통과(청구서 또는 검사 등)
ollama pull <name-of-model>
명령을 사용하여 사용 가능한 LLM 모델을 가져옵니다(예ollama pull llama3.1
).
명령줄은 그림과 같이 실행됩니다:

모델 저장 위치:
- Mac.
~/.ollama/models/
- Linux(또는 WSL).
/usr/share/ollama/.ollama/models
- Windows.
C:\Users\Administrator\.ollama\models
다운로드가 완료되면 올라마 서비스가 시작되었는지 확인해야 합니다:
ollama ps

3. 기본 사용 예
ChatOllama로 간단한 대화
실행 가능 base_chat.js
파일의 구체적인 코드는 다음과 같습니다:
import { Ollama } from "@langchain/community/llms/ollama";
const ollama = new Ollama({
baseUrl: "http://localhost:11434", // 确保Ollama服务已经启动
model: "llama3.1", // 替换为实际使用的模型
});
const stream = await ollama.stream(
`你比GPT4厉害吗?`
);
const chunks = [];
for await (const chunk of stream) {
chunks.push(chunk);
}
console.log(chunks.join(""));
코드를 실행합니다:
node base_chat.js
이 코드는 여러 가지 작업을 수행합니다:
- Ollama 클래스를 가져오고 모델과 기본 URL을 지정하여 초기화합니다.
- 활용
stream
메서드는 모델에 질문을 전송하여 블록별로 응답을 받을 수 있도록 합니다. - for-await 루프를 사용하여 모든 응답 블록을 수집합니다.
- 모든 블록을 결합하고 전체 응답을 인쇄합니다.
멀티모달 모델 사용
움직여야 합니다.base_multimodal.js
파일의 구체적인 코드는 다음과 같습니다:
import { Ollama } from "@langchain/community/llms/ollama";
import * as fs from "node:fs/promises";
const imageData = await fs.readFile("../../../docs/images/C5-1-4.png"); // 可以替换为你想询问的图片
const model = new Ollama({
model: "llava",
baseUrl: "http://127.0.0.1:11434",
}).bind({
images: [imageData.toString("base64")],
});
const res = await model.invoke("图片里是什么动物呀?");
console.log({ res });
코드를 실행합니다:
node base_multimodal.js
이 코드는 llava와 같은 멀티모달 모델을 사용하여 이미지 및 텍스트 입력을 처리하는 방법을 보여줍니다:
- 이미지 파일을 읽고 base64 인코딩으로 변환합니다.
- 올라마 모델을 초기화하고
bind
메서드는 이미지 데이터를 모델에 바인딩합니다. - 활용
invoke
메서드는 이미지에 대한 질문을 전송합니다. - 모델 응답을 인쇄합니다.
도구 호출
움직여야 합니다. base_tool.js
파일에 다음 코드를 추가합니다:
import { tool } from "@langchain/core/tools";
import { ChatOllama } from "@langchain/ollama";
import { z } from "zod";
// 定义简单计算器工具
const simpleCalculatorTool = tool((args) => {
const { operation, x, y } = args;
switch (operation) {
case "add":
return x + y;
case "subtract":
return x - y;
case "multiply":
return x * y;
case "divide":
if (y !== 0) {
return x / y;
} else {
throw new Error("Cannot divide by zero");
}
default:
throw new Error("Invalid operation");
}
}, {
name: "simple_calculator",
description: "Perform simple arithmetic operations",
schema: z.object({
operation: z.enum(["add", "subtract", "multiply", "divide"]),
x: z.number(),
y: z.number(),
}),
});
// 定义模型
const llm = new ChatOllama({
model: "llama3.1",
temperature: 0,
});
// 将工具绑定到模型
const llmWithTools = llm.bindTools([simpleCalculatorTool]);
// 使用模型进行工具调用
const result = await llmWithTools.invoke(
"你知道一千万乘二是多少吗?请使用 'simple_calculator' 工具来计算。"
);
console.log(result);
코드를 실행합니다:
node base_tool.js
이 코드는 도구를 정의하고 사용하는 방법을 보여줍니다:
- 활용
tool
함수는 연산 로직과 매개변수 스키마를 포함한 간단한 계산기 도구를 정의합니다. - ChatOllama 모델을 초기화합니다.
- 활용
bindTools
메서드는 도구를 모델에 바인딩합니다. - 활용
invoke
메서드가 계산이 필요한 문제를 전송하면 모델이 자동으로 적절한 도구를 호출합니다.
4. 고급 사용법
사용자 지정 프롬프트 템플릿
맞춤형 프롬프트 템플릿은 콘텐츠 생성의 효율성을 향상시킬 뿐만 아니라 출력물의 일관성과 관련성을 보장합니다. 잘 설계된 템플릿을 사용하면 AI 모델의 기능을 최대한 활용하면서 출력 콘텐츠에 대한 제어와 안내를 유지할 수 있습니다:
import { ChatOllama } from "@langchain/ollama";
import { ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate } from "@langchain/core/prompts";
// 初始化ChatOllama模型
const model = new ChatOllama({
model: "llama3.1",
temperature: 0.7,
});
const systemMessageContent = `
你是一位经验丰富的电商文案撰写专家。你的任务是根据给定的产品信息创作吸引人的商品描述。
请确保你的描述简洁、有力,并且突出产品的核心优势。
`;
const humanMessageTemplate = `
请为以下产品创作一段吸引人的商品描述:
产品类型: {product_type}
核心特性: {key_feature}
目标受众: {target_audience}
价格区间: {price_range}
品牌定位: {brand_positioning}
请提供以下三种不同风格的描述,每种大约50字:
1. 理性分析型
2. 情感诉求型
3. 故事化营销型
`;
const prompt = ChatPromptTemplate.fromMessages([
SystemMessagePromptTemplate.fromTemplate(systemMessageContent),
HumanMessagePromptTemplate.fromTemplate(humanMessageTemplate),
]);
const chain = prompt.pipe(model);
async function generateProductDescriptions(productInfo) {
const response = await chain.invoke(productInfo);
return response.content;
}
// 示例使用
const productInfo = {
product_type: "智能手表",
key_feature: "心率监测和睡眠分析",
target_audience: "注重健康的年轻专业人士",
price_range: "中高端",
brand_positioning: "科技与健康的完美结合"
};
generateProductDescriptions(productInfo)
.then((result) => console.log(result))
.catch((error) => console.error("Error:", error));
코드를 실행합니다:
node advanced_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";
const systemTemplate = `
你是一位医疗领域的专家,擅长创建知识图谱。请将所有响应格式化为具有以下结构的JSON对象:
{
"节点": [
{"id": "string", "标签": "string", "类型": "string"}
],
"关系": [
{"源": "string", "目标": "string", "关系": "string"}
]
}
确保所有节点id都是唯一的,并且关系引用的是已存在的节点id。
`;
const humanTemplate = `
请为医疗主题"{topic}"创建一个知识图谱。包括以下相关概念: {concepts}。
提供至少5个节点和5个关系。请确保使用中文回答。
`;
const systemMessage = new SystemMessage(systemTemplate);
const humanPrompt = PromptTemplate.fromTemplate(humanTemplate);
const llmJsonMode = new ChatOllama({
baseUrl: "http://localhost:11434", // 默认值
model: "llama3.1",
format: "json",
});
async function generateMedicalKnowledgeGraph(topic, concepts) {
try {
const humanMessageContent = await humanPrompt.format({
topic: topic,
concepts: concepts.join("、"),
});
const humanMessage = new HumanMessage(humanMessageContent);
const messages = [systemMessage, humanMessage];
const result = await llmJsonMode.call(messages);
console.log(JSON.stringify(result, null, 2));
return result;
} catch (error) {
console.error("生成知识图谱时出错:", error);
}
}
// 使用示例
const topic = "糖尿病";
const concepts = ["胰岛素", "血糖", "并发症", "饮食管理", "运动疗法"];
generateMedicalKnowledgeGraph(topic, concepts);
코드를 실행합니다:
node advanced_json.js
이 코드는 Ollama를 사용하여 구조화된 JSON 출력을 생성하는 방법을 보여줍니다:
- 원하는 JSON 구조를 지정하는 시스템 템플릿을 정의합니다.
- 지식창고에 대한 요청을 생성하기 위한 사람 프롬프트 템플릿을 만듭니다.
- ChatOllama 모델을 초기화하여
format: "json"
를 눌러 JSON 출력을 가져옵니다. - 시스템 메시지와 사람 메시지를 결합하여 모델을 호출하는 의료 지식 그래프를 생성하는 함수를 정의합니다.
json 형식의 특정 출력을 통해 이를 사용할 수 있는 다양한 방법을 엿볼 수 있습니다:
- 자동화된 삼원 생성 기존 접근 방식에서 지식 그래프를 만들려면 일반적으로 상당한 양의 수작업 라벨링 작업이 필요합니다. 전문가들은 문서를 주의 깊게 읽고 중요한 개념과 그 관계를 파악한 다음 트리플(주제-관계-객체)을 수동으로 만들어야 합니다. 이 과정은 시간이 많이 소요될 뿐만 아니라 특히 많은 수의 문서를 다룰 때는 오류가 발생하기 쉽습니다. 빅 언어 모델은 당사의 접근 방식을 사용하여 주어진 주제와 개념에서 관련 노드와 관계를 자동으로 생성할 수 있습니다. 이를 통해 지식 그래프 구축 프로세스가 크게 빨라집니다.
- 데이터 향상 이 접근 방식은 지식 그래프를 직접 생성할 때뿐만 아니라 데이터 향상에도 사용할 수 있습니다. 예를 들어
- 기존 학습 데이터 세트 확장: 모델이 기존 트리플을 기반으로 새로운 관련 트리플을 생성하도록 합니다.
- 다양한 예시 생성: 다양한 의료 상태에 대한 지식 그래프를 생성하면 데이터에 다양성을 더할 수 있습니다.
- 다국어 데이터 생성: 프롬프트를 조정하여 다국어 애플리케이션을 지원하기 위해 다양한 언어로 된 지식 그래프를 생성할 수 있습니다.
- 데이터 품질 개선 빅 언어 모델을 활용하여 광범위한 지식 기반에서 고품질의 일관된 지식 그래프를 생성할 수 있습니다. 잘 설계된 프롬프트를 통해 생성된 데이터가 특정 품질 표준 및 도메인 사양을 충족하도록 보장할 수 있습니다.
- 유연성 및 확장성 이 접근 방식은 매우 유연하며 다양한 영역과 필요에 맞게 쉽게 조정할 수 있습니다:
- 시스템 프롬프트를 수정하여 다양한 지식 그래프 형식을 수용하도록 출력의 JSON 구조를 변경할 수 있습니다.
- 이러한 접근 방식을 기술, 금융, 교육 등의 다른 영역으로 쉽게 확장할 수 있습니다.
평결에 도달하기
이 예시를 통해 간단한 대화 시스템부터 복잡한 지식 그래프 생성까지, 자바스크립트 환경에서 Ollama와 LangChain을 사용해 다양한 AI 애플리케이션을 구축하는 방법을 보여드리겠습니다. 이러한 도구와 기술은 강력한 AI 애플리케이션을 개발하기 위한 탄탄한 기반을 제공합니다.
올라마와 랭체인의 조합은 개발자에게 큰 유연성과 가능성을 제공합니다. 특정 요구사항에 따라 적합한 모델과 구성 요소를 선택하고 애플리케이션 시나리오에 맞는 AI 시스템을 구축할 수 있습니다.
기술이 계속 발전함에 따라 더 많은 혁신적인 애플리케이션이 등장할 것으로 예상됩니다. 이 가이드가 AI 개발 여정을 시작하고 AI 기술의 무한한 가능성을 탐구하는 창의력을 발휘하는 데 도움이 되기를 바랍니다.
© 저작권 정책
이 글은 저작권이 있으며 무단으로 복제해서는 안 됩니다.
관련 게시물
댓글 없음...