Add LangchainJS Examples (#146)
parent
92452d46da
commit
88f472e5d2
@ -0,0 +1,2 @@ |
|||||||
|
models/ggml-koala-13B-4bit-128g |
||||||
|
models/ggml-gpt4all-j |
@ -0,0 +1,6 @@ |
|||||||
|
FROM node:latest |
||||||
|
COPY ./langchainjs-localai-example /app |
||||||
|
WORKDIR /app |
||||||
|
RUN npm install |
||||||
|
RUN npm run build |
||||||
|
ENTRYPOINT [ "npm", "run", "start" ] |
@ -0,0 +1,31 @@ |
|||||||
|
# langchain |
||||||
|
|
||||||
|
Example of using langchain in TypeScript, with the standard OpenAI llm module, and LocalAI. |
||||||
|
|
||||||
|
Example for python langchain to follow at a later date |
||||||
|
|
||||||
|
Set up to make it easy to modify the `index.mts` file to look like any langchain example file. |
||||||
|
|
||||||
|
**Please Note** - This is a tech demo example at this time. ggml-gpt4all-j has pretty terrible results for most langchain applications with the settings used in this example. |
||||||
|
|
||||||
|
## Setup |
||||||
|
|
||||||
|
```bash |
||||||
|
# Clone LocalAI |
||||||
|
git clone https://github.com/go-skynet/LocalAI |
||||||
|
|
||||||
|
cd LocalAI/examples/langchain |
||||||
|
|
||||||
|
# (optional) - Edit the example code in typescript. |
||||||
|
# vi ./langchainjs-localai-example/index.ts |
||||||
|
|
||||||
|
# Download gpt4all-j to models/ |
||||||
|
wget https://gpt4all.io/models/ggml-gpt4all-j.bin -O models/ggml-gpt4all-j |
||||||
|
|
||||||
|
# start with docker-compose |
||||||
|
docker-compose up --build |
||||||
|
``` |
||||||
|
|
||||||
|
## Copyright |
||||||
|
|
||||||
|
Some of the example code in index.mts is adapted from the langchainjs project and is Copyright (c) Harrison Chase. Used under the terms of the MIT license, as is the remainder of this code. |
@ -0,0 +1,25 @@ |
|||||||
|
version: '3.6' |
||||||
|
|
||||||
|
services: |
||||||
|
api: |
||||||
|
image: quay.io/go-skynet/local-ai:latest |
||||||
|
build: |
||||||
|
context: ../../ |
||||||
|
dockerfile: Dockerfile.dev |
||||||
|
ports: |
||||||
|
- 8080:8080 |
||||||
|
environment: |
||||||
|
- DEBUG=true |
||||||
|
- MODELS_PATH=/models |
||||||
|
volumes: |
||||||
|
- ./models:/models:cached |
||||||
|
command: ["/usr/bin/local-ai" ] |
||||||
|
|
||||||
|
langchainjs: |
||||||
|
build: |
||||||
|
context: . |
||||||
|
dockerfile: JS.Dockerfile |
||||||
|
environment: |
||||||
|
- 'OPENAI_API_KEY=sk-XXXXXXXXXXXXXXXXXXXX' |
||||||
|
- 'OPENAI_API_HOST=http://api:8080/v1' |
||||||
|
- 'MODEL_NAME=gpt-3.5-turbo' #gpt-3.5-turbo' # ggml-gpt4all-j' # ggml-koala-13B-4bit-128g' |
@ -0,0 +1,2 @@ |
|||||||
|
node_modules/ |
||||||
|
dist/ |
@ -0,0 +1,20 @@ |
|||||||
|
{ |
||||||
|
// Use IntelliSense to learn about possible attributes. |
||||||
|
// Hover to view descriptions of existing attributes. |
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 |
||||||
|
"version": "0.2.0", |
||||||
|
"configurations": [ |
||||||
|
{ |
||||||
|
"type": "node", |
||||||
|
"request": "launch", |
||||||
|
"name": "Launch Program", |
||||||
|
// "skipFiles": [ |
||||||
|
// "<node_internals>/**" |
||||||
|
// ], |
||||||
|
"program": "${workspaceFolder}\\dist\\index.mjs", |
||||||
|
"outFiles": [ |
||||||
|
"${workspaceFolder}/**/*.js" |
||||||
|
] |
||||||
|
} |
||||||
|
] |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,21 @@ |
|||||||
|
{ |
||||||
|
"name": "langchainjs-localai-example", |
||||||
|
"version": "0.1.0", |
||||||
|
"description": "Trivial Example of using langchain + the OpenAI API + LocalAI together", |
||||||
|
"main": "index.mjs", |
||||||
|
"scripts": { |
||||||
|
"build": "tsc --build", |
||||||
|
"clean": "tsc --build --clean", |
||||||
|
"start": "node --trace-warnings dist/index.mjs" |
||||||
|
}, |
||||||
|
"author": "dave@gray101.com", |
||||||
|
"license": "MIT", |
||||||
|
"devDependencies": { |
||||||
|
"@types/node": "^18.16.3", |
||||||
|
"typescript": "^5.0.4" |
||||||
|
}, |
||||||
|
"dependencies": { |
||||||
|
"langchain": "^0.0.67", |
||||||
|
"typeorm": "^0.3.15" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,79 @@ |
|||||||
|
import { OpenAIChat } from "langchain/llms/openai"; |
||||||
|
import { loadQAStuffChain } from "langchain/chains"; |
||||||
|
import { Document } from "langchain/document"; |
||||||
|
import { initializeAgentExecutorWithOptions } from "langchain/agents"; |
||||||
|
import {Calculator} from "langchain/tools/calculator"; |
||||||
|
|
||||||
|
const pathToLocalAi = process.env['OPENAI_API_HOST'] || 'http://api:8080/v1'; |
||||||
|
const fakeApiKey = process.env['OPENAI_API_KEY'] || '-'; |
||||||
|
const modelName = process.env['MODEL_NAME'] || 'gpt-3.5-turbo'; |
||||||
|
|
||||||
|
function getModel(): OpenAIChat { |
||||||
|
return new OpenAIChat({ |
||||||
|
prefixMessages: [ |
||||||
|
{ |
||||||
|
role: "system", |
||||||
|
content: "You are a helpful assistant that answers in pirate language", |
||||||
|
}, |
||||||
|
], |
||||||
|
modelName: modelName, |
||||||
|
maxTokens: 50, |
||||||
|
openAIApiKey: fakeApiKey, |
||||||
|
maxRetries: 2 |
||||||
|
}, { |
||||||
|
basePath: pathToLocalAi, |
||||||
|
apiKey: fakeApiKey, |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// Minimal example. |
||||||
|
export const run = async () => { |
||||||
|
const model = getModel(); |
||||||
|
console.log(`about to model.call at ${new Date().toUTCString()}`); |
||||||
|
const res = await model.call( |
||||||
|
"What would be a good company name a company that makes colorful socks?" |
||||||
|
); |
||||||
|
console.log(`${new Date().toUTCString()}`); |
||||||
|
console.log({ res }); |
||||||
|
}; |
||||||
|
|
||||||
|
await run(); |
||||||
|
|
||||||
|
// This example uses the `StuffDocumentsChain` |
||||||
|
export const run2 = async () => { |
||||||
|
const model = getModel(); |
||||||
|
const chainA = loadQAStuffChain(model); |
||||||
|
const docs = [ |
||||||
|
new Document({ pageContent: "Harrison went to Harvard." }), |
||||||
|
new Document({ pageContent: "Ankush went to Princeton." }), |
||||||
|
]; |
||||||
|
const resA = await chainA.call({ |
||||||
|
input_documents: docs, |
||||||
|
question: "Where did Harrison go to college?", |
||||||
|
}); |
||||||
|
console.log({ resA }); |
||||||
|
}; |
||||||
|
|
||||||
|
await run2(); |
||||||
|
|
||||||
|
// Quickly thrown together example of using tools + agents. |
||||||
|
// This seems like it should work, but it doesn't yet. |
||||||
|
export const temporarilyBrokenToolTest = async () => { |
||||||
|
const model = getModel(); |
||||||
|
|
||||||
|
const executor = await initializeAgentExecutorWithOptions([new Calculator(true)], model, { |
||||||
|
agentType: "zero-shot-react-description", |
||||||
|
}); |
||||||
|
|
||||||
|
console.log("Loaded agent."); |
||||||
|
|
||||||
|
const input = `What is the value of (500 *2) + 350 - 13?`; |
||||||
|
|
||||||
|
console.log(`Executing with input "${input}"...`); |
||||||
|
|
||||||
|
const result = await executor.call({ input }); |
||||||
|
|
||||||
|
console.log(`Got output ${result.output}`); |
||||||
|
} |
||||||
|
|
||||||
|
await temporarilyBrokenToolTest(); |
@ -0,0 +1,15 @@ |
|||||||
|
{ |
||||||
|
"compilerOptions": { |
||||||
|
"target": "es2022", |
||||||
|
"lib": ["ES2022", "DOM"], |
||||||
|
"module": "ES2022", |
||||||
|
"moduleResolution": "node", |
||||||
|
"strict": true, |
||||||
|
"esModuleInterop": true, |
||||||
|
"allowSyntheticDefaultImports": true, |
||||||
|
"isolatedModules": true, |
||||||
|
"outDir": "./dist" |
||||||
|
}, |
||||||
|
"include": ["src", "test"], |
||||||
|
"exclude": ["node_modules", "dist"] |
||||||
|
} |
@ -0,0 +1 @@ |
|||||||
|
{{.Input}} |
@ -0,0 +1,17 @@ |
|||||||
|
name: gpt-3.5-turbo |
||||||
|
parameters: |
||||||
|
model: ggml-gpt4all-j # ggml-koala-13B-4bit-128g |
||||||
|
top_k: 80 |
||||||
|
temperature: 0.2 |
||||||
|
top_p: 0.7 |
||||||
|
context_size: 1024 |
||||||
|
threads: 4 |
||||||
|
stopwords: |
||||||
|
- "HUMAN:" |
||||||
|
- "GPT:" |
||||||
|
roles: |
||||||
|
user: " " |
||||||
|
system: " " |
||||||
|
template: |
||||||
|
completion: completion |
||||||
|
chat: completion # gpt4all |
@ -0,0 +1,4 @@ |
|||||||
|
The prompt below is a question to answer, a task to complete, or a conversation to respond to; decide which and write an appropriate response. |
||||||
|
### Prompt: |
||||||
|
{{.Input}} |
||||||
|
### Response: |
Loading…
Reference in new issue