Building a Basic Chat Application
This tutorial will guide you through building a simple chat application using LangChainGo.
Step 1: Set Up Your Environment
First, create a new Go project:
mkdir langchain-chat-app
cd langchain-chat-app
go mod init chat-app
Install LangChainGo:
go get github.com/tmc/langchaingo
Step 2: Configure Your API Key
Set your OpenAI API key as an environment variable:
export OPENAI_API_KEY="your-api-key-here"
Step 3: Create the Basic Chat Application
Let's start with a simple chat application:
package main
import (
    "context"
    "fmt"
    "log"
    "github.com/tmc/langchaingo/llms"
    "github.com/tmc/langchaingo/llms/openai"
)
func main() {
    // Initialize the OpenAI LLM
    llm, err := openai.New()
    if err != nil {
        log.Fatal(err)
    }
    // Create a context
    ctx := context.Background()
    // Send a message to the LLM
    response, err := llms.GenerateFromSinglePrompt(
        ctx,
        llm,
        "Hello! How can you help me today?",
    )
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("AI:", response)
}
Step 4: Add Interactive Chat
Now let's make it interactive:
package main
import (
    "bufio"
    "context"
    "fmt"
    "log"
    "os"
    "strings"
    "github.com/tmc/langchaingo/llms"
    "github.com/tmc/langchaingo/llms/openai"
)
func main() {
    // Initialize LLM
    llm, err := openai.New()
    if err != nil {
        log.Fatal(err)
    }
    ctx := context.Background()
    reader := bufio.NewReader(os.Stdin)
    fmt.Println("Chat Application Started (type 'quit' to exit)")
    fmt.Println("----------------------------------------")
    for {
        fmt.Print("You: ")
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        if input == "quit" {
            break
        }
        response, err := llms.GenerateFromSinglePrompt(ctx, llm, input)
        if err != nil {
            fmt.Printf("Error: %v\n", err)
            continue
        }
        fmt.Printf("AI: %s\n\n", response)
    }
}
Step 5: Add Conversation Memory
To make the chat remember previous messages:
package main
import (
    "bufio"
    "context"
    "fmt"
    "log"
    "os"
    "strings"
    "github.com/tmc/langchaingo/llms"
    "github.com/tmc/langchaingo/llms/openai"
    "github.com/tmc/langchaingo/memory"
)
func main() {
    // Initialize LLM
    llm, err := openai.New()
    if err != nil {
        log.Fatal(err)
    }
    // Create conversation memory
    chatMemory := memory.NewConversationBuffer()
    ctx := context.Background()
    reader := bufio.NewReader(os.Stdin)
    fmt.Println("Chat with Memory (type 'quit' to exit)")
    fmt.Println("----------------------------------------")
    for {
        fmt.Print("You: ")
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        if input == "quit" {
            break
        }
        // Get conversation history
        messages, _ := chatMemory.ChatHistory.Messages(ctx)
        
        // Format the conversation
        var conversation string
        for _, msg := range messages {
            conversation += msg.GetContent() + "\n"
        }
        
        // Add current input to the conversation
        fullPrompt := conversation + "Human: " + input + "\nAssistant:"
        // Generate response
        response, err := llms.GenerateFromSinglePrompt(ctx, llm, fullPrompt)
        if err != nil {
            fmt.Printf("Error: %v\n", err)
            continue
        }
        // Save to memory
        chatMemory.ChatHistory.AddUserMessage(ctx, input)
        chatMemory.ChatHistory.AddAIMessage(ctx, response)
        fmt.Printf("AI: %s\n\n", response)
    }
}
Step 6: Add a Conversation Chain
For a more sophisticated approach using chains that automatically manage memory:
package main
import (
    "bufio"
    "context"
    "fmt"
    "log"
    "os"
    "strings"
    "github.com/tmc/langchaingo/chains"
    "github.com/tmc/langchaingo/llms/openai"
    "github.com/tmc/langchaingo/memory"
)
func main() {
    // Initialize LLM
    llm, err := openai.New()
    if err != nil {
        log.Fatal(err)
    }
    // Create conversation memory
    chatMemory := memory.NewConversationBuffer()
    // Create conversation chain
    // The built-in conversation chain includes a default prompt template
    // and handles memory automatically
    conversationChain := chains.NewConversation(llm, chatMemory)
    ctx := context.Background()
    reader := bufio.NewReader(os.Stdin)
    fmt.Println("Advanced Chat Application (type 'quit' to exit)")
    fmt.Println("----------------------------------------")
    for {
        fmt.Print("You: ")
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        if input == "quit" {
            break
        }
        // Run the chain with the input
        result, err := chains.Run(ctx, conversationChain, input)
        if err != nil {
            fmt.Printf("Error: %v\n", err)
            continue
        }
        fmt.Printf("AI: %s\n\n", result)
    }
    fmt.Println("Goodbye!")
}
Step 7: Running Your Application
Save any of the above examples to main.go and run:
go run main.go
Complete Example
You can find the complete working example with all steps in the tutorial-basic-chat-app directory.
Conclusion
You've now built a fully functional chat application with LangChainGo! This foundation can be extended with additional features like tool calling, RAG (Retrieval Augmented Generation), and more sophisticated conversation management.