微信扫码
添加专属顾问
我要投稿
用Python+Milvus+Langchain构建智能问答系统,突破传统搜索局限,实现精准上下文理解与回答。核心内容: 1. 技术栈解析:FastAPI、Milvus、Llama-2等核心组件协同工作 2. 微服务架构设计:从数据索引到检索的完整流程剖析 3. 多索引器扩展方案:支持Milvus和Elasticsearch等不同数据库
etcd: 分布式键值存储,用于Milvus集群元数据管理
minio: 对象存储服务,存储向量数据和索引文件
milvus-standalone: 向量数据库主服务
attu: Milvus的Web管理界面
网站URL → 网页抓取 → HTML解析 → 文本分割 → 向量化 → 存储到Milvus
用户查询 → 向量化 → 相似性搜索 → 知识库检索 → LLM生成答案
fmt = "\n=== {:30} ===\n"
search_latency_fmt = "search latency = {:.4f}s"
num_entities, dim = 8, 8
milvus_collection_name = "ai_answer"
class SearchEngine:
def __init__(self):
connections.connect("default", host="localhost", port="19530")
has = utility.has_collection(milvus_collection_name)
print(f"Does collection milvus_collection_name exist in Milvus: {has}")
milvus_client = Collection(milvus_collection_name)
self.milvus_client = milvus_client
self.milvus_collection_name = milvus_collection_name
openai.api_key = os.environ["OPENAI_API_KEY"]
def query_milvus(self, embedding):
result = self.milvus_client.search([embedding], "vector",
{"metric_type": "L2", "offset": 1}, 1,
None, None, ["id", "vector", "path", "text"])
list_of_knowledge_base = list(map(lambda match: match.entity.text, result[0]))
return {
'list_of_knowledge_base': list_of_knowledge_base,
}
def query_vector_db(self, embedding):
return self.query_milvus(embedding)
# indexer_by_milvus.py
def add_html_to_vectordb(self, content, path):
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = self.MODEL_CHUNK_SIZE, # 8192
chunk_overlap = math.floor(self.MODEL_CHUNK_SIZE/10) # 819
)
docs = text_splitter.create_documents([content])
for doc in docs:
embedding = create_embedding(doc.page_content)
self.insert_embedding(embedding, doc.page_content, path)
def insert_embedding(self, embedding, text, path):
try:
print(fmt.format("Start inserting entities"))
data = [
{"vector": np.array(embedding), "text": text, "path": path},
]
self.milvus_client.insert(data)
except Exception as e:
print("self.milvus_client.insert exception e: ", e)
os._exit(1)
# search_engine.py
def search(self, user_query):
print("user_query: ", user_query)
embedding = create_embedding(user_query)
result = self.query_vector_db(embedding)
knowledge_base = "\n".join(result['list_of_knowledge_base'])
response = self.ask_chatgpt(knowledge_base, user_query)
return {
'response': response
}
def ask_chatgpt(self, knowledge_base, user_query):
system_content = """你是一个专业的智能问答助手,请严格遵循以下规则:
1. 只能基于提供的知识库内容回答问题,不得使用知识库以外的信息;
2. 如果知识库中没有相关信息或无法找到准确答案,请明确告知用户"我无法在知识库中找到相关信息来回答这个问题";
3. 回答时要客观准确,不得编造或推测信息;
4. 尽量使用知识库中的原始表述,确保信息的准确性和权威性。
"""
user_content = f"""
Knowledge Base!
---
{knowledge_base}
---
User Query: {user_query}
Answer: {user_history_answer}
"""
system_message = {"role": "system", "content": system_content}
user_message = {"role": "user", "content": user_content}
chatgpt_response = create_llama2_13b(messages=[system_message, user_message])
return chatgpt_response["choices"][0]["message"]["content"]
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-06-15
当智能助手有了「专属记忆」:Amazon这项新技术让AI比你室友更懂你
2025-06-15
近期必读!Devin VS Anthropic 的多智能体构建方法论
2025-06-15
字节DeerFlow深度解析:下一代AI研究助理,还是又一个Agent框架?
2025-06-15
大模型安全:业务要上MCP,认证鉴权怎么搞?
2025-06-15
YC S25 拆解:给AI创业者和产品经理的终极指南
2025-06-15
要不要搞多智能体?Anthropic和Cognition干起来了……
2025-06-15
科普|一文看懂AI发展史:主要发展阶段与改变世界的突破性事件
2025-06-15
AI科普|理解那些看似高级的AI概念和热词(下)
2025-05-29
2025-03-20
2025-03-21
2025-04-11
2025-03-20
2025-03-19
2025-03-20
2025-03-19
2025-03-19
2025-03-19