使用 Ragas 评估你的 Elasticsearch LLM 应用

作者:来自 Elastic Jessica Garson

使用 Ragas 指标和 Elasticsearch 评估 RAG 解决方案的质量。

想要获得 Elastic 认证吗?来看看下一次 Elasticsearch 工程师培训什么时候开始吧!

Elasticsearch 拥有大量新功能,可以帮助你根据使用场景构建最佳搜索解决方案。深入学习我们的示例笔记本,了解更多信息,开启免费的云试用,或者现在就在本地机器上尝试 Elastic。


Ragas 是一个评估框架,可以让你更深入地了解 LLM 应用的运行情况。它提供既定的指标和评分,用于对 LLM 应用的整体性能进行量化分析。像 Ragas 这样的评估框架能够揭示 LLM 系统中的问题,并提供标准化指标来指导改进,定位潜在问题所在。

使用像 Ragas 这样的框架非常有帮助,因为它可以减少使用 LLM 系统时的猜测性工作,使你能够衡量和改进过去的性能。它可以帮助你了解应用是否在某些方面容易产生幻觉,应用是否生成了合适的答案,或者检索是否拉取了不相关的信息。

这篇博客文章将带你通过一个示例,使用 Ragas 指标和 Elasticsearch 来评估一个检索增强生成(RAG)解决方案的质量。你可以在 GitHub 上找到完整代码和相关资源。

本文讨论的解决方案首先将一个 JSON 文件中的数据集上传到 Elasticsearch。所用的数据集是 books.json,它是来自 Goodreads 的 25 本书的子集,包括书名、作者姓名、书籍描述、出版年份和 Goodreads 链接。

在书籍数据加载完成后,下一步是在 Elasticsearch 中存储带有向量嵌入的索引。然后你可以创建评估问题,并使用这些问题通过向量搜索(vector search)检索相关上下文。

一旦为每个问题检索到上下文,你就可以生成答案和基准答案。基准答案本质上是理想答案。使用 GPT-4o,你可以基于检索到的上下文生成答案,而一个单独的函数会生成基准答案,应用评分逻辑对检索结果中最相关的书籍进行排序和选择,生成推荐,用作评估基准。基本上就是尝试弄清楚你真正寻找的内容,找到最匹配的响应,并向你解释原因。

最后,你将通过使用 Ragas 指标将生成的答案与基准答案进行比较,并查看结果来评估性能。

前提条件:

  • 使用的 Python 版本是 Python 3.12.1,但你可以使用任何高于 3.10 的 Python 版本。

  • 本示例使用的 Elasticsearch 版本是 9.0.3,但你可以使用任何高于 8.10 的 Elasticsearch 版本。

  • 你需要一个 OpenAI API Key,可以在 OpenAI 开发者门户的 API keys 页面找到。

  • 你还需要具备向量数据库和 RAG 的基础知识。如果你还不熟悉 Elastic 中的向量搜索概念,可以先查看以下资源:

指标

本示例中使用的指标是 context precision、faithfulness 和 context recall。

  • Context precision 指生成答案与实际问题或主题的相关性,衡量答案中使用的检索上下文中有多少是真正与回答问题相关的。

  • Faithfulness 用于判断 LLM 是否出现幻觉,表示生成答案的准确性。

  • Context recall 衡量成功检索到的相关文档数量,重点在于不遗漏重要结果。

  • 对于 context_precision,高分意味着生成的答案能在上下文中找到。Faithfulness 得分高意味着生成的答案准确并与参考一致。Context_recall 得分高意味着生成的答案使用了全部或大部分相关上下文。

选择这三个指标的原因是它们可以为检索器和生成器的性能提供可操作的信号。它们能让你判断 RAG 系统是否检索到了正确的信息,是否回答了检索到的内容,以及答案是否正确或有支撑。

这只是 Ragas 提供的部分指标,你可以在 Ragas 文档中了解更多可用指标。

环境设置

首先你需要安装此应用所需的依赖包,包括:

  • Elasticsearch Python client—— 用于连接和认证 Elasticsearch,并执行向量搜索

  • Ragas —— 用于通过标准指标评估 LLM 应用的质量

  • Hugging Face library datasets —— 用于创建健壮的评估数据集

  • Langchain-OpenAI —— 用于生成用户问题的答案和评估

!pip install -q elasticsearch ragas datasets langchain-openai

在安装完所需包之后,你现在可以导入以下模块:

  • os:用于设置环境变量和其他相关任务

  • json:用于解析包含书籍的 JSON 文件

  • getpass:用于传递 API keys 和 tokens 等敏感值

  • Elasticsearch Python client:用于连接 Elasticsearch

  • ragas:用于评估

  • ragas.metrics:用于评估 RAG 应用的指标

  • datasets:用于创建评估数据集

  • langchain_openai:用于模型对话功能

import os
import json
from getpass import getpass
from elasticsearch import Elasticsearch
from ragas import evaluate
from ragas.metrics import faithfulness, context_recall, context_precision
from datasets import Dataset
from langchain_openai import ChatOpenAI

创建 Elasticsearch 索引和向量搜索

现在,你需要创建一个名为 es 的变量,在其中传入你的 Elasticsearch 主机地址和 Elasticsearch API key。

es = Elasticsearch(
   getpass("Host: "),
   api_key=getpass("API Key: "),
)

你还需要创建一个名为 index_name 的变量,可以设置为任意你想给索引起的名字。在这个示例中,你可以将索引命名为 ragas-books。

index_name = "ragas-books"

为了给数据集添加向量嵌入,你需要创建一个函数,将查询字符串转换为向量,使用的 Elastic 机器学习模型是 .multilingual-e5-small-x86_64。请务必查看我们关于 E5 模型的文档以了解更多信息。如果遇到问题,你可能需要先部署该模型,代码才能正常运行。

def embed_query(text: str):
  
   res = es.ml.infer_trained_model(
       model_id=".multilingual-e5-small_linux-x86_64",
       body={"docs": [{"text_field": f"query: {text}"}]}
   )
  
   vec = res["inference_results"][0]["predicted_value"]
  
   return vec

现在,你应该检查是否存在同名索引。如果存在,则删除旧索引。之后,你可以使用适当的映射创建一个新索引。由于使用的数据集是来自 Goodreads 的书籍片段,映射将与该示例的标题匹配。

if es.indices.exists(index=index_name):
   es.indices.delete(index=index_name)
   print(f"Deleted existing index '{index_name}'")

es.indices.create(index=index_name, body={
   "mappings": {
       "properties": {
           "book_title": {"type": "text"},
           "author_name": {"type": "text"},
           "book_description": {"type": "text"},
           "rating_score": {"type": "float"},
           "embedding": {
               "type": "dense_vector",
               "dims": 384,
               "index": True,
               "similarity": "cosine"
           }
       }
   }
})
print(f"Created index '{index_name}'")

此时,你需要从 books.json 文件中提取数据,循环处理每条记录,为书籍描述生成嵌入,并将其加载到 Elasticsearch 索引中。由于原始数据集包含书名、作者姓名、书籍描述、出版年份和 Goodreads 链接,书籍描述是生成嵌入的最佳选择,因为它包含超越关键词的语义信息。你可以查看这篇 LinkedIn 帖子,了解哪些字段适合语义搜索(semantic search)。

虽然可以从多个字段(如书名和描述)生成嵌入,但仅使用描述的方法更简单,避免了来自较短字段如书名的噪声。这种方法有一个权衡:可能会错过一些特定于书名的匹配。

with open("books.json") as f:
   books = json.load(f)

for i, book in enumerate(books, 1):
   try:
       book["embedding"] = embed_query(book["book_description"])
       es.index(index=index_name, document=book)
       print(f"Indexed {i}: {book['book_title']}")
   except Exception as e:
       print(f"Failed to index '{book.get('book_title', 'Unknown')}': {e}")

现在数据已加载到 Elasticsearch,你可以创建一个名为 vector_search 的函数来执行 k 最近邻(KNN)搜索。top_k 值选择为 3,因为这是从 Elasticsearch 为每个问题检索的最近邻上下文块数量。这个值通常足够小以保持上下文相关,同时也足够大,为模型提供多个选项,避免因检索错误而遗漏信息。如果你发现 RAG 应用的结果不准确,可以调整 top_k 值。要了解选择 K 值的更多信息,请查看我们关于该主题的博客文章。

该函数首先使用 embed_query 函数为输入查询生成嵌入。它在指定索引上执行搜索,返回结果,并根据书名创建上下文。最后,它返回 RAG 使用的文本上下文和书籍的元数据。

def vector_search(query, top_k=3):
  
   query_vector = embed_query(query)
  
   body = {
       "knn": {
           "field": "embedding",
           "k": top_k,
           "num_candidates": 100,
           "query_vector": query_vector
       },
       "_source": ["book_title", "author_name", "book_description", "rating_score"]
   }
  
   res = es.search(index=index_name, body=body)
   hits = res["hits"]["hits"]
   contexts, books_info = [], []
  
   for hit in hits:
       book = hit["_source"]
       context = f"{book['book_title']} by {book['author_name']}: {book['book_description']}"
       contexts.append(context)
       books_info.append(book)
  
   return contexts, books_info

实现 RAG 生成组件

此时,你需要检查是否为 OpenAI API Key 设置了环境变量,如果没有,可以使用 getpass 来设置一个。

获取 OpenAI API Key 后,你可以创建一个名为 chat_llm 的变量,用于 RAG。该变量调用 ChatOpenAI,传入你要使用的模型、控制 LLM 输出随机性/创造性的 temperature(较低值通常更稳妥)以及 OpenAI API Key。虽然本示例使用 gpt-4o,你也可以通过调整参数 model="模型名称" 来轻松更换模型。

if "OPENAI_API_KEY" not in os.environ:
   os.environ["OPENAI_API_KEY"] = getpass("OPENAI_API_KEY: ")

API_KEY = os.environ["OPENAI_API_KEY"]

chat_llm = ChatOpenAI(
   model="gpt-4o",
   temperature=0.1,
   api_key=API_KEY
)

接下来,你可以创建一个名为 generate_answer 的函数,该函数首先将上下文字符串合并为一个文本块。然后,你可以生成一个提示,指示 LLM 仅使用提供的上下文,并将该提示传递给 LLM 获取响应。之后,需要去掉响应的空白字符。该函数表示 RAG 中的生成过程,在使用 Ragas 评估生成答案质量时起关键作用。

def generate_answer(question, contexts):
  
   context_text = "\n\n".join(contexts)
  
   prompt = f"""You are a helpful assistant that recommends books.
Use only the information from the context below to answer the question.
Do not include any books, authors, or details that are not explicitly present in the context.

Repeat the exact book title and author from the context in your answer.

Context:
{context_text}

Question:
{question}

Answer:"""
   response = chat_llm.invoke(prompt)
  
   return response.content.strip()

在创建表示已知正确答案的基准答案之前,你可以使用一个函数从用户问题中提取意图模式和其他关键属性。函数 analyze_question_intent 旨在识别书籍类型、提取质量偏好,并判断问题是否与特定作者相关。

def analyze_question_intent(question):
    question_lower = question.lower()
    
    intent_patterns = {
        'genre_specific': {
            'science fiction': ['science fiction', 'sci-fi', 'space', 'future', 'alien', 'technology'],
            'fantasy': ['fantasy', 'magic', 'dragon', 'wizard', 'medieval', 'kingdom'],
            'mystery': ['mystery', 'detective', 'crime', 'murder', 'investigation', 'thriller'],
            'romance': ['romance', 'love', 'relationship', 'romantic'],
            'horror': ['horror', 'scary', 'ghost', 'supernatural', 'fear'],
            'historical': ['historical', 'history', 'war', 'period', 'ancient'],
            'biography': ['biography', 'memoir', 'life story', 'autobiography'],
            'non-fiction': ['non-fiction', 'nonfiction', 'factual', 'real', 'educational']
        },
        'quality_indicators': {
            'high_rating': ['high rating', 'highly rated', 'best rated', 'top rated', 'excellent'],
            'popular': ['popular', 'bestseller', 'well-known', 'famous', 'acclaimed'],
            'award_winning': ['award', 'prize', 'winner', 'acclaimed', 'celebrated'],
            'classic': ['classic', 'timeless', 'masterpiece', 'legendary'],
            'recent': ['recent', 'new', 'latest', 'modern', 'contemporary']
        },
        'author_focus': ['author', 'writer', 'by', 'written by']
    }
    
    detected_genres = []
    for genre, keywords in intent_patterns['genre_specific'].items():
        if any(keyword in question_lower for keyword in keywords):
            detected_genres.append(genre)
    
    quality_preferences = []
    for quality_type, keywords in intent_patterns['quality_indicators'].items():
        if any(keyword in question_lower for keyword in keywords):
            quality_preferences.append(quality_type)
    
    author_focused = any(keyword in question_lower for keyword in intent_patterns['author_focus'])
    
    return {
        'genres': detected_genres,
        'quality_preferences': quality_preferences,
        'author_focused': author_focused,
        'question_lower': question_lower,
        'genre_keywords': intent_patterns['genre_specific']
    }

你还需要根据意图数据对书籍与用户查询进行评分。你会得到一个数值评分,分数越高表示匹配度越好,同时会返回解释评分的原因列表,以及书籍的评分和元数据。

def calculate_book_score(book, intent_data):
    score = 0
    reasons = []
    
    rating = float(book.get('rating_score', 0))
    score += rating * 10
    
    book_title = book.get('book_title', '').lower()
    book_desc = book.get('book_description', '').lower()
    author_name = book.get('author_name', '')
    
    for genre in intent_data['genres']:
        genre_keywords = intent_data['genre_keywords'][genre]
        if any(keyword in book_desc or keyword in book_title for keyword in genre_keywords):
            score += 30
            reasons.append(f"matches {genre} genre")
            break
    
    if 'high_rating' in intent_data['quality_preferences'] and rating >= 4.0:
        score += 20
        reasons.append("high rating")
    
    if 'popular' in intent_data['quality_preferences'] and len(book_desc) > 200:
        score += 15
        reasons.append("comprehensive description suggests popularity")
    
    if intent_data['author_focused'] and author_name:
        score += 10
        reasons.append("has clear author attribution")
    
    stop_words = ['a', 'an', 'the', 'is', 'are', 'what', 'can', 'you', 'me', 'i', 'book', 'books']
    question_words = [word for word in intent_data['question_lower'].split() if word not in stop_words]
    
    desc_matches = sum(1 for word in question_words if word in book_desc)
    if desc_matches > 0:
        score += desc_matches * 5
        reasons.append(f"description matches {desc_matches} key terms")
    
    return {
        'book': book,
        'score': score,
        'reasons': reasons,
        'rating': rating
    }

要创建基准答案,你需要首先设置一个回退选项,以防未找到书籍。如果有可用书籍,它会选择排名最高的结果,并根据检测到的意图生成推荐。优先顺序为:先匹配类型,再考虑高评分偏好,然后是受欢迎度偏好,最后是特定作者请求。如果都不适用,则回退到通用推荐。该函数会尽可能优先选择评分较高的书籍,并在第二本书的分数接近最高书籍分数时,将其作为额外建议包含在内。

下面的函数是一个良好的起点,因为它使用检索上下文而非外部知识,应用了业务逻辑(如评分偏好和类型匹配),并生成一致且合理的响应。但手动生成基准答案难以扩展。在生产环境中,你可能希望让基准答案半自动生成并有人类审核,或通过 LLM 生成并进行验证。

def generate_ground_truth_response(top_books, intent_data):
    if not top_books:
        return "No relevant books found."
    
    top_book = top_books[0]
    book = top_book['book']
    title = book['book_title']
    author = book['author_name']
    rating = top_book['rating']
    
    detected_genres = intent_data['genres']
    quality_preferences = intent_data['quality_preferences']
    author_focused = intent_data['author_focused']
    
    if detected_genres:
        genre = detected_genres[0]
        if 'high_rating' in quality_preferences or rating >= 4.0:
            response = f"For a highly-rated {genre} book, I recommend '{title}' by {author} (rating: {rating:.1f})."
        else:
            response = f"A good {genre} book from the available options is '{title}' by {author}."
    
    elif 'high_rating' in quality_preferences:
        response = f"Among the highest-rated books available, '{title}' by {author} stands out with a {rating:.1f} rating."
    
    elif 'popular' in quality_preferences:
        response = f"'{title}' by {author} appears to be a popular choice based on the comprehensive information available."
    
    elif author_focused:
        response = f"I recommend '{title}' by the author {author}."
    
    else:
        if rating >= 4.0:
            response = f"I recommend '{title}' by {author}, which has a strong rating of {rating:.1f}."
        else:
            response = f"Based on the available books, '{title}' by {author} would be a good choice."
    
    if len(top_books) > 1 and top_books[1]['score'] > top_books[0]['score'] * 0.8:
        second_book = top_books[1]['book']
        response += f" You might also consider '{second_book['book_title']}' by {second_book['author_name']}."
    
    return response

运行演示

最后,你现在可以运行演示了。这个函数类似于 main 函数,将所有其他函数连接在一起以生成评估。首先,你需要定义一些演示问题来评估 RAG 应用。然后,初始化列表并循环处理每个问题。在循环过程中,你需要使用检索到的上下文生成答案,并使用最佳匹配书籍创建基准答案。接下来,收集用于评估的数据,并创建 Ragas 评估的数据集。一旦创建好评估数据集,你就可以运行评估、打印结果,并将结果保存到 CSV 文件中。

def run_ragas_demo():
   print("🚀 Demo:\n")

   demo_questions = [
       "What's a good science fiction book with high ratings?",
       "Can you suggest a fantasy book by a popular author?",
       "What's a highly rated mystery novel?",
       "Recommend a book with good reviews"
   ]

   questions, contexts_list, answers, ground_truths = [], [], [], []

   for i, question in enumerate(demo_questions, 1):
       print(f"\n📚 Question {i}: {question}")
      
       try:
           contexts, books_info = vector_search(question, top_k=3)
           if not contexts:
               print(f"No contexts found for question {i}")
               continue
              
           answer = generate_answer(question, contexts)
           print(f"Answer: {answer[:100]}...")
           ground_truth = create_dynamic_ground_truth(question, books_info)
           print(f"Ground Truth: {ground_truth}")
           questions.append(question)
           contexts_list.append(contexts)
           answers.append(answer)
           ground_truths.append(ground_truth)
          
       except Exception as e:
           print(f"Error processing question {i}: {e}")
           continue

   if not questions:
       print("\nNo valid Q&A pairs generated.")
       return None

   eval_dataset = Dataset.from_dict({
       "question": questions,
       "contexts": contexts_list,
       "answer": answers,
       "ground_truth": ground_truths,
   })

   print("\n✨ Running Ragas evaluation...")
   try:
       result = evaluate(
           dataset=eval_dataset,
           metrics=[context_precision, faithfulness, context_recall],
           llm=chat_llm,
           embeddings=None
       )
      
       df = result.to_pandas()
      
       print("\n✨ Ragas Evaluation Results:")
       print(df)
      
       print("\✨ Averages:")
      
       for metric, value in df.mean(numeric_only=True).items():
           print(f"{metric}: {value:.3f}")
          
       df.to_csv("ragas_evaluation.csv", index=False)
       print("\nResults saved to 'ragas_evaluation.csv'")
       return result
      
   except Exception as e:
       print(f"Ragas evaluation failed: {e}")
       return None

最后,我们可以运行演示,并加入一些额外的错误处理。

try:
    results = run_ragas_demo()
    if results:
        print("\n🎉 Demo completed successfully!")
    else:
        print("\nDemo completed with issues.")
        
except Exception as e:
    print(f"\nError during demo: {e}")
    import traceback
    traceback.print_exc()

检查输出

在 LLM 应用中,这些指标的得分高于 0.8 通常表示性能较强,但具体情况可能因数据集、领域和使用场景而异。每个指标的更多信息可以在文档中找到。

在下面的输出中,平均 faithfulness 得分为 0.750,表明大多数答案总体上与检索到的上下文保持一致。Context_recall 平均值为 0.500,显示系统只有一半时间检索到了足够的信息以生成完整答案。同时,context_precision 平均值为 0.625,表明生成内容有相当一部分直接匹配检索到的上下文,但仍有提升空间。

查看每个问题时,问题 0 和问题 3 在 faithfulness 和 context precision 上得分都很高,显示检索与生成之间的一致性。问题 1 的召回率较高,但精确度中等,这意味着可能添加了一些超出检索上下文的细节。问题 2 在精确度和召回率上都得分较低,显示检索存在缺口,生成内容偏离了提供的上下文。

为了改善这些结果,你可以通过尝试不同的嵌入模型、优化分块策略或应用上下文工程来提升检索质量,更好地匹配用户查询。在生成方面,使用更严格的提示和其他提示工程策略有助于减少幻觉,并确保评估基准答案与检索内容紧密对齐,从而获得更准确的评分。

✨ Ragas Evaluation Results:
                                          user_input  \
0  What's a good science fiction book with high r...   
1  Can you suggest a fantasy book by a popular au...   
2               What's a highly rated mystery novel?   
3                 Recommend a book with good reviews   

                                  retrieved_contexts  \
0  [Light of the Jedi by Charles Soule: Two hundr...   
1  [Alien Warrior's Mate by Vi Voxley: He's damn ...   
2  [The Island of Doctor Moreau by H.G. Wells: Ra...   
3  [The Island of Doctor Moreau by H.G. Wells: Ra...   

                                            response  \
0               "Light of the Jedi" by Charles Soule   
1              The Book of Time by Guillaume Prévost   
2                   "Human Nature" by Jonathan Green   
3  "The Island of Doctor Moreau" by H.G. Wells is...   

                                           reference  context_precision  \
0  For a highly-rated science fiction book, I rec...                1.0   
1  A good fantasy book from the available options...                0.5   
2  For a highly-rated mystery book, I recommend '...                0.0   
3  Based on the available books, 'The Island of D...                1.0   

   faithfulness  context_recall  
0           1.0             0.0  
1           0.5             1.0  
2           0.5             0.0  
3           1.0             1.0  
\✨ Averages:
context_precision: 0.625
faithfulness: 0.750
context_recall: 0.500

Results saved to 'ragas_evaluation.csv'

🎉 Demo completed successfully!

使用 Ragas 等评估框架的常见挑战

虽然像 Ragas 这样的评估框架可以作为有用的基线,但它们仅作为指导,设计目的是作为更广泛评估策略的一部分,而非系统质量的最终衡量标准。

评估框架存在一些常见问题,包括:过于简单的基准答案无法呈现全貌、样本量过小,以及 LLM 评估 LLM 时可能出现的循环性问题。

此外,评估结果有时与实际性能存在脱节。在真实用户场景和少见情况下,高评估分的系统可能表现不一致。此类框架可能过度关注特定维度,如事实准确性或相关性,而可能低估其他维度,如用户体验、响应延迟或对模糊查询的处理能力。

为缓解这些挑战,你可以探索 A/B 测试与真实用户、使用人类在环审查或 LLM 作为评判者的集成方式,以减少评估者偏差。

下一步

本文示例是使用 Ragas 的起点。在大规模应用此类解决方案时,还需考虑一些关键事项:

  • 每当源数据发生变化时,定期在 Elasticsearch 中重新建立索引

  • 使用广泛、现实的评估集来跟踪真实世界性能

  • 在生产规模下衡量和优化系统速度及成本,以避免瓶颈或预算问题

结论

使用 Ragas 框架等评估方法可以帮助你判断 LLM 应用是否按预期运行,并提供准确性参考。它可以指导你决定是否切换到其他模型,如果当前模型表现不如预期,并可用于不同模型的并行对比,以评估每个模型在你的使用场景中的表现。

原文:Evaluating your Elasticsearch LLM applications with Ragas - Elasticsearch Labs

相关推荐

AgentHack Shanghai|基于阿里云AI搜索 Elasticsearch x Qoder 构建AI Agent应用

2026年12月12日,Elastic社区、阿里云与Qoder联合举办AgentHack实战活动,聚焦AI编程、搜索检索与智能体工具链融合。参赛者将使用唯一指定工具QoderCN,在一天内完成从需求分析到可演示原型的构建,结合阿里云AI搜索或Elastic生态实现真实场景应用。活动提供技术工作坊、导师答疑及1个月QoderCN专业版会员,鼓励展示数据检索、工具调用与任务闭环的完整链路。参赛者可基于阿里云Elasticsearch、ElasticCloud或自部署环境,打造企业知识问答、业务分析等智能体原型,

Elastic 中国社区官方博客 1427

Elastic 线下 Meetup 将于 2026 年 12 月 19 号下午在西安举行

2026年12月19日,Elastic、阿里云与新智锦绣联合举办西安站ElasticMeetup。活动聚焦Elasticsearch向量搜索、AI Agents构建及企业级知识引擎演进,特邀刘晓国、陈星宇、孔祥超等专家分享技术前沿实践。内容涵盖语义搜索、智能诊断、云原生管控与大模型时代搜索架构升级,助力开发者掌握企业级AI应用落地核心能力。

Elastic 中国社区官方博客 1288

Elastic 线下 Meetup 将于 2026 年 11 月 28 号下午在杭州举行

2026年11月28日,杭州阿里云谷园区将举办AI搜索技术盛会。活动汇聚Elastic社区首席布道师刘晓国、中国电子云高斌、阿里云汤祯捷及预言家科技欧阳楚才等专家,聚焦Elasticsearch向量搜索、AI Agents构建、本体智能体上下文引擎与电商智能导购系统,探讨AgenticSearch 2.0、多模态检索与企业级智能搜索演进。现场设茶歇、合影与抽奖,报名成功后请扫码入群。

Elastic 中国社区官方博客 1076

Elastic:如何成为一名 Elastic 认证工程师,Elastic 认证分析师及 Elastic 认证可观测性工程师

Elasticsearch 无疑是是目前世界上最为流行的大数据搜索引擎。根据 DB - Engines 的统计,Elasticsearch 雄踞排行榜第一名,并且市场还在不断地扩大:能够成为一名 Elastic 认证工程师也是很多开发者的梦想。这个代表了 Elastic 的最高认证,在业界也得到了很高的认知度。得到认证的工程师,必须除了具有丰富的 Elastic Stack 知识,而且必须有丰富的操作及有效的解决问题的能力。拥有这个认证证书,也代表了个人及公司的荣誉。针对个人的好处是,你可以..

Elastic 中国社区官方博客 2万+

Elastic:开发者上手指南

你们好,我是Elastic的刘晓国。如果大家想开始学习Elastic的话,那么这里将是你理想的学习园地。在我的博客几乎涵盖了你想学习的许多方面。在这里,我来讲述一下作为一个菜鸟该如何阅读我的这些博客文章。我们可以按照如下的步骤来学习:1)Elasticsearch简介:对Elasticsearch做了一个简单的介绍2)Elasticsearch中的一些重要概念:cluster,n..........................................................

Elastic 中国社区官方博客 17万+

Elastic:培训视频 - ​在生产环境中配置 Fleet Server 和 Elastic Agent 之间的安全

在这篇文章中,我将会把我写的有些内容录制成视频,供大家参考。希望对大家有所帮助。优酷的视频频道地址在这里。Elastic 简介及Elastic Stack 安装:优酷,腾讯 Elastic Stack docker 部署:优酷,腾讯 Elasticsearch中的一些重要概念(Cluster/Shards/Replica/Document/Type/Index):优酷,腾讯 开始使用El...............

Elastic 中国社区官方博客 1万+

Elasticsearch 简介

Elasticsearch是一个非常强大的搜索引擎。它目前被广泛地使用于各个IT公司。Elasticsearch是由Elastic公司创建并开源维护的。它的开源代码位于https://github.com/elastic/elasticsearch。同时,Elastic公司也拥有Logstash及Kibana开源项目。这个三个开源项目组合在一起,就形成了 ELK软件栈。他们三个共同形成了一个强大的...

Elastic 中国社区官方博客 17万+

Kibana 中的人工智能连接器:你的 agent 可调用的 90 多个数据源

Elastic推出Kibana内置的90+人工智能连接器,支持Slack、GitHub、Confluence、PagerDuty等平台,让agent在推理中自动调用外部数据源,无需编写集成代码。通过身份验证中继服务,agent可安全访问个人或组织数据,快速关联告警与背景信息(如变更记录、讨论串、文档),显著缩短故障排查时间。结合ElasticCloud Trial,用户可即刻体验完整功能。

Elastic 中国社区官方博客 224

更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描

Elasticsearch 现在在成本模型中将文档位数的权重提高至原来的三倍,因此 DiskBBQ 会先尝试预处理和更深层的重排序,再增加一个比特,使量化向量在保持相同召回率的同时维持较小的体积。

Elastic 中国社区官方博客 275

对 OpenTelemetry Kafka 接收器的两项改动,避免一个缓慢的租户拖住其他租户

Elastic通过两项改进解决OpenTelemetry Kafka接收器中的“吵闹邻居”问题:一是为每个Kafka分区引入独立工作单元,实现租户间分区隔离;二是添加租户限流处理器,动态限制各租户在共享发送队列中的槽位占用,防止慢租户阻塞其他租户。结合max_in_flight配置提升单分区吞吐量与内存控制,确保记录不丢失、投递至少一次,同时保障多租户环境下稳定高效的数据处理。

Elastic 中国社区官方博客 335

三次模型调用,占据 92% 的等待时间:使用 OpenTelemetry 实现人工智能 agent 可观测性

使用OpenTelemetry追踪LangChain购物助手,发现92%耗时源于三次模型调用。虽将比较模型替换为更便宜的版本后,成本降低76%-83%,但四成问题响应变慢。通过追踪数据定位瓶颈,结合ES|QL分析词元用量与费用,验证了成本优化但延迟未改善。借助Elastic AI Agent建议,进一步测试return_direct=True以跳过冗余调用,实现性能与成本双赢。可观测性助力精准决策,确保答案正确、响应高效。

Elastic 中国社区官方博客 379

Elasticsearch:稠密向量字段类型

dense_vector字段用于存储稠密向量,支持k近邻搜索(kNN),默认启用索引并使用余弦相似度。可接受浮点数数组或Base64编码字符串输入,支持自动量化(如int8、int4、bbq)以降低内存占用。通过index_options配置索引类型(如hnsw、bbq_disk),并可启用过采样与重新评分提升精度。向量默认不存储于_source中以节省空间,可通过fields或_source.exclude_vectors显式返回。支持bit向量及GPU加速索引,适用于高维向量场景。

Elastic 中国社区官方博客 288

使用 Qoder 将 CSV 文件导入 Elasticsearch

本文演示如何通过Qoder智能助手,仅用4轮对话,将IMDB电影数据CSV文件(10,178条)高效导入Elasticsearch。无需编写代码,Qoder自动完成依赖安装、连接配置、字段类型推断(text/keyword/double)、数据验证及导入,支持自定义映射与数据转换,耗时约30秒,显著简化数据导入流程。

Elastic 中国社区官方博客 245

两条规则,一次故障,一条告警:变点检测如何减少告警噪声

Elastic Carlos Crespo揭示了基于ES|QL规则的AI agent如何通过重运行查询验证告警真实性,实现从日志变化到重大事件告警的自动化。系统先通过变点检测识别规则行为突变,再由发现agent核实故障存在性、规模与影响范围,并合并同类信号以减少噪声。每条告警均附带可追溯的查询证据,确保结论可验证。最终生成的告警包含严重程度、置信度、受影响拓扑及量化指标,支持运维决策。该流程结合代码与模型分工,保障可靠性与可解释性,已在多场景测试中验证有效性。

Elastic 中国社区官方博客 332

把词向量“贴”在地球仪上:用球面视角看 Embedding 的真实几何

本文通过将归一化词向量投影至3D球面,利用slerp绘制大圆弧,以真实反映余弦相似度对应的测地线距离。相比传统PCA平面散点图,球面可视化避免几何扭曲,直观呈现词间语义关系。结合Plotly实现交互式“词语地球仪”,可旋转观察聚类、跨语言对齐(如“cat”与“猫”),并对比高维真值与降维后距离的失真。代码简洁(<200行),支持模型替换与扩展,揭示“向量相近”在球面上的真实形态。

Elastic 中国社区官方博客 260

我们的 agent 技能如何调研、构建和测试完整的 Elastic 集成

作者:来自 Elastic我们让 agent 技能处理美国国家标准与技术研究院的国家漏洞数据库接口,得到了两个数据流和一个经过验证的通用表达式语言程序,并通过了流水线测试和系统测试。调研发现,一天中 78% 的通用漏洞与披露记录都是旧记录的重新发布,这一发现改变了设计。Elasticsearch 原生集成了业界领先的生成式人工智能工具和服务提供商。欢迎观看我们的网络研讨会,了解如何,或使用构建可用于生产环境的应用。要为你的使用场景构建最佳搜索解决方案,立即开始,或在你的上试用 Elastic。

Elastic 中国社区官方博客 130

基于 Elasticsearch 与 Jina AI 的全模态智能搜索实践:技术全解析

是一个结构清晰、覆盖全面且极具实操价值的开源项目。它不仅展示了Jina AI 多模态模型在非结构化数据表征上的强悍性能,也展现了在混合检索(BM25 + k-NN + RRF)以及多模态 RAG 架构上的工程实践。无论是准备构建企业级智能知识库、多媒体图库检索系统,还是探索音视频多模态推荐,该项目都提供了非常优秀的代码模版与架构参考。

Elastic 中国社区官方博客 208

你的日志早已写好告警:在 Elasticsearch 中生成 ES|QL 检测查询

Elastic Observability Labs展示如何基于OpenTelemetry日志自动生成精准的ES|QL检测查询。通过30个知识指标(27个推断、3个计算),生成10条查询,其中4条转化为Kibana告警规则。查询严格遵循三条提示词规则:精确匹配短语、不依赖log.level、仅在同文档中组合谓词。正常运行时匹配0条,故障期间捕获676条支付服务异常日志。查询随依赖知识失效自动停用,确保持续有效性。

Elastic 中国社区官方博客 685

基于 Jina OCR v1 与 Elasticsearch 的 PDF 智能混合检索与 RAG 系统实战指南

本文介绍开源项目jina-ocr-v1-pdf,基于JinaOCRv1高精度视觉解析与Elasticsearch的混合检索(RRF),构建端到端PDF智能问答系统。通过PyMuPDF渲染高清图像、并发OCR提取结构化文本(Markdown/HTML),结合自动切片向量化与BM25+语义检索融合,实现精准页码定位与上下文相关性提升。配合Streamlit前端与Kibana监控,支持企业级文档智能处理,有效解决扫描件、多栏、表格等复杂排版难题,为RAG应用提供高效、可扩展的技术范本。

Elastic 中国社区官方博客 555

Elastic Cloud 无服务器服务审计日志:将审计记录发送到可观测性或安全解决方案

ElasticCloud无服务器服务推出审计日志投递功能,支持将Elasticsearch与Kibana的活动日志(如索引变更、登录行为、数据访问)自动投递至同一组织内的可观测性或安全项目。附带8条告警规则和7个仪表板,涵盖凭据攻击检测、对象取证、数据访问追踪等场景。通过忽略筛选条件可降低存储成本,实现按需保留关键证据。支持跨项目日志聚合,助力安全与合规团队高效调查。立即免费试用14天,体验AI驱动的搜索与智能监控。

Elastic 中国社区官方博客 181

Elastic 在《Forrester Wave™:2026 年第四季度智能运维平台》报告中被评为强劲表现者

Elastic在《ForresterWave®:2026年第四季度智能运维平台》中被评为强劲表现者,获五项最高评分,涵盖算法可信度、可观测性即代码、AI技术栈、数据主权与定价透明度。其人工智能站点可靠性工程师以透明推理、完整上下文、持续学习和开放标准为核心,实现可验证排查、高效存储与跨环境兼容,助力团队信任AI、提升响应效率,推动智能运维迈向可验证、可进化的新阶段。

Elastic 中国社区官方博客 193

使用 OpenTelemetry 在 Elastic 中实现 Claude 平台的人工智能 agent 可观测性

Elastic与Claude平台集成,通过OpenTelemetry将AI agent追踪数据实时发送至Elastic,实现无代码观测。用户可在Kibana中查看模型请求、工具调用及上下文协议的完整交互轮次,包含耗时、词元计数与对话内容。支持服务清单、告警规则与SLO设置,结合SDK可实现跨服务追踪。免费云试用已开放,快速接入即可全面掌握Claude agent性能与成本。

Elastic 中国社区官方博客 893

三个区域、三个 Kibana、一个视图:跨集群搜索登陆 Elastic 合成监测

Elastic 9.5推出合成监测跨集群搜索功能,实现多集群监测器统一视图。无需复制数据,中央Kibana可实时查询远程集群的探测结果,展示状态、用户旅程、截图与证书,支持按远程集群筛选与分组。配置仍保留在原集群,仅提供只读访问,管理需返回源Kibana。适用于有状态部署,暂不支持无服务器服务。告警跨集群功能正在开发中。

Elastic 中国社区官方博客 384

Elastic 重大事件功能如何将 100 条日志样本转化为检测规则

本文介绍Elastic重大事件功能如何通过智能日志采样,从100份样本中提取27个知识指标(如服务、依赖关系、技术等),构建有证据支撑的日志源描述,进而生成精准检测规则。相比均匀采样易遗漏罕见故障信息,该系统采用三路分层采样(按实体筛选、多样性、随机)确保覆盖长尾模式,并通过循环迭代与去重机制提升准确性。知识指标可审核、手动保留或排除,支持持续接入。第二部分将基于这些指标生成可执行的查询,实现从“看到”到“检测”的跨越。

Elastic 中国社区官方博客 301

给海量查询“减负”:列式查询改写如何让检索更“省力”

Elasticsearch 9.5.0推出的列式查询改写技术,实现“零改造、高兼容、高精准”的查询优化。通过按需读取字段、谓词下推与嵌套扁平化,显著降低冗余读取与解码开销。基于1.8亿条日志的实测验证:16个用例命中数完全一致,核心时延持平,边界场景稳定,DSL语法兼容。系统自动降级兜底,确保功能可用。该技术特别适用于日志检索等海量数据场景,为集群性能提升提供开箱即用的底层支撑。

Elastic 中国社区官方博客 637

Elastic 如何帮助奥迪 Revolut F1® 车队在工程软件中找到关键信息

Elastic与奥迪RevolutF1®车队达成多年合作,将作为2026年美国大奖赛官方赛事合作伙伴,并自2027年起成为其官方搜索与可观测性供应商。通过Elastic技术栈(Logstash、Elasticsearch、Kibana),车队实现跨系统日志与遥测数据的统一视图,助力工程师在毫秒级内快速排查问题,提升软件可靠性。该合作不仅强化工程效率,更推动AI辅助诊断与决策支持,为赛车性能持续优化提供技术支撑。

Elastic 中国社区官方博客 218

5 分钟内将 56 页扫描文档转化为带引用的答案:面向搜索无法读取的文档的检索增强生成流水线

通过Elasticsearch与jina-ocr-v1结合,可将扫描版PDF(如56页植物指南)快速转化为可检索、可引用的知识库。该流程利用单一模型完成文档解析,输出结构化Markdown,再由Elasticsearch自动分块并生成嵌入向量,支持混合检索(关键词+语义)。用户以自然语言提问,系统返回带页码引用的答案及推荐商品,全程在统一平台内完成,无需自建流水线。

Elastic 中国社区官方博客 499

我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic

Elastic团队历时三年,将OpenTelemetry Java Agent从内联字节码插桩迁移至基于invokedynamic的类加载器隔离模式,支持100+插桩模块,提升可维护性与调试能力。相比此前三人团队的迁移,此次协作规模扩大,通过渐进式发布、运行时开关与自动化工具确保生产稳定。新架构实现插桩代码独立加载、兼容Java平台模块系统,并解决旧版本字节码兼容性问题。2026年7月,相关任务正式关闭,标志着迁移完成。

Elastic 中国社区官方博客 327

将 Elastic 引入 Claude:原因、方法与注意事项

Elastic发布Claude插件,将自身AI能力融入开发者工作流。从提交到上线仅用三周,但过程充满挑战:需绕过权限限制、调整版本管理策略(改用stable分支)、应对审核警告(如凭据提示、图标缺失等),且上线后无通知。插件首发于社区目录,需额外验证才能进入官方市场。作者强调,技术之外,与Anthropic团队的人际沟通是关键。经验表明,文档未覆盖的细节常需实战互动解决。欢迎开发者共享经验,共同推动生态发展。

Elastic 中国社区官方博客 117

告别繁琐控制台:Kabanos 如何将 MongoDB Compass 的易用性带入 Elasticsearch

Kabanos是一款专为macOS设计的本地优先桌面客户端,整合Elasticsearch与OpenSearch集群管理痛点。它结合MongoDB Compass式树状浏览与Kibana DevTools高效控制台,支持凭据安全加密、生产环境二次确认、只读模式及沙盒化架构,保障操作安全。内置查询库、自动化Routines与DryRun模式,提升运维效率。基于Electron与Zod校验,实现渲染层与网络请求隔离。快速上手:克隆仓库,启动Docker测试集群,运行pnpm dev即可使用。开源项目欢迎贡献,推

Elastic 中国社区官方博客 392
上一篇: 加速你的故障排查:使用 Elasticsearch 构建家电手册的 RAG 应用
下一篇: 什么是 AI(人工智能)?
Elastic 中国社区官方博客
Elastic 中国社区官方博客 企业官方账号 企业官方账号 领域专家: 大数据技术领域 领域专家: 大数据技术领域
博客等级 码龄12年 5万+粉丝 3111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值