Construcción de un agente de mercado vertical
Un agente conversacional que supera a un modelo general en una industria y una zona metropolitana, porque lleva un resumen precomputado de datos reales y puede obtener registros en vivo mientras conversa. Terminado = en vivo en una URL, respondiendo con cifras que se remontan al sustrato, negándose a inventar las que no tiene, y verificado en producción con pruebas reales (no una prueba local).
Paso 0: dos preguntas que responde el propietario
- ¿Qué zona metropolitana, y por qué esa? Elija donde ya tenga trabajo de campo o datos que sean literalmente ciertos allí. Mine una zona metropolitana, luego anuncie allí.
- ¿Se anunciará, y está enlazado? Cuatro decisiones de ingeniería dependen de esto (píxel, TTL de caché, URLs personalizadas, atribución). Ver Paso 7.
Paso 1: encuentre el foso antes de escribir código
Dos tipos: un corpus que minó y posee (ej. decenas de miles de reseñas), o una unión (un feed de ventas en vivo contra registros catastrales, de valoración y fiscales: dos fuentes gratuitas que nadie se molesta en combinar). La enumeración masiva paga a menudo falla (créditos agotados, búsqueda de propietario ausente).
Cuando la enumeración masiva está amurallada, el punto de entrada es la restricción, no los datos. Una aplicación del condado que responde para cualquier dirección pero no lista ninguna está bien si enumera direcciones en otro lugar (Paso 3).
Los estados sin divulgación son una oportunidad: nadie tiene comparables de venta, incluidos los competidores, por lo que la propia aritmética del condado, bien organizada, se convierte en el mejor ancla.
Paso 2: construya el sustrato
Un resumen JSON congelado inyectado del lado del servidor en el prompt del sistema en cada mensaje.
- Verifique primero el tamaño del panel en un agente de corpus de reseñas. "Dónde se ubica entre lugares como el suyo" necesita ~50+ negocios con 50+ reseñas cada uno. Por debajo de eso, no envíe una clasificación.
- Un perfil sectorial escrito por un modelo no es sustrato. Cargar prosa que un modelo escribió le dice al modelo lo que ya sabe y crea un foso nulo. El sustrato es medido.
- Los datos faltantes son un backlog, no un bloqueador: si posee los medios para minar un panel, mínelo.
- Verifique la licencia antes de minar. Los datos de algunas fuentes no pueden redistribuirse, lo que decide si un panel minado puede ser alguna vez una descarga.
- Cada bloque lleva un
_interpretation: 2-4 oraciones sobre lo que significa y cómo lo usa un profesional. El mayor valor por byte; es la diferencia entre recitar y razonar. - Salida byte-estable:
sort_keys=True, ordenaciones totales con desempates en un campo único, sin marca de tiempo exceptogenerated_on. Un byte variable vuelve a facturar el prefijo en caché en cada mensaje. - Superponga capas, y deje que las capas mejores reemplacen a las anteriores; dos bloques que dan números diferentes para una misma pregunta hacen que el modelo arbitre a medio camino de la respuesta. Reemplace a nivel de sub-clave cuando un bloque está mezclado.
- Archive completo, envíe compacto (gemelos
.compact.json), recurriendo al archivo si falta un gemelo. - Elimine correos electrónicos personales de la investigación combinada: a escala publicitaria, el modelo convierte la bandeja de entrada de un funcionario público en su canal de salida. Departamento + teléfono dice lo mismo.
Paso 3: enumere lo que los registros no pueden
Un feed de listados delgado casi no ve nada. Busque "cerca de" en una cuadrícula de círculos pequeños, luego una cada resultado con el registro del condado (una ejecución: 307 complejos -> 208 parcelas coincidentes -> 9,736 unidades).
- Círculos pequeños (~3.5 km en una cuadrícula de ~3.9 km): la API limita los resultados por llamada, por lo que una consulta para toda la zona metropolitana devuelve silenciosamente solo los lugares más conocidos.
- Deje que el registro público decida qué es algo, no la fuente de la que lo enumeró (un "apartamento" de un directorio que el condado registra como un centro de cuidado; un lote de autos usados etiquetado como multifamiliar).
- En un mercado donde no se lista nada, las personas con las que vale la pena hablar son las que no están vendiendo.
Paso 4: las trampas de datos (lea dos veces)
Cada error aquí produjo un número plausiblemente incorrecto, nunca un error. Presupueste tiempo de QA contra un fixture conocido como correcto.
- Vuelva a consultar la fuente antes de planificar basándose en su descripción. Un nombre de capa en un documento es una hipótesis. Lea los metadatos del servicio (para ArcGIS
?f=json,editingInfo.dataLastEditDate) y los valores de campo reales antes de confiar en un nombre de campo. - Verifique contra algo que sepa. Un edificio que se sabe que tiene 36 unidades se analizó como 10: un fixture detectó el peor error. Mejor aún, envíe una muestra de su salida a la propia API del editor en un marco de coordenadas diferente y compare.
- Vigile las inversiones, no solo los valores atípicos: propiedades pequeñas que valoran más por puerta que las grandes significa que el analizador está mal, no el mercado.
- Haga que los datos se verifiquen a sí mismos. Donde exista una verificación cruzada (pies cuadrados por unidad), calcule ambas lecturas de un campo ambiguo y deje que la banda plausible elija; si ninguna encaja, marque y excluya.
- Desduplique antes de agregar. Un feed que lista una propiedad bajo cada tipo de activo que tiene: 623 filas eran 206 propiedades.
- Almacene en caché CRUDO, nunca analizado, o una corrección del analizador significa volver a rastrear el servidor de un condado pequeño.
- Los formatos de dirección difieren del índice de registros. Abrevie las direcciones y elimine el sufijo; una escalera de variantes recuperó aproximadamente la mitad de los errores.
- Etiquete las muestras pequeñas con su n; a veces la delgadez es el hallazgo.
- En un corpus de reseñas, lea las COINCIDENCIAS, nunca la proporción. Ejecute cada expresión regular de taxonomía contra texto real de 1-3 estrellas y lea con qué coincidió. El verbo de servicio del sector es a menudo un verbo de daño: un patrón de "lesión" en
cortar (me|mi)coincidió con el 10.7% de las quejas de salones, en su mayoría "pagó $40 para cortarme mi propio pelo". Verifiquetaladrar(odontología),remolcar(grúas),despojar(detallado),romper(vidrio),afeitar/cortar(barberías, cuidado personal),pegar(flebotomía). Y un tema que nadie plantea permanece fuera. - El vocabulario del editor no es el del comprador. La clase "arterial" de un condado puede ser la red de autopistas, donde nada tiene fachada, mientras que las calles comerciales que un broker quiere decir son "colectoras". Liste el contenido de cada grupo antes de mapear, y nombre los campos por lo que contienen.
- Un esquema compartido comparte nombres de columna, no convenciones. En varios condados, un campo puede llevar cuatro sistemas de clasificación,
-9999vs0, un tercer valor de exención de vivienda. Cense cada campo por condado; trate un cero de un condado como un error de consulta hasta que se demuestre lo contrario; prefiera pruebas derivadas (valor del edificio = 0 y valor del terreno > 0 para vacancia). - Un nombre son varias cosas (una autopista y su vía de servicio comparten un nombre). Devuelva las alternativas y haga que el modelo diga cuál usó.
- Las cosas que "deberían" encontrarse una vez se encuentran muchas veces (dos carreteras que se cruzan en seis lugares). Promediar los puntos cae en un campo; agrupe, conserve cada ubicación, elija por una regla declarada.
- Un total derivado elimina silenciosamente filas que nunca calculó. Envíe el conteo de cobertura junto a cualquier total con entradas parciales, y haga que se lea como un piso.
Paso 5: las matemáticas deterministas van en una herramienta, nunca en el prompt
DSCR, IRR, efectivo sobre efectivo, dosis, impuestos: una herramienta, calculada, que devuelve sus suposiciones y advertencias. La aritmética de un modelo es plausiblemente incorrecta (un DSCR de 1.19 que en realidad es 1.09 va a un prestamista). Esto fuerza un bucle de agente real (stream -> ejecutar herramientas -> retroalimentar -> stream), incluyendo el manejo de pause_turn y max_tokens.
Paso 6: costo del prompt, medido
- Cuente los tokens con la API. Un JSON denso funciona a ~2.4 bytes/token, no ~4.
- Imponga un límite de bytes/token en una prueba: enviar el archivo en lugar del gemelo compacto no tiene síntoma excepto la factura.
- El TTL de caché sigue al tráfico. Escaso, compartido manualmente: el valor predeterminado de 5 minutos (una escritura de 1 hora es un recargo que nadie reutiliza). Tráfico pago continuo: 1 hora, porque los visitantes comparten el prefijo.
Paso 7: despliegue
- Derive la página de un generador; cada reemplazo afirma que su ancla existe, y las comprobaciones verifican ambas direcciones (el contenido eliminado se ha ido y la función sobrevivió).
- Si es un destino publicitario: URLs personalizadas como redirecciones temporales (las permanentes son almacenadas en caché por la plataforma publicitaria), verificando que la cadena de consulta sobreviva; un nombre de evento de píxel por campaña; TTL de caché de 1 hora; y atribución fijada en
sessionStorageen la visita de llegada y transportada en cada turno (nolocalStorage, o la visita orgánica de la próxima semana se acreditará al anuncio de hoy). - Verifique el estado del despliegue, no el registro de compilación; un límite de función serverless o un archivo no rastreado puede fallar detrás de un registro verde. Importe los archivos de datos estáticamente para que el empaquetador los incluya.
Reglas estrictas para el prompt
- Nunca invente un número. Sustrato, una llamada de herramienta realmente ejecutada, o una estimación marcada.
- Nunca presente un valor de registro público como un valor de mercado. Diga cuál está dando.
- Indique el límite de cobertura en la descripción de la herramienta Y en el prompt (qué condados). Una regla en un solo lugar se evita.
- Registro público uno a la vez, no como lista. La búsqueda del propietario de la propiedad preguntada está bien; los listados masivos de nombres y direcciones pueden violar las leyes estatales de registros abiertos sobre uso comercial.
- Vuelva a verificar lo que el prompt llama imposible. Una falsedad segura sobre lo que no se puede saber es peor que la brecha.
Agentes de investigación para capas de contexto
Dé a los agentes de investigación paralelos un presupuesto de tokens (y la proporción de 2.4 bytes/token), dígales que reduzcan la cifra en lugar de la advertencia, y espere que corrijan su trabajo anterior.
Paso 8: el final fuera del sector
Algunos visitantes no son su usuario (una tienda de segunda mano en un agente de restaurantes). El "No tengo eso" por defecto pierde la mejor señal que obtendrá: un propietario real que nombra el sector a construir a continuación.
- Una herramienta
flag_out_of_scope(sector): el cliente renderiza tres opciones tocables; una herramientasubmit_feature_requestarchiva el toque. - Todo en la primera respuesta: la profundidad media de sesión es un turno.
- No inventarie lo que el agente lleva en su lugar (un corte redujo una respuesta de 1,275 a 124 caracteres).
- Las opciones son renderizadas por el cliente, nunca una lista numerada en prosa (un "2" desnudo puede activar la habilidad 2).
- Dígale al modelo dónde se renderizan las opciones; no puede ver al cliente.
- Mapee las opciones a capacidades universales para que una solicitud archivada nombre una capacidad para un sector.
Paso 9: la capa espacial ("qué hay al lado")
- Encuentre la organización ArcGIS Online del condado, no su host GIS bloqueado por WAF; los servicios alojados a menudo sirven de forma anónima. Solicite la geometría en la referencia espacial nativa de la capa.
- Cuando dos fuentes se encuentren, solicite la segunda en el marco de la primera (
outSR), y afirme que las extensiones se superponen antes de emitir filas: un desajuste de marco no intersecta nada e informa "cada parcela sin zonificar". En DuckDB,ST_Transformnecesitaalways_xy := trueo devuelvePOINT(inf inf)silenciosamente. - Zonificación por centroide; la zonificación dividida necesita un umbral de participación (>5% del lote), comparando distritos no polígonos. Una intersección simple llamó al 37% de las parcelas divididas; el umbral dio aproximadamente el 4%.
- Los códigos de zonificación de una ciudad son de esa ciudad. El mismo código significa distritos diferentes al lado; envíe la ciudad y el nombre publicado con cada código.
- Precalcule fuera de línea, envíe un índice libre de geometría, no agregue ninguna ruta API: GIS del condado -> espejo espacial DuckDB -> un índice JSON comprometido; el tiempo de ejecución solo realiza búsquedas y haversine. Una dependencia espacial fallida degrada a una lista de vecinos vacía, una respuesta incorrecta segura. Valide el índice al cargar y lanze una excepción.
- Una desigualdad en cualquier lugar de una unión espacial degrada el predicado espacial a un post-filtro (
ON a.id < b.id AND ST_Intersects(...)probó ~29 mil millones de pares). Deje que el predicado esté solo,EXPLAINparaSPATIAL_JOIN, emita claves, luego desduplique: 7 minutos sin terminar se convirtieron en 19 segundos. - Limite el índice enviado a lo que el comprador transacciona más los vecinos inmediatos, y marque las parcelas de "contexto" que llevan menos datos.