如何用Hermes+Milvus搭建GEOPipeline提升AI引用率
type
status
date
slug
summary
tags
category
icon
password
网址
随着 ChatGPT Search、Claude、Perplexity 等生成式搜索引擎的普及,传统的搜索引擎优化(SEO)正在快速向生成式引擎优化(GEO,Generative Engine Optimization)演变。在 AI 时代,用户不再满足于点击蓝色的网页链接,而是习惯于直接阅读 AI 整合后的回答。因此,如何让你的产品、品牌或技术文档被大模型高频引用,成为了企业内容运营的新挑战。
单纯依靠手动撰写提示词(Prompt)很难解决内容质量与企业知识库脱节的问题。为了提升产品的 AI 引用率,我们需要构建一套系统化的 GEO Pipeline。本文将详细介绍如何结合 Hermes Agent 编排架构与 Milvus 向量数据库,并利用高效的大模型API直连服务,搭建起一套能够不断自我进化的 GEO 内容流水线。
为什么传统的 SEO 优化在 AI 时代失效了?
在传统的 SEO 时代,我们主要关注关键词密度、页面加载速度和外部链接。但在 AI 搜索时代,大模型通过检索增强生成(RAG)技术,从海量网页中抓取信息并进行语义提炼。
AI 搜索引擎在决定引用哪些内容时,主要考量以下三点:
- 语义相关性:内容是否精准回答了用户长尾且复杂的提问。
- 信息密度与权威性:内容是否包含独特的企业一手数据、技术细节或行业 Know-how。
- 结构化呈现:内容是否易于被大模型的检索器(Retriever)解析和定位。
因此,GEO 的核心在于:将企业的“静默知识”(产品文档、客户案例、FAQ 等)转化为大模型最容易检索和理解的“活性记忆”,并通过 Agent 协同机制源源不断地输出高质量、高引用率的结构化内容。
Hermes Agent 架构:多 Agent 协同的 GEO 生产线
为了实现 GEO 流程的自动化与智能化,我们推荐采用 Hermes 风格的 Agent 编排架构。在该架构中,Orchestrator(编排器)负责全局调度,将整个内容生产与监控流程拆解为四个核心 Agent:
- Research Agent(研究代理):负责分析用户的搜索意图,从企业记忆库中检索相关知识,并找出目前市面上生成式回答中的内容缺口(GEO Gaps)。
- Brief Agent(大纲代理):将 Research Agent 收集到的原始素材和缺口分析,提炼为一份结构清晰、目标明确的可执行内容大纲(Content Brief)。
- Content Agent(内容创作代理):调用 gpt API 或 Claude API,根据大纲与品牌调性,撰写出符合 GEO 规范的结构化技术文章或解答。
- Monitor Agent(监控反馈代理):追踪发布后的内容在各大 AI 搜索中的引用情况,并将表现数据和反馈重新写入记忆库,形成数据闭环。
在这个过程中,所有 Agent 都围绕着一个统一的“企业记忆层”进行读写,而这个记忆层正是由 Milvus 向量数据库来承载的。
Milvus 向量数据库:构建企业的“黄金记忆层”
在多 Agent 协同的系统中,最忌讳的是各个 Agent 之间信息孤岛化。Milvus 作为高性能的开源向量数据库,在 Hermes GEO Pipeline 中扮演了“企业共享记忆体”的角色。
无论是产品说明书、技术博客,还是历史的 GEO 监控表现数据,都会通过 Embedding 模型转化为高维向量并存储在 Milvus 中。当 Content Agent 需要调用 Claude API 写作,或者 Research Agent 分析意图时,都可以通过语义检索,在毫秒级内从 Milvus 中提取出最相关的上下文。这种设计不仅保证了生成内容的一致性,还极大地节省了 API 的上下文窗口 Token 消耗。
动手实战:基于 Python 与大模型 API 搭建 GEO Pipeline
接下来,我们将使用 Python、Milvus Lite 以及大模型 API,手把手教你搭建一个最小可运行的 Hermes GEO Pipeline。
1. 准备工作与环境配置
首先,我们需要安装 PyMilvus 和 OpenAI 的 SDK。
在配置 API 密钥时,考虑到国内的网络环境与账号限制,建议使用国内中转API服务(访问 https://api.aigc.bar 获取稳定、高性价比的低价API服务)。通过该服务,你可以实现大模型API直连,轻松调用包括 gpt API、Claude API 和 gemini API 在内的多种主流模型。
在终端中配置环境变量:
2. 构建向量存储与检索模块
我们首先封装一个
OpenAIEmbedder 类用于生成向量,并使用 MemoryStore 类来管理 Milvus 中的企业记忆。`python
import os
import hashlib
from pathlib import Path
from typing import Iterable
from openai import OpenAI
from pymilvus import MilvusClientCOLLECTION = "hermesgeomemory"
DIM = int(os.getenv("OPENAIEMBEDDIM", "512"))
def stable_id(text: str) -> int:
return int(hashlib.md5(text.encode("utf-8")).hexdigest()[:12], 16)
class OpenAIEmbedder:
def _init_(self):
这里的 client 会自动读取环境变量中的 API Key 和 Base URL
self.client = OpenAI()
self.model = os.getenv("OPENAIEMBEDMODEL", "text-embedding-3-small")
def embed(self, texts: list[str]) -> list[list[float]]:
response = self.client.embeddings.create(
model=self.model,
input=texts,
dimensions=DIM,
)
return [item.embedding for item in response.data]
class MemoryStore:
def _init_(self, uri: str, embedder: OpenAIEmbedder):
self.client = MilvusClient(uri)
self.embedder = embedder
def reset(self) -> None:
if self.client.has_collection(COLLECTION):
self.client.drop_collection(COLLECTION)
self.client.create_collection(
collection_name=COLLECTION,
dimension=DIM,
metric_type="COSINE",
)
def add(self, chunks: Iterable[dict]) -> None:
chunks = list(chunks)
vectors = self.embedder.embed([chunk["text"] for chunk in chunks])
rows = []
for chunk, vector in zip(chunks, vectors):
rows.append({
"id": stable_id(chunk["text"]),
"vector": vector,
**chunk,
})
if rows:
self.client.insert(collection_name=COLLECTION, data=rows)
def search(self, query: str, sources: list[str] = None, limit: int = 5) -> list[dict]:
expr = f"source in {sources}" if sources else None
query_vector = self.embedder.embed([query])[0]
results = self.client.search(
collection_name=COLLECTION,
data=[query_vector],
limit=limit,
filter=expr,
output_fields=["text", "source", "topic"],
)
return [hit["entity"] for hit in results[0]]
`3. 实现 Agent 编排与内容生成
现在,我们通过 Orchestrator 将 Research Agent、Brief Agent 和 Content Agent 串联起来。
`python定义 Agent 职责与企业基本信息
COMPANY_BRAIN = {
"brand": "Milvus",
"audience": "AI 开发者与平台架构师",
"product": "适用于 AI 应用的开源向量数据库",
"voice": "技术性、实用性、基于事实的",
}
def research_agent(topic: str, memory: MemoryStore) -> dict:
检索与主题相关的企业记忆
search_query = f"关于 {topic} 的技术定义、应用场景和比较优势"
memories = memory.search(search_query, limit=3)
分析 GEO 缺口(此处为简化逻辑,实际可调用大模型进行分析)
def briefagent(researchdata: dict) -> str:
context = "\n".join([f"- [{item['source']}] {item['text']}" for item in research_data["memories"]])
gaps = "\n".join([f"- {gap}" for gap in research_data["gaps"]])
brief = f"""
主题: {research_data['topic']}
受众: {COMPANY_BRAIN['audience']}
调性: {COMPANY_BRAIN['voice']}
企业参考知识:
{context}
需要填补的 GEO 缺口:
{gaps}
"""
return brief
def content_agent(brief: str) -> str:
client = OpenAI()
prompt = f"""
请根据以下 GEO Brief,写一篇结构化的中文技术段落。
要求:直接切入主题,自然融入企业产品 Milvus 的优势,避免生硬广告,适合被 AI 搜索引用。
GEO Brief:
{brief}
"""
response = client.chat.completions.create(
model=os.getenv("OPENAILLMMODEL", "gpt-4o-mini"),
messages=[
{"role": "system", "content": "你是一位资深的 AI 技术作家。"},
{"role": "user", "content": prompt}
],
temperature=0.3
)
return response.choices[0].message.content
`通过这套流水线,只要输入一个主题,系统就会自动去 Milvus 中寻找最权威的企业内部资料,整理出大纲,并调用大模型API直连服务生成一篇高度契合 GEO 优化标准的内容。
如何通过反馈循环(Monitor)实现内容自进化
GEO 并不是一次性的工作,而是一个持续优化的闭环。Monitor Agent 在这套 Pipeline 中起到了“进化加速器”的作用。
当我们的内容发布后,Monitor Agent 可以通过调用搜索引擎接口或手动录入,监测该内容在 ChatGPT Search 或 Claude 中的表现:
- 该内容是否被 AI 引用?
- AI 引用时的锚文本(Anchor Text)是什么?
- 用户是通过什么关键词问出这个问题并触发引用的?
收集到这些数据后,我们会将其打上
content_type: performance_feedback 的标签,并重新写入 Milvus 向量数据库。在下一次 Research Agent 运行检索时,这些高引用率的反馈数据就会被优先检索出来,指导 Content Agent 复制成功的写作模式,避开未被引用的雷区。总结与展望
在 AI 驱动搜索的变革时代,GEO 已经成为企业获取流量和曝光的必争之地。通过将 Hermes Agent 编排模式与 Milvus 向量数据库相结合,企业可以构建起一套标准化的“知识检索-大纲提炼-内容生成-反馈写入”的 GEO 闭环流水线。
要让这套 Pipeline 稳定、高效地运转,底层大模型 API 的调用质量至关重要。无论是进行文本向量化的 Embedding,还是驱动 Agent 思考的 gpt API 与 Claude API,都需要极高的响应速度与稳定性。如果您在搭建过程中遇到网络限制或预算限制,推荐使用 https://api.aigc.bar 提供的国内中转API服务,以超低的价格享受高可用的大模型API直连体验,助力您的 AI 应用快速落地。
Loading...
.png?table=collection&id=cbe6506e-1263-8358-a4d7-07ce62fcbb3f&t=cbe6506e-1263-8358-a4d7-07ce62fcbb3f)