JavaScript中LangChain实现语义搜索引擎:API集成实战案例 (2025年05月)

云信安装大师
90
AI 质量分
3 5 月, 2025
2 分钟阅读
0 阅读

JavaScript中LangChain实现语义搜索引擎:API集成实战案例 (2025年05月)

引言

在当今信息爆炸的时代,传统的关键词搜索已经无法满足用户对精准信息获取的需求。语义搜索通过理解查询意图和上下文关系,能够提供更相关的结果。本文将带你使用JavaScript和LangChain框架,构建一个简单的语义搜索引擎API集成方案。

准备工作

环境要求

  • Node.js 18+ (推荐20.x LTS版本)
  • npm/yarn包管理器
  • LangChain.js库
  • OpenAI API密钥(或其他LLM提供商)

安装依赖

代码片段
npm install langchain @langchain/core dotenv

核心概念解析

什么是LangChain?

LangChain是一个用于构建由语言模型驱动的应用程序的框架。它提供了:
1. 组件化的接口与各种LLM交互
2. 处理文本嵌入(Embeddings)的工具
3. 检索增强生成(RAG)能力

语义搜索原理

  1. 文本向量化:将文本转换为高维向量表示
  2. 相似度计算:通过余弦相似度等算法比较向量距离
  3. 结果排序:根据相似度返回最相关的结果

完整实现步骤

1. 环境配置

创建.env文件存储API密钥:

代码片段
OPENAI_API_KEY=your_api_key_here

2. 基础搜索引擎实现

代码片段
// search.js
require('dotenv').config();
const { OpenAI } = require('langchain/llms/openai');
const { OpenAIEmbeddings } = require('langchain/embeddings/openai');
const { MemoryVectorStore } = require('langchain/vectorstores/memory');
const { Document } = require('langchain/document');

class SemanticSearchEngine {
  constructor() {
    // 初始化嵌入模型(建议缓存嵌入结果提升性能)
    this.embeddings = new OpenAIEmbeddings({
      openAIApiKey: process.env.OPENAI_API_KEY,
    });

    // 简单内存存储(生产环境建议使用Pinecone等专业向量数据库)
    this.vectorStore = new MemoryVectorStore(this.embeddings);

    // LLM实例用于结果精炼(可选)
    this.llm = new OpenAI({ 
      temperature: 0.7,
      openAIApiKey: process.env.OPENAI_API_KEY 
    });
  }

  // 添加文档到搜索索引
  async addDocuments(docs) {
    const documents = docs.map(
      (content) => new Document({ pageContent: content })
    );
    await this.vectorStore.addDocuments(documents);
    console.log(`成功索引 ${documents.length} 个文档`);
  }

  // 执行语义搜索
  async search(query, k = 3) {
    // Step1: 获取最相似的k个结果
    const results = await this.vectorStore.similaritySearch(query, k);

    // Step2: (可选)使用LLM精炼结果
    const refinedResults = await Promise.all(
      results.map(async (doc) => {
        const prompt = `请用中文总结以下内容,保留关键信息:\n\n${doc.pageContent}`;
        const summary = await this.llm.call(prompt);
        return { ...doc, summary };
      })
    );

    return refinedResults;
  }
}

module.exports = SemanticSearchEngine;

3. API集成示例

创建Express服务端:

代码片段
// server.js
const express = require('express');
const SemanticSearchEngine = require('./search');
const app = express();
app.use(express.json());

const searchEngine = new SemanticSearchEngine();

// 初始化示例数据(实际项目应从数据库加载)
const sampleData = [
 "LangChain是一个用于构建由大语言模型驱动的应用框架",
 "JavaScript是世界上最流行的编程语言之一",
 "语义搜索通过理解查询意图而非关键词匹配来提升搜索结果质量"
];

// API端点定义
app.post('/api/search', async (req, res) => {
 try {
   const { query } = req.body;
   if (!query) return res.status(400).json({ error: '缺少查询参数' });

   // 首次运行时初始化数据(实际项目应有单独的数据加载机制)
   if ((await searchEngine.vectorStore.memoryVectors.length) ===0 ) {
     await searchEngine.addDocuments(sampleData);
   }

   const results = await searchEngine.search(query);
   res.json({ results });
 } catch (error) {
   console.error(error);
   res.status(500).json({ error: '服务器内部错误' });
 }
});

const PORT = process.env.PORT ||3000;
app.listen(PORT, () => console.log(`服务运行在 http://localhost:${PORT}`));

API测试与使用

启动服务:

代码片段
node server.js

使用cURL测试:

代码片段
curl -X POST http://localhost:3000/api/search \
-H "Content-Type: application/json" \
-d '{"query":"什么是LangChain?"}'

预期响应结构:

代码片段
{
 "results": [
   {
     "pageContent": "LangChain是一个用于构建由大语言模型驱动的应用框架",
     "summary": "LangChain是一个框架,专门用于开发基于大型语言模型的应用。"
   },
   ...其他相关结果
 ]
}

性能优化建议

  1. 批量处理文档:当索引大量文档时,分批处理避免内存溢出
  2. 缓存机制:对频繁查询的结果进行缓存
  3. 异步加载:大数据集采用懒加载策略

FAQ常见问题解决

Q1: API响应慢怎么办?
A:
– 检查网络连接到OpenAI服务器的延迟
– 减少返回结果数量(k参数)
– 考虑本地部署嵌入模型如HuggingFace的all-MiniLM-L6-v2

Q2: MemoryVectorStore数据丢失?
A:
– MemoryVectorStore仅适合开发测试
– Production环境应切换到Pinecone、Weaviate等持久化向量数据库

Q3: Token超出限制错误?
A:
– API请求内容过长时会出现
– Solution:
1) truncate长文档
2) implement分块处理(chunking)

Next Steps进阶方向

  1. 混合搜索:结合传统关键词搜索与语义搜索的优势
  2. 个性化排序:加入用户画像提升结果相关性
  3. 多模态扩展:支持图像、视频等非文本内容搜索

Conclusion总结要点

本文我们实现了:
✅ LangChain基础语义搜索引擎架构
✅ Express API集成方案
✅ OpenAI嵌入模型的实战应用

关键收获:
1️⃣ LangChain极大简化了LLM应用开发流程
2️⃣ JavaScript生态已具备成熟的AI集成能力

希望这篇指南能帮助你快速上手语义搜索开发!在实际项目中,记得根据业务需求调整架构设计。

原创 高质量