Nhảy tới nội dung

LangChain

Đọc các tài liệu chính thức của chương trình

分类1分类2进展
LCELInterface
Streaming
How toRoute between multiple runnables✅
Cancelling requests✅
Use RunnableMaps✅
Add message history (memory)
Cookbook✅Prompt + LLM
✅Multiple chains
✅Retrieval augmented generation (RAG)
✅Querying a SQL DB
Adding memory
✅Using tools
Agents
Model I/OQuickstart
Concepts
PromptsQuick Start
Example selectors
Few Shot Prompt Templates
Partial prompt templates
Composition
LLMsQuick Start
Streaming
Caching
Custom chat models
Tracking token usage
Cancelling requests
Dealing with API Errors
Dealing with rate limits
OpenAI Function calling
Subscribing to events
Adding a timeout
Chat Models
Output Parsers
Retrieval首页/概念
Document loaders
Text Splitters
Retrievers
Text embedding models
Vector stores
Indexing
Experimental
Chains
Agents
More
Guides
User casesSQL
Chatbots
Q&A with RAG
Tool use
Interacting with APIs
Tabular Question Answering
Summarization
Agent Simulations
Autonomous Agents
Code Understanding
Extraction

Sinh thái LangChain

Ưu điểm: Hỗ trợ Javascript, tốt hơn rất nhiều so với LllamaIndex (mặc dù Lumma hỗ trợ ts nhưng tài liệu và API rõ ràng kém hơn nhiều so với phiên bản Python)

Sinh thái:

Diagram outlining the hierarchical organization of the LangChain framework, displaying the interconnected parts across multiple layers.

khái niệm / khái niệm / khái niệm

LLM và Chat Model

Mô hình: bao gồm hai loại LLMs và Mô hình Chat.

import { OpenAI, ChatOpenAI } from "@langchain/openai";

const llm = new OpenAI({
modelName: "gpt-3.5-turbo-instruct",
});

const chatModel = new ChatOpenAI({
modelName: "gpt-3.5-turbo",
});

Mô hình của Anthropic phù hợp nhất với XML, trong khi mô hình của OpenAI phù hợp nhất với JSON.

Phiên bản Typescript

npm下载地址

Cài đặt các thiết bị

npm install langchain @langchain/core @langchain/community @langchain/openai langsmith

LangChain所有第三方的库:链接

Bắt đầu nhanh

import { ChatOpenAI } from "@langchain/openai";

async function main() {
const chatModel = new ChatOpenAI({});
let str = await chatModel.invoke("what is LangSmith?");
console.log(str);
}

main();

Cấu hình (Custom)

OpenAI可配置的内容:见官网

Tên mô hình / Nhiệt độ / API Key / BaseURL

文档

import { OpenAI } from "@langchain/openai";

const model = new OpenAI({
modelName: "gpt-3.5-turbo",
temperature: 0.9,
openAIApiKey: "YOUR-API-KEY",
configuration: {
baseURL: "https://your_custom_url.com",
},
});

Mô hình JSON

const jsonModeModel = new ChatOpenAI({
modelName: "gpt-4-1106-preview",
maxTokens: 128,
}).bind({
response_format: {
type: "json_object",
},
});

定义

Function Call / Công cụ

Thứ nhất: Tools

官方文档

Sử dụng giao diện công cụ mới nhất

const llm = new ChatOpenAI();

const llmWithTools = llm.bind({
tools: [tool],
tool_choice: tool,
});

const prompt = ChatPromptTemplate.fromMessages([
["system", "You are the funniest comedian, tell the user a joke about their topic."],
["human", "Topic: {topic}"]
])

const chain = prompt.pipe(llmWithTools);
const result = await chain.invoke({ topic: "Large Language Models" });

Chỉ định Parser

文档

import { JsonOutputToolsParser } from "langchain/output_parsers";

const outputParser = new JsonOutputToolsParser();

Cách thứ hai: function call

官方文档

Có hai cách:

** Hàm được truyền vào khi gọi **

const result = await model.invoke([new HumanMessage("What a beautiful day!")], {
functions: [extractionFunctionSchema],
function_call: { name: "extractor" },
});

** Liên kết các hàm với mô hình **

có thể tái sử dụng cùng một mô hình

const model = new ChatOpenAI({ modelName: "gpt-4" }).bind({
functions: [extractionFunctionSchema],
function_call: { name: "extractor" },
});

Xác định API

Có hai cách

const extractionFunctionSchema = {
name: "extractor",
description: "Extracts fields from the input.",
parameters: {
type: "object",
properties: {
tone: {
type: "string",
enum: ["positive", "negative"],
description: "The overall tone of the input",
},
word_count: {
type: "number",
description: "The number of words in the input",
},
chat_response: {
type: "string",
description: "A response to the human's input",
},
},
required: ["tone", "word_count", "chat_response"],
},
};

** Sử dụng Zod**

import { ChatOpenAI } from "@langchain/openai";
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";
import { HumanMessage } from "@langchain/core/messages";

const extractionFunctionSchema = {
name: "extractor",
description: "Extracts fields from the input.",
parameters: zodToJsonSchema(
z.object({
tone: z
.enum(["positive", "negative"])
.describe("The overall tone of the input"),
entity: z.string().describe("The entity mentioned in the input"),
word_count: z.number().describe("The number of words in the input"),
chat_response: z.string().describe("A response to the human's input"),
final_punctuation: z
.optional(z.string())
.describe("The final punctuation mark in the input, if any."),
})
),
};

Mô hình I/O

Bộ nạp

CSV-TS

Retriever (quan trọng)

官方

chia thành hai loại

Retriever说明
Knowledge Bases for Amazon Bedrock
Chaindesk Retriever
ChatGPT Plugin Retriever
Dria Retriever
Exa Search
HyDE Retriever
Amazon Kendra Retriever
Metal Retriever
Supabase Hybrid Search
Tavily Search API
Time-Weighted Retriever
Vector Store
Vespa Retriever
Zep Retriever

Tương tự như: ScoreThreshold

文档

ScoreThreshold là một phần trăm.

  • 1.0 là hoàn toàn phù hợp
  • 0.95 có thể là tương tự
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "@langchain/openai";
import { ScoreThresholdRetriever } from "langchain/retrievers/score_threshold";

async function main() {
const vectorStore = await MemoryVectorStore.fromTexts(
[
"Buildings are made out of brick",
"Buildings are made out of wood",
"Buildings are made out of stone",
"Buildings are made out of atoms",
"Buildings are made out of building materials",
"Cars are made out of metal",
"Cars are made out of plastic",
],
[{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }],
new OpenAIEmbeddings()
);

const retriever = ScoreThresholdRetriever.fromVectorStore(vectorStore, {
minSimilarityScore: 0.95, // Finds results with at least this similarity score
maxK: 100, // The maximum K value to use. Use it based to your chunk size to make sure you don't run out of tokens
kIncrement: 2, // How much to increase K by each time. It'll fetch N results, then N + kIncrement, then N + kIncrement * 2, etc.
});

const result = await retriever.getRelevantDocuments(
"building is made out of atom"
);

console.log(result);
};

main();

// [
// Document {
// pageContent: 'Buildings are made out of atoms',
// metadata: { id: 4 }
// }
// ]

**Tự truy vấn (rất tốt, thích hợp cho truy vấn dữ liệu có cấu trúc) **

文档

Supabase (Tạm dịch: Supabase)

Quick Start

混合检索

Supabase官方文档

Trình phân tích

解析器说明
常见String output parser
格式化Structured output parser方便自定义
OpenAI Tools常用
标准格式JSON Output Functions Parser常用
HTTP Response Output Parser
XML output parser
列表List parser常用
Custom list parser常用
其它Datetime parser有用
Auto-fixing parser

Nhiều chuỗi

hàng loạt (serial)

hai cách thức / hai cách thức

  • . pipe
  • RunnableSequence.from([])

Sử dụng.pipe

const prompt = ChatPromptTemplate.fromMessages([
["human", "Tell me a short joke about {topic}"],
]);
const model = new ChatOpenAI({});
const outputParser = new StringOutputParser();

const chain = prompt.pipe(model).pipe(outputParser);
const response = await chain.invoke({
topic: "ice cream",
});

Sử dụng RunnableSequence.from

const model = new ChatOpenAI({});
const promptTemplate = PromptTemplate.fromTemplate(
"Tell me a joke about {topic}"
);

const chain = RunnableSequence.from([
promptTemplate,
model
]);
const result = await chain.invoke({ topic: "bears" });

Số lượng hàng loạt và song song

LCEL tự hỗ trợ

const chain = promptTemplate.pipe(model);
await chain.batch([{ topic: "bears" }, { topic: "cats" }])

Sử dụng RunnableMap

const model = new ChatAnthropic({});
const jokeChain = PromptTemplate.fromTemplate(
"Tell me a joke about {topic}"
).pipe(model);

const poemChain = PromptTemplate.fromTemplate(
"write a 2-line poem about {topic}"
).pipe(model);

const mapChain = RunnableMap.from({
joke: jokeChain,
poem: poemChain,
});

const result = await mapChain.invoke({ topic: "bear" });

chi nhánh / chi nhánh

官方文档

hai cách thức / hai cách thức

  • RunnableBranch
  • Chức năng nhà máy tùy chỉnh

Thử lại, Thử lại, Fallback

N / A Không có

Ví dụ điển hình: Serial

import { PromptTemplate } from "@langchain/core/prompts";
import { RunnableSequence } from "@langchain/core/runnables";
import { StringOutputParser } from "@langchain/core/output_parsers";
import { ChatOpenAI } from "@langchain/openai";

async function main() {
const prompt1 = PromptTemplate.fromTemplate(
`What is the city {person} is from? Only respond with the name of the city.`
);
const prompt2 = PromptTemplate.fromTemplate(
`What country is the city {city} in? Respond in {language}.`
);

const model = new ChatOpenAI({});

const chain1 = prompt1.pipe(model).pipe(new StringOutputParser());

const combinedChain = RunnableSequence.from([
{
city: chain1,
language: (input) => input.language,
},
prompt2,
model,
new StringOutputParser(),
]);

const result = await combinedChain.invoke({
person: "Obama",
language: "German",
});

console.log(result);
}

main();

结果见这里

image-20240301094802136

image-20240301095114942

RAG (Rập)

官方文档

Tải / Loader / ETL

文档

分类项目
本地资源Folders with multiple files
ChatGPT files
CSV files
Docx files
EPUB files
JSON files
JSONLines files
Notion markdown export
Open AI Whisper Audio
PDF files
PPTX files
Subtitles
Text files
Unstructured
Web资源Cheerio
Puppeteer
Playwright
Apify Dataset
AssemblyAI Audio Transcript
Azure Blob Storage Container
Azure Blob Storage File
College Confidential
Confluence
Couchbase
Figma
GitBook
GitHub
Hacker News
IMSDB
Notion API
PDF files
Recursive URL Loader
S3 File
SearchApi Loader
SerpAPI Loader
Sitemap Loader
Sonix Audio
Blockchain Data
YouTube transcripts

更通用的ELT工具:unstructured

Tách ra một cái gì đó

官网

Phiên bản Python

安装LangChain全家桶

pip install langchain langchain-community langchain-core "langserve[all]" langchain-cli langsmith langchain-openai

最新版本号:0.2.6(截止到2024年7月3日)

历史版本

Trung tâm Hub

LangSmith có một Hub, tương tự như Github.

例如RLM

import { UnstructuredDirectoryLoader } from "langchain/document_loaders/fs/unstructured";

import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";
import { MemoryVectorStore } from "langchain/vectorstores/memory"
import { OpenAIEmbeddings, ChatOpenAI } from "@langchain/openai";
import { pull } from "langchain/hub";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";
import { createStuffDocumentsChain } from "langchain/chains/combine_documents";

async function main() {
const options = {
apiUrl: "http://localhost:8000/general/v0/general",
};

const loader = new UnstructuredDirectoryLoader(
"sample-docs",
options
);
const docs = await loader.load();
// console.log(docs);

const vectorStore = await MemoryVectorStore.fromDocuments(docs, new OpenAIEmbeddings());

const retriever = vectorStore.asRetriever();
const prompt = await pull<ChatPromptTemplate>("rlm/rag-prompt");
const llm = new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0 });

const ragChain = await createStuffDocumentsChain({
llm,
prompt,
outputParser: new StringOutputParser(),
})
const retrievedDocs = await retriever.getRelevantDocuments("what is task decomposition")

const r = await ragChain.invoke({
question: "列出名字和联系方式",
context: retrievedDocs,
})
console.log(r);
}

main();