A Loopback4 LLM Chat Extension¶
Overview¶
A Loopack4 based component to integrate a basic Langgraph.js based endpoint in your application which can use any tool that you register using the provided decorator.
Installation¶
Install AIIntegrationsComponent using npm
;
Basic Usage¶
Configure and load the AIIntegrations component in the application constructor as shown below.
LLM Providers¶
Ollama¶
To need the Ollama
based models, install the package - @langchain/ollama
and update your application.ts -
Gemini¶
To use the Gemini
based models, install the package - @google/generative-ai
and @langchain/google-genai
and update your application.ts -
Cerebras¶
To use the Cerebras
based models, install the package - @langchain/cerebras
and update your application.ts -
Anthropic¶
To use the Anthropic
based models, install the package - @langchain/anthropic
and update your application.ts -
OpenAI¶
To use the OpenAI
models, install the package - @langchain/openai
and update your application.ts -
Bedrock¶
To use the Bedrock
based models, install the package - @langchain/aws
and update your application.ts -
This binding would add an endpoint /generate
in your service, that can answer user's query using the registered tools. By default, the module gives one set of tools through the DbQueryComponent
Limiters¶
The package provides a way to limit the usage of the LLM Chat functionality by binding a provider on the key AiIntegrationBindings.LimitStrategy
that follows the interface - ILimitStrategy
.
The packages comes with 3 strategies by default that are bound automatically on the basis of AiIntegrationBindings.Config
-
- ChatCountStrategy - Applies limits per user based on number of chats. It is used if only
chatLimit
andperiod
is provided intokenCounterConfig
. - TokenCountStrategy - Applies a fixed limit per user based on number of tokens used. It is used if
tokenLimit
andperiod
are provided withbufferToken
as optional field that determines that how much buffer to keep while checking for token limit. - TokenCountPerUserStrategy - Applies token based limit similar to
TokenCountStrategy
except the number of tokens commes from user permissionTokenUsage:NUMBER
in the user's token. It applies if onlyperiod
is set intokenCounterConfig
, it also works withbufferToken
just likeTokenCountStrategy
.
DbQueryComponent¶
This component provides a set of pre-built tools that can be plugged into any Loopback4 application -
- generate-query - this tool can be used by the LLM to generate a database query based on user's prompt. It will return a
DataSet
instead of the query directly to the LLM. - improve-query - this tool takes a
DataSet
's id and feedback from the user, and uses it to modify the existingDataSet
query. Users can also vote on datasets via the dataset actions endpoint. - ask-about-dataset - this tool takes a
DataSet
's id and a user prompt, and tries to answer user's question about the database query. Note that it can not run the query.
Database Schema¶
The component uses a dedicated chatbot
schema with the following tables:
- datasets - Stores generated SQL queries with metadata including description, prompt, tables involved, and schema hash
- dataset_actions - Tracks user actions on datasets (votes, comments, improvements)
- chats - Stores chat sessions with metadata and token usage
- messages - Stores individual messages within chats
Dataset Feedback System¶
Users can provide feedback on generated datasets through the dataset actions endpoint. Each dataset can receive votes and comments, which can be used to improve future query generation. The system tracks:
- Vote count for each dataset
- User comments and suggestions
- Improvement history
- Creation and modification timestamps
Query Generation Flow¶
Providing Context¶
There are two ways to provide context to the LLM -
Global Context¶
Global context can be provided as an array of strings through a binding on key DbQueryAIExtensionBindings.GlobalContext
. This binding can be a constant or come through a dynamic provider, something like this -
in application.ts -
Model Context¶
Each model can have associated context in 3 ways -
- Model description - this is the primary description of the model, it is used to select model for generation, so it should only define the purpose of the model itself.
- Model context - this is secondary information about the model, usually defining some specific details about the model that must be kept in mind while using it. NOTE - These values should always include the model name. This must be information that is applicable to overall model usage, or atleast to multiple columns, and not related to any single field of the model.
- Property description - this is the description for a property of a model, providing context for the LLM on how to use and understand a particular property.
Usage¶
You just need to register your models in the configuration of the component, and if the Models have proper and detailed descriptions, the tools should be able to answer the user's prompts based on those descriptions.
Connectors¶
The package comes with 3 connectors by default -
- PgConnector - basic connector for PostgreSQL databases
- SqlLiteConnector - basic connector SqlLite databases, can be used for testing
- PgWithRlsConnector - Connector for PostgreSQL databases with support for Row Security Policies. Refer
PgWithRlsConnector
for more details.
You can write your own connector by following the IDbConnector
interface and and binding it on DbQueryAIExtensionBindings.Connector
.
By default, the package binds PgWithRlsConnector
but if you are not planning to use row security policies or default conditions, you can bind PgConnector
-
Default Conditions¶
The package allows binding an optional provider on key DbQueryAIExtensionBindings.DefaultConditions
that are applied on every query generated by the LLM. NOTE This only works for connectors that support this option.
As of now, the only provider that supports this is PgWithRlsConnector
.
PgWithRlsConnector¶
You can take advantage of the DbQueryAIExtensionBindings.DefaultConditions
by using this connector with a PostgreSQL database. To use this you need to first setup your database to use Row Security Policies. You can use an SQL script that looks something like this to do this -
Once the policies are setup, you can bind the provider for DbQueryAIExtensionBindings.DefaultConditions
-
Writing Your Own Tool¶
You can register your own tools by simply using the @graphTool()
decorator and implementing the IGraphTool
interface. Any such class would be automatically registered with the /generate
endpoint and the LLM would be able to use it as a tool.
Testing¶
Generation Acceptance Builder¶
The generation.acceptance.builder.ts
file provides a utility to run acceptance tests for the llm-chat-component
. These tests validate the functionality of the /reply
endpoint and ensure that the generated SQL queries and their results align with expectations.
Overview¶
This builder facilitates the execution of multiple test cases, each defined with specific prompts, expected results, and configurations. It also generates detailed reports to analyze the performance and correctness of the tests.
Key Features¶
- Dynamic Prompt Parsing: Replaces placeholders in prompts with environment-specific values.
- Token Generation: Creates JWT tokens with required permissions for test execution.
- Query Execution: Executes the generated SQL queries and compares the results with expected outputs.
- Detailed Reporting: Generates markdown reports with metrics such as success rates, token usage, and execution times.
Usage¶
Importing the Builder¶
Running Tests¶
To use the builder, define your test cases as an array of GenerationAcceptanceTestCase
objects and pass them to the generationAcceptanceBuilder
function along with the required parameters.
Example¶
Parameters¶
cases
: An array of test cases to execute.client
: The LoopBack test client.app
: The LoopBack application instance.countPerPrompt
: Number of iterations per test case (default: 1).writeReport
: Whether to generate a markdown report (default: false).
Test Case Structure¶
Each test case should follow the GenerationAcceptanceTestCase
interface:
Report Generation¶
The builder generates a markdown report summarizing the test results. The report includes:
- Success metrics
- Time metrics
- Token usage metrics
- Detailed results for each test case
- Failed queries with actual and expected results
The report is saved in the llm-reports
directory with a filename based on the model name.
Environment Variables¶
The builder relies on the following environment variables:
SAMPLE_DEAL_NAME
: Default value for<testDeal>
placeholder.TEST_TENANT_ID
: Tenant ID for token generation.JWT_SECRET
: Secret key for signing JWT tokens.JWT_ISSUER
: Issuer for JWT tokens.
Dependencies¶
@loopback/testlab
@loopback/core
@loopback/repository
@sourceloop/core
jsonwebtoken
crypto
fs